Datagridview:右键单击列标题(读取信息)获取列名

本文关键字:信息 获取 读取 标题 右键 单击 Datagridview | 更新日期: 2023-09-27 18:26:00

我有两个数据网格视图,它们共享相同的数据源。我选择只在第一个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;
        }

简介:我想右键单击并将列从一个数据网格视图随意移动到另一个。我通过使相应的列可见和不可见来实现这一点,因为两个数据网格视图共享相同的数据源。当然,我也遇到过有关栏目索引的问题。

考虑这个例子:我有一个5列的数据表,我将该数据源提供给我的两个数据网格视图。我决定让数据表的前3列在第一个datagridview上可见,剩下的两列在第二个datagridew上可见。现在,如果我想把一列从第二个数据网格视图移到第一个,我会首先触发这个事件:

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);
            }
        }
    }

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

 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获取当前数据网格视图的索引,而不是整个数据集的索引。在我的示例中,如果我转到第二个dgv并右键单击第二列的标题,currentColumnIndex将显示1而不是4,这将是正确的全局索引。这会导致以后出现问题,例如,先移动第二列,然后再移动第一列。

我认为有一种方法来了解我的列的正确的全局索引是很重要的。我不确定这是否可以实现,所以我想也许我可以寻找列名,因为我的数据集的所有列名都是唯一的。然后的问题是,在给定我的结构的情况下,当你右键单击标题列时,如何获得标题列文本。

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

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

解决我的问题:

我似乎不需要寻找检测列名的方法。我现在不再使用DataGridViewi_MouseDown事件,而是使用DataGridViewi_ColumnHeaderMouseClick,它使用DataGridView CellMouseEventArgs类。因此,我将代码从前一个事件移到了后一个事件。现在,无论何时使用e.ColumnIndex,实际上都会得到正确的索引,这意味着整个数据表的索引,而不仅仅是当前数据网格视图的索引。

为了实现这一点,我还修改了使列可见的代码。现在它只是:

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

Datagridview:右键单击列标题(读取信息)获取列名

右键点击查找列名/标题:

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