1

データがバインドされた直後に特定の列を非表示にする必要があるグリッドがあります。これまでの私のコードは次のとおりです。

private IEnumerable<DataGridColumn> GetDataGridColumns(DataGrid grid)
{
    var itemsSource = grid.ItemsSource as IEnumerable;

    if (null == itemsSource) yield return null;

    foreach (var item in itemsSource)
    {
        var column = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridColumn;
        if (null != column) yield return column;
    }
}

private void LoadData()
{
    GridMain.ItemsSource = (new VTAEEntities()).OrganizationInterfaces.ToList();

    foreach (DataGridColumn Column in GetDataGridColumns(GridMain))
    {
        // Hiding columns
        if (Column.Header as String != null) {
            String tempHeader = Column.Header as String;

            String[] unrequiredColumns = new String[] { 
                "Instances",
                "Interfaces",
                "Organizations",
                "RegisteredCallerOnly"
            };

            if (unrequiredColumns.Contains(tempHeader)) {
                Column.Visibility = System.Windows.Visibility.Hidden;
            }
        }

        // Read-only columns
        if (Column.Header as String != null)
        {
            String tempHeader = Column.Header as String;

            String[] unrequiredColumns = new String[] { 
                "InstanceId",
                "InterfaceId",
                "OrganizationId"
            };

            if (unrequiredColumns.Contains(tempHeader))
            {
                Column.IsReadOnly = true;
            }
        }
    }
}

すべての不要な列 + 読み取り専用にしたい列はすべてそこにあります。デバッグ時に、GridMain.Columns が常に 0 カウントであることがわかりました。ItemSource の列を反復処理するにはどうすればよいですか?

4

2 に答える 2

2

うわー、あなたはここで道を外れていると思います。

Itemcontainer は、実際には列ではなく、WPF DG の行です。

しかし、あなたが望むものをもっと簡単に達成することができます:

foreach (var Column in GridMain.Columns)
{
    // ...
}

また、あなたのケースでは Visibility.Hidden の代わりに Visibility.Collapsed を使用することをお勧めします (そうしないと、スペースはまだ確保されます)

Columns.Count = 0 の理由については、このコードを実際に実行したときに、DG がまだ WPF によってレンダリングされていないためだと思います。したがって、Datagrid の列をループする前に GridMain.UpdateLayout() をスローします。

それでも十分ではないかもしれません。この場合、次のコードを使用する必要があります。

UpdateLayout();
Action emptyDelegate = delegate() { };
Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, emptyDelegate);

(更新を強制するため)

それ以外の場合は、DG のイベント ハンドラーを使用してオンザフライで列を非表示にするかAutoGeneratingColumn、DG のLoadedイベントを使用して DG がレンダリングされた後に非表示にすることをお勧めします。

于 2012-07-19T07:14:42.660 に答える
1

利用できるよりも列を非表示にしたい場合

AutoGeneratingColumn

列を非表示にするために機能する可能性のある wpf グリッドのイベント。

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
      DataGridBoundColumn col = e.Column as DataGridBoundColumn;
     //set visiblity by doing the code you wnat ..i.logic to hide column
      if (col.Header.ToString().ToLower() == "id") 
        { 
            col.Visibility = System.Windows.Visibility.Hidden;
        }
}
于 2012-07-19T07:10:21.013 に答える