我为我的DataGridView对象设置了
AllowUserToOrderColumns = true;
如何检测重新排序的列?
答案 0 :(得分:7)
处理此事件是否符合您的要求?
答案 1 :(得分:5)
"使用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
或者在启动代码完成后以编程方式添加事件处理程序。
答案 2 :(得分:3)
我建议你......
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();
}
}
答案 3 :(得分:1)
使用ColumnDisplayIndexChanged事件
答案 4 :(得分:0)
我不知道你到底想要达到的目标。如果要添加自定义列排序行为,可以查看this tutorial on customizable column sorting。
基本上,您在那里捕获MouseDown
事件,然后查看用户是否单击了列标题。如果他这样做并且分配了一个事件,则可以执行此操作。