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

How to disable specific column Sorting in Datagrid?

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

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

this.dataGrid1.AllowSorting = false;

您可以按列号设置如下,

// Make fourth column not sortable
dataGridView1.Columns[3].SortMode = DataGridViewColumnSortMode.NotSortable;

DataGrid 控件没有 属性 来单独控制列的排序。您可以通过设置 AllowSorting.

来允许或禁止对所有列进行排序

但是查看 source code of the control,控件通过处理鼠标弹起进行排序,通过 hit-testing 检查鼠标弹起是否发生在列 header 上。因此,要自定义行为,您可以覆盖 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控件:

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