C# 遍历Datagrid的列';项目来源

C# 遍历Datagrid的列';项目来源,c#,wpf,C#,Wpf,我有一个网格,它需要在数据绑定后立即隐藏某些列。以下是我目前的代码: private IEnumerable<DataGridColumn> GetDataGridColumns(DataGrid grid) { var itemsSource = grid.ItemsSource as IEnumerable; if (null == itemsSource) yield return null; foreach (var item in itemsSo

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

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;
            }
        }
    }
}
private IEnumerable GetDataGridColumns(DataGrid网格)
{
var itemsSource=grid.itemsSource作为IEnumerable;
如果(null==itemsSource)产生返回null;
foreach(itemsSource中的var项)
{
var column=grid.ItemContainerGenerator.ContainerFromItem(item)作为DataGridColumn;
如果(null!=列)产生返回列;
}
}
私有void LoadData()
{
GridMain.ItemsSource=(新VTAEEntities()).OrganizationInterfaces.ToList();
foreach(GetDataGridColumns(GridMain)中的DataGridColumn列)
{
//隐藏列
if(列标题为字符串!=null){
字符串tempHeader=列。标题为字符串;
String[]unrequiredColumns=新字符串[]{
“实例”,
“接口”,
“组织”,
“注册CallerOnly”
};
if(unrequired columns.Contains(tempHeader)){
Column.Visibility=System.Windows.Visibility.Hidden;
}
}
//只读列
if(列标题为字符串!=null)
{
字符串tempHeader=列。标题为字符串;
String[]unrequiredColumns=新字符串[]{
“实例ID”,
“接口ID”,
“组织ID”
};
if(unrequired columns.Contains(tempHeader))
{
Column.IsReadOnly=true;
}
}
}
}

所有不需要的列+我想要只读的列都在那里。调试后,我意识到GridMain.Columns总是0 count。如何遍历ItemSource中的列?

如果要隐藏无法使用的列

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;
        }
}

哇,我想你在这里太离谱了

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
事件处理程序动态隐藏列,或者使用来自Windows桌面应用程序后台的DG的
Loaded
事件

呈现DG后进行隐藏。。。我发现自己在WPF上发抖。。。好建议。我将尝试返回结果。
AutoGeneratingColumn
event似乎是一种方法。我会试试看。@Hassanglzar-谢谢更新,如果你不忘升级投票并将其标记为对你有用的答案,我会的。我不在办公室,远离我的键盘。。。仍然是:(