2

選択されているかどうかに関係なく、DataGrid内のすべてのセルの反復可能なコレクションを取得する方法はありますか?

4

3 に答える 3

3

sを意味するDataGridCell場合は、Vincent Sibalsヘルパー関数を使用して、すべての行DataGrid.Itemsと列を反復処理できますDataGrid.Columns

public DataGridCell GetCell(int row, int column)
{
    DataGridRow rowContainer = GetRow(row);

    if (rowContainer != null)
    {
        DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

        // try to get the cell but it may possibly be virtualized
        DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
        if (cell == null)
        {
            // now try to bring into view and retreive the cell
            DataGrid_Standard.ScrollIntoView(rowContainer, DataGrid_Standard.Columns[column]);
            cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
        }
        return cell;
    }
    return null;
}

public DataGridRow GetRow(int index)
{
    DataGridRow row = (DataGridRow)DataGrid_Standard.ItemContainerGenerator.ContainerFromIndex(index);
    if (row == null)
    {
        // may be virtualized, bring into view and try again
        DataGrid_Standard.ScrollIntoView(DataGrid_Standard.Items[index]);
        row = (DataGridRow)DataGrid_Standard.ItemContainerGenerator.ContainerFromIndex(index);
    }
    return row;
}

編集

gridがDataGridの場合、次のようなすべてのDataGridCellのリストを取得します。

List<DataGridCell> allCellList = new List<DataGridCell>();

for (int i = 0; i < grid.Items.Count; i++)
{
    for (int j = 0; j < grid.Columns.Count; j++)
    {
        allCellList.Add(grid.GetCell(i, j));
    }
}
于 2012-07-23T15:33:48.803 に答える
1

利便性(必ずしもパフォーマンスではない)のために、DataGridから単一のDataTableにデータ(すべての列と行のすべてのセルを含む)を入力できます。これは、反復、フィルタリング、並べ替えなどのデータの操作に役立つ関数を提供します。 。

// Populate a DataGrid to a DataTable
DataTable dt; 
DataView dv = (DataView) myDataGrid.DataSource;
dt = dv.Table.DataSet.Tables[0];

その後、1行のコードでジェネリックを使用して、特定の列のいずれかをコレクションまたはリストに変換できます。how-do-you-convert-a-datatable-into-a-generic-listを参照してください:

List<DataRow> myList = dt.Rows.Cast<DataRow>().ToList();

ループを書く必要がなくなります。

于 2012-07-24T00:30:07.717 に答える
1

行によってスローされたエラーを修正するには...

    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter> 
        (rowContainer);

このルーチンを追加します。

private T GetVisualChild<T>(DataGridRow rowContainer)
    {
        throw new NotImplementedException();
    }
于 2018-09-19T16:14:14.083 に答える