Datagridview:通过右键单击列 header 获取列名(阅读信息)

Datagridview: Get column name by right clicking on column header (read info)

我有两个数据网格视图,它们都共享 相同的 数据源。我选择只在第一个 dgv 上显示前 n 列,在第二个 dgv 上显示数据源的其余 n 列,如下所示:

for (int i = 0; i < mytable.Columns.Count; i++)
        {
            dataGridView1.Columns[i].Visible = i < n;
            dataGridView2.Columns[i].Visible = i >= n;
        }

简介:我想右键单击并随意将列从一个datagridview 移动到另一个。我通过使相应的列可见和不可见来做到这一点,因为两个 datagridviews 共享相同的数据源。当然,我 运行 遇到有关列索引的问题。

考虑这个例子:我有一个包含 5 列的数据表,我将该数据源提供给了我的两个数据网格视图。我决定使数据表的前 3 列在第一个 datagridvew 上可见,其余两列在第二个上可见。现在,如果我想将一列从第二个 datagridview 移动到第一个,我将首先触发此事件:

private void dataGridView2_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            var ht = dataGridView1.HitTest(e.X, e.Y);
            currentColumnIndex = ht.ColumnIndex;

            if ((ht.Type == DataGridViewHitTestType.ColumnHeader))
            {

                contextMenuStrip2.Show(MousePosition);
            }
        }
    }

我已经做到了,只有当用户右键单击列 header 时,才会显示上下文菜单。然后,通过上下文菜单会发生这种情况:

 private void moveToFirstGridToolStripMenuItem_Click(object sender, EventArgs e)
    {
        dataGridView2.Columns[currentColumnIndex+dataGridView1.Columns.GetColumnCount(DataGridViewElementStates.Visible)].Visible = false;
        dataGridView1.Columns[currentColumnIndex + dataGridView1.Columns.GetColumnCount(DataGridViewElementStates.Visible)].Visible = true;
        currentColumnIndex = -5;
    }

currentColumnIndex 是一个全局变量,用于跟踪用户右键单击的列的索引。

问题:问题是这个currentColumnIndex获取的是当前datagridview的索引,而不是整个数据集。在我的示例中,如果我转到第二个 dgv 并右键单击第二列的 header,则 currentColumnIndex 显示 1 而不是 4,这将是正确的全局索引。这会导致以后出现问题,例如,当您先移动第二列,然后再移动第一列时。

我认为有一种方法可以了解我的专栏的正确的全局 索引很重要。我不确定这是否可以实现,所以我想也许我可以查找列名,因为我的数据集的所有列名都是唯一的。接下来的问题是,根据我的结构,当您右键单击它时如何获取 header 列文本。

问题本来可以更短,只包括最后一段的最后一句话,但我想更准确地了解正在发生的事情。

回答我的问题:这只会解决我描述的我目前遇到的问题。它实际上并没有回答顶部的问题。这就是如何通过右键单击 来查找列名。但是,当您实际拥有正确的索引时,获取所需的名称和列信息应该不是问题:dataGridView1.Columns[i]...

我的问题的解决方案:

看来我不需要寻找检测列名的方法。我现在不使用 DataGridViewi_MouseDown 事件,而是使用 dataGridViewi_ColumnHeaderMouseClick,它使用 DataGridViewCellMouseEventArgs class。所以我将代码从前一个事件移到了后者。现在,无论何时使用 e.ColumnIndex,您实际上都会得到 正确的 索引,这意味着整个数据表的索引,而不仅仅是当前 datagridview 的索引。

为了完成这项工作,我还更改了使列可见的代码。现在只是:

private void moveToFirstGridToolStripMenuItem_Click(object sender, EventArgs e)
    {
        dataGridView2.Columns[currentColumnIndex].Visible = false;
        dataGridView1.Columns[currentColumnIndex].Visible = true;
        currentColumnIndex = -5;
    }

通过右键单击找到第 name/header 列:

Private Sub dgv1_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv1.ColumnHeaderMouseClick
    If e.Button = Windows.Forms.MouseButtons.Right Then
        MsgBox(e.ColumnIndex & " " & dgv1.Columns(e.ColumnIndex).Name & " " & dgv1.Columns(e.ColumnIndex).HeaderText)
    End If
End Sub