我有一个简单的数据网格视图,我添加了一个上下文菜单条,有一个选项。如果您右键单击控件上的任何位置,通常会显示此上下文菜单条,但是使用此代码,我只有在您右键单击标题列时才会显示。
private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
var ht = dataGridView1.HitTest(e.X, e.Y);
if ((ht.Type == DataGridViewHitTestType.ColumnHeader))
{
contextMenuStrip1.Show(MousePosition);
}
}
}
目标:我希望能够在showToolStripMenuItem_Click事件中获取列索引(我右键单击并随后启用上下文菜单)。这是此活动的代码。
private void showToolStripMenuItem_Click(object sender, EventArgs e)
{
var ht = dataGridView1.HitTest(Cursor.Position.X, Cursor.Position.Y);
DataGridViewCellMouseEventArgs args = new
DataGridViewCellMouseEventArgs(ht.ColumnIndex, 0, 0, 0, new
MouseEventArgs(System.Windows.Forms.MouseButtons.Right, 0, 0, 0, 0));
dataGridView1_ColumnHeaderMouseClick(null, args);
}
不幸的是,showToolStripMenuItem_Click事件具有EventArgs而不是DataGridViewCellMouseEventArgs,在这种情况下,很容易获得列索引:e.ColumnIndex。
你在第二个函数中看到的是我试图实例化一个DataGridViewCellMouseEventArgs类并使用它来获取我的索引,不幸的是,e.ColumnIndex属性总是返回-1。
我该如何解决这个问题?
答案 0 :(得分:2)
您可以使用DataGridView
的{{3}}事件。
创建ContextMenuStrip
,然后处理DataGridView
的{{3}}事件并检查这是否是列标题,显示上下文菜单。
您可以使用e.RowIndex
和e.ColumnIndex
检测行索引和列索引。
<强>代码强>
private void dataGridView1_CellContextMenuStripNeeded(object sender,
DataGridViewCellContextMenuStripNeededEventArgs e)
{
//Check if this is column header
if (e.RowIndex == -1)
{
//Show the context menu
e.ContextMenuStrip = this.contextMenuStrip1;
//e.ColumnIndex is the column than you right clicked on it.
}
}