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.Collapsed 而不是 Visibility.Hidden (否则仍将保留空间)

至于为什么你的 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 回答