【问题标题】:DataGridView handle column reordering eventDataGridView 处理列重新排序事件
【发布时间】:2011-03-02 13:29:49
【问题描述】:

我为我的 DataGridView 对象设置了

AllowUserToOrderColumns = true;

如何检测列重新排序?

【问题讨论】:

    标签: c# .net datagridview


    【解决方案1】:

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

    【讨论】:

    • 不知道为什么这被标记为正确,因为它不是。这个事件会在很多其他情况下被触发,比如重新绑定数据表等等。
    • 每次用户对列重新排序时,它至少会触发两次。一次用于起点,一次用于结束点,一次用于中间的每一列。根据您对事件的处理方式,这可能会产生大量开销。
    【解决方案2】:

    “使用 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
    

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

    The MSDN link.

    【讨论】:

      【解决方案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();
            }
        }
      

      【讨论】:

        【解决方案4】:

        使用 ColumnDisplayIndexChanged 事件

        【讨论】:

        • 如果您能提供一些有关如何使用ColumnDisplayIndexChanged 事件的详细信息会很有帮助
        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我发现的最佳选择是将代码放入 CellMouseUp 事件中。当用户拖动一列并放下时,将在列重新排列后调用 CellMouseUp 事件。

          ColumnDisplayIndexChanged 被调用过于频繁,包括在表单初始化时,这可能会导致问题,具体取决于您需要事件执行的操作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-03
            • 1970-01-01
            • 1970-01-01
            • 2011-02-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多