c# - 如何禁用 Datagrid 中的特定列排序?

标签 c# .net winforms datagrid .net-1.1

在 winforms .Net Framework 1.1 中,有什么方法可以禁用数据网格中特定列的排序。

如果我尝试将允许排序设置为 false,那么它会禁用所有列中的排序。但我需要禁用数据网格中的特定列。

this.dataGrid1.AllowSorting = false;

最佳答案

DataGrid控件没有单独控制列排序的属性。您可以通过设置 AllowSorting 来允许或禁止对所有列进行排序。

但调查source code of the control ,控件通过处理鼠标弹起来执行排序,通过 HitTest 检查鼠标弹起是否发生在列标题上。因此,要自定义行为,您可以覆盖 OnMouseUp 并通过传递一个假的鼠标事件参数来欺骗基本方法:

public class MyDataGrid : DataGrid
{
    protected override void OnMouseUp(MouseEventArgs e)
    {
        var hti = HitTest(e.X, e.Y);
        var newArgs = new MouseEventArgs(e.Button, e.Clicks, -1, -1, e.Delta);
        if (hti.Type == HitTestType.ColumnHeader && hti.Column == 0)
            base.OnMouseUp(newArgs);
        else
            base.OnMouseUp(e);
    }
}

然后你可以在表单上使用MyDataGrid控件:

enter image description here

您可以增强代码示例并添加一个属性以包含可排序或不可排序属性的列表,而不是 hti.Column == 0 检查那些可排序/不可排序的列索引.

关于c# - 如何禁用 Datagrid 中的特定列排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49548750/

相关文章:

c# - 如何使用 C# 安装 Windows 字体

c# - 将iTunes商店中的Json反序列化为C#对象

c# - 如何使用 HttpWebRequest 使 C# 应用程序表现得像 fiddler

c# - Roslyn future 分支不能使用 C# 7 功能元组 - 错误 CS0518 预定义类型 'System.ValueTuple` 2

c# - BindingSource 上的 EndEdit 更新 DataTable,但 rowstate 仍未改变

c# - 计算器故障: Only getting second value I enter

c# - 编译器如何从 LAMBDA 表达式推断委托(delegate)类型?

c# - VS 17 打破所有异常

c# - 如何在 C# 中使用 DbContext 删除对象?

c# - 如何从解决方案中引用项目?