winforms 如何防止数据网格视图排序

iq0todco  于 2023-05-01  发布在  其他
关注(0)|答案(7)|浏览(153)

我在Windows窗体上使用DataGridView。它只显示两列。默认情况下,当应用程序运行时,如果我单击列标题,则datagridview将根据该列进行排序。但是,我想完全禁用网格视图上的排序。我找不到一个可以设置sorting = false或类似的属性。
有人能告诉我如何禁用网格视图排序吗?
Thanks:)

编辑:

我只是想我可以将个别列设置为NotSortable(下面公布了答案)。是否可以在网格视图级别而不是单独的列上完成?

qco9c6ql

qco9c6ql1#

好吧,找到答案了。对于每一列,我需要显式地指定

this.dgv.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable;

所以我在一个Helper类中编写了自己的函数

/// <summary>
/// Sets the sort mode for the data grid view by setting the sort mode of individual columns
/// </summary>
/// <param name="dgv">Data Grid View</param>
/// <param name="sortMode">Sort node of type DataGridViewColumnSortMode</param>
public static void SetGridViewSortState(DataGridView dgv, DataGridViewColumnSortMode sortMode)
{
    foreach (DataGridViewColumn col in dgv.Columns)
        col.SortMode = sortMode;
}

无论在哪里,我需要使网格视图不可排序,我这样称呼它:

Helper.SetGridViewSortState(this.dgv, DataGridViewColumnSortMode.NotSortable);
0md85ypi

0md85ypi2#

For i = 0 To DataGridView1.Columns.Count - 1
    DataGridView1.Columns.Item(i).SortMode = DataGridViewColumnSortMode.Programmatic
Next i

web gridview有一个属性AllowSorting,这是更容易的!

yhived7q

yhived7q3#

排序在某种程度上是数据源的一个特性。这种情况下的数据源是什么?DataTable,也许?一种选择是简单地使用不支持排序的数据源,这几乎是所有的方法。List<T>BindingList<T>等-不提供排序。
如果你必须使用DataView,你可以(我猜)用一个自定义视图 Package 视图,重新实现IBindingList(返回SupportsSortingfalse),但简单地改变每列的值是很多容易的(到了做其他事情的时候会 * 疯狂 * 的程度)。..)

pvcm50d1

pvcm50d14#

我为我的datagridview使用绑定源和datatable。为了绕过dataview所做的所有底层自动排序,我为每一行都有一个数据库id号,这样我就可以使用datagridview来列出我的id号(从所选的行开始),然后我可以搜索我的datatable中的每一条记录,并在那里进行更改。我可以直接在datagridview上做同样的事情。要清楚的是,我实际上不确定我是否绕过了自动排序,但这里的方法不会因为它们在自动排序中移动而错过任何行。如果您的数据库非常大,这可能不好,因为它涉及到搜索整个数据库中的每个记录。
我有一个员工数据库,我可以选择多行,然后从一个组合框中选择一个职务代码,然后单击按钮为每一行设置职务代码。我可能不需要挂起绑定源代码,但无论如何。..
这是我的代码。

Private Sub SetCodeBtn_Click(sender As Object, e As EventArgs) Handles SetCodeBtn.Click
    If current_db_name = "employees" Then
        Dim db_id_col As Integer = FindDataGridColumn("DB_ID", DataGridView1.Columns)
        Dim job_code_col As Integer = FindDataGridColumn("JOBCODE", DataGridView1.Columns)
        Dim new_job_code As String = JobCodesCBX.Text
        Dim db_id_list As IList(Of String) = New List(Of String)
        For Each row As DataGridViewRow In DataGridView1.SelectedRows
            db_id_list.Add(row.Cells.Item(db_id_col).Value)
        Next
        For Each id As String In db_id_list
            For Each table_row As DataRow In tables_data("employees").Rows
                If table_row(tables_data("employees").Columns.IndexOf("DB_ID")) = id Then
                    table_row(tables_data("employees").Columns.IndexOf("JOBCODE")) = new_job_code
                End If
            Next
        Next
        table_changes_made = True
        RefreshDataGridView(DataGridView1)
        BindingSource1.ResumeBinding()
    Else
        MsgBox("You Must Select Rows In The Employees Database To Set A Job Code.")
    End If
End Sub

Screenshot of my Program

w1e3prcc

w1e3prcc5#

也可以创建自己的函数

Private Sub NotSortGrid()
        For i = 0 To dgvUtil.Columns.Count - 1
            dgvUtil.Columns.Item(i).SortMode = DataGridViewColumnSortMode.NotSortable
        Next i
End Sub
1bqhqjot

1bqhqjot6#

您总是可以自己处理列标题单击和双击事件,而不对它们执行任何操作。

7rfyedvj

7rfyedvj7#

盯着。NET3.0中,GridView有一个名为AllowSorting的属性

相关问题