如何在WinForms .NET Framework 1.1的DataGrid中禁用特定列排序?
在.NET Framework 1.1的WinForms DataGrid中禁用特定列排序的方法
在.NET Framework 1.1的WinForms DataGrid里,确实没有现成的属性能直接单独禁用某一列的排序——毕竟AllowSorting是个全局设置,设为false就把所有列的排序都关了。不过咱可以通过拦截排序请求的方式来实现只禁用特定列的需求,最靠谱的方法就是利用DataGrid的SortCommand事件来处理。
具体步骤和代码示例
- 先给DataGrid绑定
SortCommand事件,你可以在窗体的构造函数或者初始化方法里加这段代码:
this.dataGrid1.SortCommand += new DataGridSortCommandEventHandler(dataGrid1_SortCommand);
- 然后实现事件处理方法,在里面判断当前要排序的列是不是你想禁用的列,如果是,就把事件的
Handled属性设为true,直接阻止排序执行:
private void dataGrid1_SortCommand(object sender, DataGridSortCommandEventArgs e) { // 把这里的"ID"换成你要禁用排序的列的MappingName(对应数据源里的列名) string columnToDisable = "ID"; // 忽略大小写比较列名,避免因为大小写不一致导致判断失败 if (string.Equals(e.Column.MappingName, columnToDisable, StringComparison.OrdinalIgnoreCase)) { // 标记事件已处理,让DataGrid跳过这次排序操作 e.Handled = true; } }
补充说明
e.Column对应的是当前点击的列的DataGridColumnStyle,它的MappingName属性和你数据源(比如DataTable)里的列名是一一对应的,所以只要匹配这个名称就能精准定位到目标列。- 如果需要禁用多列排序,只需要把要禁用的列名放到一个集合里,然后判断当前列是否在集合中即可:
private void dataGrid1_SortCommand(object sender, DataGridSortCommandEventArgs e) { // 这里列出所有要禁用排序的列名 List<string> disabledColumns = new List<string> { "ID", "CreateTime", "Status" }; if (disabledColumns.Contains(e.Column.MappingName, StringComparer.OrdinalIgnoreCase)) { e.Handled = true; } }
- 如果你给DataGrid设置了自定义的
DataGridTableStyle,记得确保TableStyle里的DataGridColumnStyle的MappingName和数据源列名一致,这样判断才能正常生效。
内容的提问来源于stack exchange,提问作者Vignesh Nethaji
相关产品推荐
相关产品推荐

