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

时间:2015-12-07 09:07:06

标签: c# vb.net winforms datagridview datagridviewcolumn

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

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

考虑这个例子:我有一个5列的数据表,我将该数据源提供给我的datagridviews。我决定在第一个datagridvew上显示数据表的前3列,并在第二个上显示剩下的两列。现在,如果我想将第二个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);
            }
        }
    }

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

 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并右键单击第二列的标题,则currentColumnIndex显示1而不是4,这将是正确的全局索引。这会导致以后出现问题,例如,您首先移动第二列,然后移动第一列。

我认为有必要了解我的列的正确的全局索引。我不确定这是否可以实现,所以我想也许我可以查找列名,因为我的数据集的所有列名都是唯一的。接下来的问题是,如果给出我的结构,如何在右键单击时获取标题列文本。

问题可能要短得多,只包括最后一段的最后一句,但我想更准确地了解正在发生的事情。

2 个答案:

答案 0 :(得分:0)

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

解决我的问题:

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

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

parent

答案 1 :(得分:0)

通过右键单击查找列名称/标题:

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