C# DataGridView处理列重新排序事件

C# DataGridView处理列重新排序事件,c#,.net,datagridview,C#,.net,Datagridview,我为我的DataGridView对象设置了 AllowUserToOrderColumns = true; 如何检测列的重新排序 我不知道你到底想达到什么目的。如果要添加自定义列排序行为,可以查看 基本上,您可以在那里捕获MouseDown事件,然后查看用户是否单击了列标题。如果他这样做了,并且有一个事件分配给它,则可以执行此操作。处理此事件是否满足您的需要 我建议你 1-执行静态int变量 2-影响处理程序中的此变量::ColumnHeaderMouseClick 3-在handler:

我为我的DataGridView对象设置了

AllowUserToOrderColumns = true;

如何检测列的重新排序

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


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

处理此事件是否满足您的需要

    • 我建议你

      1-执行静态int变量

      2-影响处理程序中的此变量::ColumnHeaderMouseClick

      3-在handler::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();
            }
        }
      
      private static int idRequestePourTriage=-1;
      私有void dgvRequete_ColumnHeaderMouseClick(对象发送器,DataGridViewCellMouseEventArgs e)
      {
      如果(dgvRequete.SelectedRows.Count>0)
      IDRequestePourTriage=Convert.ToInt32(dgvRequete.SelectedRows[0]。单元格[TEXT_colnameIDRequeste]。Value.ToString());
      }
      私有void dgvRequete_排序(对象发送方,事件参数e)
      {
      取消激活GridSelected();
      int rowCount=0;
      布尔值isFind=false;
      while(rowCount
      使用ColumnDisplayIndexChanged事件

      使用ColumnDisplayIndexChanged事件看起来像是正确的事件。这对我有用。(我会加上一条评论,我已经得到了它的代表。)

      该事件的事件处理程序将包含反映该列新值的e.列。您要查找的属性是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
      
      或者在启动代码完成后以编程方式添加事件处理程序


      不确定为什么会将其标记为正确而不是错误。此事件将在许多其他情况下触发,如重新绑定数据表等。每次用户重新排序列时,此事件至少会触发两次。一次用于起点,一次用于终点,一次用于中间的每一列。根据您对事件所做的操作,这可能会带来很大的开销。如果您能够提供有关如何使用
      ColumnDisplayIndexChanged
      事件的一些详细信息,这将非常有用