使用C#,当我右键单击ContextMenuStrip
中的特定列时,我只想显示DataGridView
(CMS)。我很困惑我是否应该使用DataGridView_CellContentClick
和/或dataGridView1.HitTest()
。然后,为了完成我的问题,我想将右键单击的单元格中的数据发送到新的表单窗口。
我当前的代码有奇怪的行为。除非我先左键单击或右键单击第4列,否则它不会显示CMS。但是,一旦我拥有它将始终显示右键单击CMS。
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 4)
{
//Create the ContextStripMenu for Creating the PO Sub Form
ContextMenuStrip Menu = new ContextMenuStrip();
ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Open PO");
//Assign event handlers
MenuOpenPO.MouseUp += new MouseEventHandler(MenuOpenPO_Click);
Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
//Assign created context menu strip to the Datagrid
dataGridView1.ContextMenuStrip = Menu;
}
}
void MenuOpenPO_Click(object sender, MouseEventArgs e)
{
var ht = dataGridView1.HitTest(e.X, e.Y);
MessageBox.Show("Hello2");
PO_Form POWindow = new PO_Form();
POWindow.Show();
}
我打算使用var ht = dataGridView1.HitTest(e.X, e.Y);
来获取单元格值。
任何帮助将不胜感激,谢谢!
修改1 所以我将dataGridView1_CellContentClick更新为此,它让我非常接近我正在寻找的行为。如果我第一次左键单击第4列然后,请右键单击“我的CMS”。如果我左键单击另一列中的任何其他单元格,则右键单击CMS不再存在。但是,我希望能够直接单击第4列中的单元格而无需先单击以创建CMS。
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 4)
{
//MessageBox.Show("Hello1");
//Create the ContextStripMenu for Creating the PO Sub Form
ContextMenuStrip Menu = new ContextMenuStrip();
ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Open PO");
//Assign event handlers
MenuOpenPO.MouseUp += new MouseEventHandler(MenuOpenPO_Click);
Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
//Assign created context menu strip to the Datagrid
dataGridView1.ContextMenuStrip = Menu;
}
else
dataGridView1.ContextMenuStrip = null;
}
答案 0 :(得分:0)
我在VB中做过这个..
Private Sub DGV_CellMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DGV.CellMouseClick
If e.Button = Windows.Forms.MouseButtons.Right Then
DGV.CurrentCell = DGV.Rows(e.RowIndex).Cells(e.ColumnIndex)
CMS.Show(DGV, DGV.PointToClient(Windows.Forms.Cursor.Position))
End If
End Sub
答案 1 :(得分:0)
我想出了自己的问题,因此会发布解决方案。不幸的是,我对C#编程非常陌生,总的来说它非常生疏。我挣扎于事件处理程序的概念(不确定是否正确名称?),它们如何被调用以及它们如何变化取决于您是否使用MouseEventArgs,EventArgs,KeyEventArgs等。无论如何我离题。
我的解决方案如下。我发现使用dataGridView1.MouseUp
给了我糟糕的用户交互结果,每个动作需要2个状态更改。当右键单击正确的coloumn时,IE创建我的ContextMenuStrip。或者,如果右键单击任何其他列,则使其消失。因此,请使用dataGridView1.MouseDown
以获得更好的结果。
dataGridView1.MouseDown += new MouseEventHandler(this.dataGridView_MouseDown);
private void dataGridView_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
var ht = dataGridView1.HitTest(e.X, e.Y);
if (ht.ColumnIndex == 4)
{
//Create the ContextStripMenu for Creating the PO Sub Form
ContextMenuStrip Menu = new ContextMenuStrip();
ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Open PO");
MenuOpenPO.MouseDown += new MouseEventHandler(MenuOpenPO_Click);
Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
//Assign created context menu strip to the DataGridView
dataGridView1.ContextMenuStrip = Menu;
}
else
dataGridView1.ContextMenuStrip = null;
}
}
如果要创建新表单或执行其他操作,我在单击ContextMenuStrip时使用了以下代码,在创建此事件处理程序后使用了以下代码? MenuOpenPO.MouseDown += new MouseEventHandler(MenuOpenPO_Click);
void MenuOpenPO_Click(object sender, MouseEventArgs e)
{
PO_Form POWindow = new PO_Form();
POWindow.Show();
}