Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Datagridview:右键单击列标题获取列名称(读取信息)_C#_Vb.net_Winforms_Datagridview_Datagridviewcolumn - Fatal编程技术网

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

C# Datagridview:右键单击列标题获取列名称(读取信息),c#,vb.net,winforms,datagridview,datagridviewcolumn,C#,Vb.net,Winforms,Datagridview,Datagridviewcolumn,我有两个DataGridView,它们共享相同的数据源。我选择仅在第一个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,它们共享相同的数据源。我选择仅在第一个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;
        }
我这样做的目的是,只有当用户右键单击列标题时,才会显示上下文菜单。然后,通过上下文菜单执行以下操作:

 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,这将是正确的全局索引。例如,当您先移动第二列,然后再移动第一列时,这会导致以后出现问题

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


这个问题本来可以短得多,只包括最后一段的最后一句话,但我想对正在发生的事情给出更准确的看法。

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

解决我的问题:

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

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

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

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

解决我的问题:

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

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

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

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

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

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

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

这与控件(datagridview)无关,而是与如何管理特定情况有关(本例中为两级索引)。你写了很多东西(表现出正确的态度:荣誉),尽管结果并不太积极,因为实际问题还不清楚。事实上,你在最后一句话中似乎明白了这一点(但没有结果…)。这里的主要目标是做出一个清晰而吸引人的描述(即,一个容易吸引许多潜在帮助者的描述);你必须证明你的困难和你尝试过的东西,但不要让它变得那么大和不清楚……如果你正确地重新定义(和标记)这个问题,我相信你会很快得到很好的帮助。这不是datagridview问题,而是数据存储/结构、算法等问题。清楚地描述问题,以及您尝试过的内容和发现的问题;你不应该需要超过当前版本长度的三分之一。我理解你的意思。我想我找到了一个更快的解决办法。现在发布。你的回答与我的建议无关(在国际海事组织,它甚至不是一个足够好的解决方案,并且严重怀疑未来的读者是否会发现它有用。基本上,你提出了一个非理想配置所不需要的问题;你保留了这个问题,并提出了一个轻微的纠正,但没有纠正潜在的错误方法),但完全取决于您。您能帮助我了解如何改进我的方法吗?有什么更好的方法可以做到这一点?这与控制(datagridview)无关,但与您如何管理您的具体情况有关(本例中有两个级别的索引)。您已经写了很多东西(表明正确态度的内容:荣誉),虽然就实际问题而言,结果不是太积极。事实上,你在最后一句话中似乎明白了这一点(但没有结果…)。这里的主要目标是做出一个足够清晰和吸引人的描述(即,一个很容易吸引许多潜在帮助者);如果你重新定义(和标记),你必须证明困难和你尝试过的东西,但不要把它弄得那么大和不清楚正确地回答这个问题,我相信你会很快得到很好的帮助。这不是一个datagridview问题,而是一个数据存储/结构、算法等问题。请清楚地描述这个问题,以及你所做的尝试