総合 ゲーム 画像動画

WPF DataGridに動的に行と列を追加する方法

WPFのDataGridにコード側から行と列を指定した数だけ追加する方法を紹介します。

それと各セルを直接触る方法も紹介します。セル内データに合わせて装飾を変更するのに役立つと思います。

ファイル解析なども捗りますね。

 

 

ヘッダー追加

for (int i = 0; i < 3; ++i)
{
    var column = new DataGridTextColumn();
    column.Header = $"列{i}";
    column.Binding = new Binding($"[{i}]");
    dataGrid.Columns.Add(column);
}

バインド指定の仕方がポイントです。指定するデータオブジェクトが読み込める形にしましょう。

 

 

行追加(列数指定)

var dataList = new ObservableCollection<List<string>>();

for (int i = 0; i < 10; ++i)
{
    // 適当なデータ作成
    List<string> data = new List<string>();
    data.Add("1");
    data.Add("2");
    data.Add("3");
    
    dataList.Add(data);
}

dataGrid.ItemsSource = dataList;

今回はList<string>型で10行追加しています。

データの中身は列数分追加しましょう。今回は3列なので直接1,2,3の文字を追加していますが、ここは動的に変更できるように組みましょう。

 

 

各セルを触る方法

// 各セルごとに対する処理 内容に応じた装飾など
private void EditDataGrid(object sender, RoutedEventArgs e)
{
    // 行列数
    int rowCount = dataGrid.Items.Count;
    int columnCount = dataGrid.Columns.Count;

    for (int i = 0; i < rowCount; ++i)
    {
        // データグリッドの行オブジェクトを取得します。
        var row = dataGrid.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
        // 行オブジェクトが取得できない場合
        if (row == null)
        {
            // 画面に表示されていないセルはnullとなる
            continue;
        }
        
        for (int j = 0; j < columnCount; ++j)
        {
            // データグリッドのセルオブジェクトを取得します。
            DataGridCell cell = (DataGridCell)dataGrid.Columns[j].GetCellContent(row).Parent;
            // データグリッドのセルオブジェクトが取得できない場合
            if (cell != null)
            {
                // 画面に表示されていないセルはnullとなる ここから各セルに対する処理

                // セルの子オブジェクトを取得
                var cellObject = dataGrid.Columns[j].GetCellContent(row);
                TextBlock tb = cellObject as TextBlock;

                //Console.WriteLine(tb.Text);
                cell.Background = Brushes.Chartreuse;
            }
        }
    }
}

行と列を総当りで指定して触るだけです。この方法は画面に表示されているセルしか取得できません。

なのでスクロールイベントと組み合わせて使うのが良いです。

 

private void ScrollEvent()
{
    Decorator child = VisualTreeHelper.GetChild(this.dataGrid, 0) as Decorator;
    ScrollViewer sc = child.Child as ScrollViewer;
    sc.ScrollChanged += new ScrollChangedEventHandler(EditDataGrid);
}

ItemsSourceを指定した直後に追加すると良いでしょう。

 

Xamlとcsコードは上げておいたので最小構成で起動するのが分かりやすいと思います。

 

 (´ ・ω・`) コメント 0件
_(__つ/ ̄ ̄ ̄/
  \/   /
     ̄ ̄ ̄
 (´・ω・`)
_( つ ミ  バタンッ
  \ ̄ ̄ ̄\ミ
     ̄ ̄ ̄ ̄

コメントを残す。

メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。URLを含むコメントは承認待ちになります。