遍历Datagrid ItemSsource的列

时间:2012-07-19 07:03:16

标签: c# wpf

我有一个网格需要在数据绑定后立即隐藏某些列。到目前为止,这是我的代码:

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中的列?

2 个答案:

答案 0 :(得分:2)

哇,我觉得你在路上了。

Itemcontainer实际上是WPF DG中的Row,而不是列。

但你可以更容易地实现你想要的东西:

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之后隐藏列表

答案 1 :(得分: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;
        }
}