DataGridView处理列重新排序事件

我为我的DataGridView对象设置了

AllowUserToOrderColumns = true; 

如何检测重新排序的列?

“使用ColumnDisplayIndexChanged”事件看起来是正确的。 它对我有用。 (我添加了一个评论,我有代表。)

该事件的事件处理程序将包含反映该列的新值的e.Column。 您正在寻找的属性是DisplayIndex。 请注意,事件将针对DisplayIndex已更改的每个列触发。

在vb.net中:

 Private Sub data_ColumnDisplayIndexChanged(sender As Object, e As System.Windows.Forms.DataGridViewColumnEventArgs) Handles data.ColumnDisplayIndexChanged Debug.Print(e.Column.DisplayIndex & vbTab & e.Column.Name) End Sub 

由于事件将在启动时激活(多次),因此您可能需要添加某种逻辑以防止在添加列或根据先前设置重新排列列时触发它:

 Private Sub dataAnts_ColumnDisplayIndexChanged(sender As Object, e As System.Windows.Forms.DataGridViewColumnEventArgs) Handles dataAnts.ColumnDisplayIndexChanged If bSortingColumns = False Then Debug.Print(e.Column.DisplayIndex & vbTab & e.Column.Name) End If End Sub 

或者在启动代码完成后以编程方式添加事件处理程序。

MSDN链接。

我建议你…

1 – 执行一个静态int变量。

2 – 在处理程序:: ColumnHeaderMouseClick中影响此变量

3 – 在处理程序:: Sorted中选择带有此变量的行

例:

  private static int idRequetePourtriage = -1; private void dgvRequete_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { if (dgvRequete.SelectedRows.Count > 0) idRequetePourtriage = Convert.ToInt32(dgvRequete.SelectedRows[0].Cells[TEXT_colNameIdRequete].Value.ToString()); } private void dgvRequete_Sorted(object sender, EventArgs e) { desactivateGridSelected(); int rowCount = 0; Boolean isFind = false; while (rowCount < dgvRequete.Rows.Count && !isFind) { if (idRequetePourtriage == Convert.ToInt32(dgvRequete.Rows[rowCount].Cells[TEXT_colNameIdRequete].Value.ToString())) { isFind = true; activateGridSelected(); dgvRequete.Rows[rowCount].Selected = true; } rowCount++; } if (!isFind) { activateGridSelected(); } } 

使用ColumnDisplayIndexChanged事件

我不知道你到底想要达到的目标。 如果要添加自定义列排序行为,可以查看本教程中的可自定义列排序 。

基本上,您在那里捕获MouseDown事件,然后查看用户是否单击了列标题。 如果他这样做并且分配了一个事件,则可以执行此操作。