如何将 WPF DataGrid header 视为选定的单元格?
How to treat WPF DataGrid header as selected cell?
我正在构建一个 WPF 应用程序,我希望我的 DataGrid 能够像 Excel 那样隐藏列。我有一个右键单击菜单,弹出 'hide column' 作为选项。这是它的工作原理:
if (dgfinal_Copy.CurrentCell.Column == null)
{
}
else
{
int columnIndex = dgfinal_Copy.CurrentCell.Column.DisplayIndex;
dgfinal_Copy.Columns[columnIndex].Visibility = Visibility.Collapsed;
}
我必须添加 if 语句,因为如果有人在单击网格之前单击 header,则当前单元格将为空。此外,如果我单击 [2] 列中的一个单元格,然后单击 [0] 的 header,然后从我的菜单中单击 'hide column',正如您可能已经猜到的那样,隐藏的是 [2] 并且不是 [0].
我想更改它以使用 header 的列索引(如果这是光标所在的位置),如果不是则使用当前单元格的列索引。
我正在添加我正在使用的完整方法,看看我是否忽略了一些简单的事情:
private void WorkItemsGrid_Hide(object sender, RoutedEventArgs e)
{
if (dgfinal_Copy.CurrentCell.Column == null)
{
}
else
{
int colIn = dgfinal_Copy.SelectedCells[0].Column.DisplayIndex;
System.Windows.MessageBox.Show(colIn.ToString());
int columnIndex = dgfinal_Copy.CurrentCell.Column.DisplayIndex;
dgfinal_Copy.Columns[columnIndex].Visibility = Visibility.Collapsed;
}
}
<MenuItem Header="Unhide All Columns" Click="WorkItemsGrid_UnHide" />
以下是我的基本代码。就目前而言,它 returns 列的列索引 header 单击了。您应该能够根据自己的具体需要对其进行调整。
XAML:
<DataGrid Name="dtgrdNotes" MouseRightButtonUp="DataGrid_Click">
<DataGrid.ContextMenu>
<ContextMenu MenuItem.Click="menuItem_Click">
<MenuItem Name="hide" Header="Hide"/>
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>
隐藏代码:
DependencyObject mainDep = new DependencyObject();
private void DataGrid_Click(object sender, RoutedEventArgs e)
{
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader))
{
dep = VisualTreeHelper.GetParent(dep);
}
mainDep = dep;
}
private void menuItem_Click(object sender, RoutedEventArgs e)
{
DependencyObject dep = mainDep;
int index = -1;
if (dep is DataGridColumnHeader)
{
DataGridColumnHeader header = dep as DataGridColumnHeader;
index = header.DisplayIndex;
dtgrdNotes.Columns[index].Visibility = Visibility.Collapsed;
}
if (dep is DataGridCell)
{
DataGridCell cell = dep as DataGridCell;
index = cell.Column.DisplayIndex;
dtgrdNotes.Columns[index].Visibility = Visibility.Collapsed;
}
label.Content = index;
}
这应该适用于单元格和列header 点击。
我正在构建一个 WPF 应用程序,我希望我的 DataGrid 能够像 Excel 那样隐藏列。我有一个右键单击菜单,弹出 'hide column' 作为选项。这是它的工作原理:
if (dgfinal_Copy.CurrentCell.Column == null)
{
}
else
{
int columnIndex = dgfinal_Copy.CurrentCell.Column.DisplayIndex;
dgfinal_Copy.Columns[columnIndex].Visibility = Visibility.Collapsed;
}
我必须添加 if 语句,因为如果有人在单击网格之前单击 header,则当前单元格将为空。此外,如果我单击 [2] 列中的一个单元格,然后单击 [0] 的 header,然后从我的菜单中单击 'hide column',正如您可能已经猜到的那样,隐藏的是 [2] 并且不是 [0].
我想更改它以使用 header 的列索引(如果这是光标所在的位置),如果不是则使用当前单元格的列索引。
我正在添加我正在使用的完整方法,看看我是否忽略了一些简单的事情:
private void WorkItemsGrid_Hide(object sender, RoutedEventArgs e)
{
if (dgfinal_Copy.CurrentCell.Column == null)
{
}
else
{
int colIn = dgfinal_Copy.SelectedCells[0].Column.DisplayIndex;
System.Windows.MessageBox.Show(colIn.ToString());
int columnIndex = dgfinal_Copy.CurrentCell.Column.DisplayIndex;
dgfinal_Copy.Columns[columnIndex].Visibility = Visibility.Collapsed;
}
}
<MenuItem Header="Unhide All Columns" Click="WorkItemsGrid_UnHide" />
以下是我的基本代码。就目前而言,它 returns 列的列索引 header 单击了。您应该能够根据自己的具体需要对其进行调整。
XAML:
<DataGrid Name="dtgrdNotes" MouseRightButtonUp="DataGrid_Click">
<DataGrid.ContextMenu>
<ContextMenu MenuItem.Click="menuItem_Click">
<MenuItem Name="hide" Header="Hide"/>
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>
隐藏代码:
DependencyObject mainDep = new DependencyObject();
private void DataGrid_Click(object sender, RoutedEventArgs e)
{
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader))
{
dep = VisualTreeHelper.GetParent(dep);
}
mainDep = dep;
}
private void menuItem_Click(object sender, RoutedEventArgs e)
{
DependencyObject dep = mainDep;
int index = -1;
if (dep is DataGridColumnHeader)
{
DataGridColumnHeader header = dep as DataGridColumnHeader;
index = header.DisplayIndex;
dtgrdNotes.Columns[index].Visibility = Visibility.Collapsed;
}
if (dep is DataGridCell)
{
DataGridCell cell = dep as DataGridCell;
index = cell.Column.DisplayIndex;
dtgrdNotes.Columns[index].Visibility = Visibility.Collapsed;
}
label.Content = index;
}
这应该适用于单元格和列header 点击。