我有一个网格需要在数据绑定后立即隐藏某些列。到目前为止,这是我的代码:
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中的列?
答案 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;
}
}