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-谢谢更新,如果你不忘升级投票并将其标记为对你有用的答案,我会的。我不在办公室,远离我的键盘。。。仍然是:(