如何将WPF DataGrid标头视为选定的单元格

本文关键字:单元格 WPF DataGrid | 更新日期: 2023-09-27 18:11:36

我正在构建一个WPF应用程序,我希望我的DataGrid能够隐藏列非常类似于Excel的方式。我有一个右键菜单,弹出"隐藏列"作为一个选项。下面是它的工作原理:

        if (dgfinal_Copy.CurrentCell.Column == null)
        {
        }
        else
        {
            int columnIndex = dgfinal_Copy.CurrentCell.Column.DisplayIndex;
            dgfinal_Copy.Columns[columnIndex].Visibility = Visibility.Collapsed;
        }

我必须添加if语句,因为如果有人在单击网格之前单击标题,那么当前单元格将为空。此外,如果我单击列[2]中的单元格,然后单击[0]的标题,然后单击菜单中的"隐藏列",正如你可能已经猜到的那样,它被隐藏而不是[0]。

我想改变这一点,使用标题的列索引(如果这是光标所在的地方),如果不是,那么当前单元格的列索引。

我正在添加我正在使用的完整方法,以查看我是否忽略了一些简单的东西:

     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" />

如何将WPF DataGrid标头视为选定的单元格

下面是我的基本代码。目前,它返回单击的列标头的列索引。你应该能够使它适应你的确切需求。

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

这应该适用于单元格和列标题点击。