WPF中如何实现在datagrid中点击列头实现整列选中(一)

您所在的位置:网站首页 表格如何选中一行一列 WPF中如何实现在datagrid中点击列头实现整列选中(一)

WPF中如何实现在datagrid中点击列头实现整列选中(一)

#WPF中如何实现在datagrid中点击列头实现整列选中(一)| 来源: 网络整理| 查看: 265

这个问题困扰了我好几天。目前找到一个看似简单的办法。

第一步:找到点击的列头,这里重写列的排序方法,来确定列号。我是模拟Excel的列头,字母A-Z一共26个列。这个很容易实现。

private void _datagrid_Sorting(object sender, DataGridSortingEventArgs e)         {             var SelectColumn = e.Column.Header.ToString();             int index = Utils.GetColumnIndex(SelectColumn);             SelectAllColumn(_datagrid, index);             e.Handled = true;                    }

第二步:把找到的列序号和datagrid 一起传入新的方法。SelectAllColumn,当然你也可以直接在上面的方法里面写,这样界面简洁一点。

这个方法的简便之处在于,在datagrid中寻找某一列的所有内容,因为它最终都是一个TextBlock,然后把这个TextBlock的parent的找到,也就是cell了。再把这个cell加入到datagrid.SelectedCells.里面就行了。因为加入后,cell.IsSelected就等于true了,所以表格会自动被选中。

private void SelectAllColumn(DataGrid dg, int index)         {             int totalRow = myDataTable.Rows.Count;             dg.SelectedCells.Clear();             DataGridCell cell;             for (int i= 0; i < totalRow;i++)             {                                TextBlock txtblock = (dg.Columns[index].GetCellContent(dg.Items[i]) as TextBlock);                 cell = (DataGridCell)txtblock.Parent;                 dg.SelectedCells.Add(new DataGridCellInfo(cell));                }         }

第三步:如果你的列不长,我的是256行,上面的代码基本可以工作了。但是它仅仅能在窗口可见部分不会报错。也就是说你的行数如果很多的话,用上面的代码会出错。比如可见行是20行,而实际你的数据表的行数超过20,它就会找不到TextBlock。这里,你需要用datagrid.ScrollIntoView这个方法来让表格滚动到下一个20行,然后继续。我尝试了一下这个方法,非常的慢,虽然也可以实现。

第四步:如果不想用第三步,因为比较慢。可以在xaml文件里面修改datagrid的属性,让可视这个功能关闭。 VirtualizingPanel.IsVirtualizing = "False"



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3