【发布时间】:2011-03-02 13:29:49
【问题描述】:
我为我的 DataGridView 对象设置了
AllowUserToOrderColumns = true;
如何检测列重新排序?
【问题讨论】:
标签: c# .net datagridview
我为我的 DataGridView 对象设置了
AllowUserToOrderColumns = true;
如何检测列重新排序?
【问题讨论】:
标签: c# .net datagridview
处理此事件是否满足您的需要?
【讨论】:
“使用 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
或在启动代码完成后以编程方式添加事件处理程序。
【讨论】:
我建议你...
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 事件
【讨论】:
ColumnDisplayIndexChanged 事件的详细信息会很有帮助
我不知道你到底想要达到什么目的。如果您想添加自定义列排序行为,可以查看this tutorial on customizable column sorting。
基本上,您在那里捕获MouseDown 事件并查看用户是否单击了列标题。如果他这样做了并且有分配给它的事件,则可以执行。
【讨论】:
我发现的最佳选择是将代码放入 CellMouseUp 事件中。当用户拖动一列并放下时,将在列重新排列后调用 CellMouseUp 事件。
ColumnDisplayIndexChanged 被调用过于频繁,包括在表单初始化时,这可能会导致问题,具体取决于您需要事件执行的操作。
【讨论】: