C# 鼠标右键单击上下文Ustrip不';I don’我不是第一次来
我得到了这部分代码,在这里我打开contextMenuStrip以响应鼠标右键单击(在dataGridView表上) 问题是,我第一次右键单击时,菜单不会弹出。在第二次出现的时候,一切都很顺利C# 鼠标右键单击上下文Ustrip不';I don’我不是第一次来,c#,datagridview,mouseevent,contextmenustrip,C#,Datagridview,Mouseevent,Contextmenustrip,我得到了这部分代码,在这里我打开contextMenuStrip以响应鼠标右键单击(在dataGridView表上) 问题是,我第一次右键单击时,菜单不会弹出。在第二次出现的时候,一切都很顺利 private void dataGridView1_MouseClick(object sender, MouseEventArgs e) { DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y);
private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y); //get info
int currentMouseOverRow = dataGridView1.HitTest(e.X, e.Y).RowIndex;
if (e.Button == MouseButtons.Right) //MouseButton right: Open context menu strip.
{
dataGridView1.Rows[currentMouseOverRow].Selected = true; //Select the row
ContextMenuStrip Menu = new ContextMenuStrip();
ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Delete it");
MenuOpenPO.Click += new EventHandler(MenuOpenPO_Click);
Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
dataGridView1.ContextMenuStrip = Menu; //Assign to dataGridView1
}
}
有什么帮助吗?:)我使用visual studio 2012。我通常创建自己的
ContextMenuStrip
对象(私有变量),并在需要时显示它。我怀疑它是第一次被分配的,但无法显示,因为新添加的菜单没有自己的右键单击触发器来显示。这只会在第二次发生,一旦它存在
像这样:
私有ContextMenuStrip_myMenu
private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y); //get info
int currentMouseOverRow = dataGridView1.HitTest(e.X, e.Y).RowIndex;
if (e.Button == MouseButtons.Right) //MouseButton right: Open context menu strip.
{
dataGridView1.Rows[currentMouseOverRow].Selected = true; //Select the row
_myMenu = new ContextMenuStrip();
ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Delete it");
MenuOpenPO.Click += new EventHandler(MenuOpenPO_Click);
_myMenu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
_myMenu.Show(new Point(e.X, e.Y));
}
}
我通常创建自己的
ContextMenuStrip
对象(私有变量),并在需要时创建Show()
对象。我怀疑它是第一次被分配的,但无法显示,因为新添加的菜单没有自己的右键单击触发器来显示。这只会在第二次发生,一旦它存在
像这样:
私有ContextMenuStrip_myMenu
private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y); //get info
int currentMouseOverRow = dataGridView1.HitTest(e.X, e.Y).RowIndex;
if (e.Button == MouseButtons.Right) //MouseButton right: Open context menu strip.
{
dataGridView1.Rows[currentMouseOverRow].Selected = true; //Select the row
_myMenu = new ContextMenuStrip();
ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Delete it");
MenuOpenPO.Click += new EventHandler(MenuOpenPO_Click);
_myMenu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
_myMenu.Show(new Point(e.X, e.Y));
}
}
问题:您已在
右键单击事件后将上下文菜单添加到DataGridView
。因此,ContextMenu
将在第一次右键单击后添加到您的DataGridView
,因此用户可以从进一步的右键单击事件中查看附加的ContextMenu
解决方案:在右键单击DataGridView
之前,您需要添加上下文菜单
,以便它将在每个右键单击事件中显示
注意:如果将上下文菜单
分配给任何控件,默认情况下它将显示在右键单击
上,这意味着您不需要为控件上的每个右键单击
事件添加它
尝试以下操作:在表单加载事件中
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
ContextMenuStrip Menu = new ContextMenuStrip();
ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Delete it");
MenuOpenPO.Click += new EventHandler(MenuOpenPO_Click);
Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
dataGridView1.ContextMenuStrip = Menu; //Assign to dataGridView1
}
问题:您已在右键单击事件后将上下文菜单添加到DataGridView
。因此,ContextMenu
将在第一次右键单击后添加到您的DataGridView
,因此用户可以从进一步的右键单击事件中查看附加的ContextMenu
解决方案:在右键单击DataGridView
之前,您需要添加上下文菜单
,以便它将在每个右键单击事件中显示
注意:如果将上下文菜单
分配给任何控件,默认情况下它将显示在右键单击
上,这意味着您不需要为控件上的每个右键单击
事件添加它
尝试以下操作:在表单加载事件中
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
ContextMenuStrip Menu = new ContextMenuStrip();
ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Delete it");
MenuOpenPO.Click += new EventHandler(MenuOpenPO_Click);
Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
dataGridView1.ContextMenuStrip = Menu; //Assign to dataGridView1
}
+当不再需要旧菜单时,你应该把它处理掉,否则我想你会漏掉的resource@SriramSakthivel泄露什么?它是一个局部对象,作用域是父对象(我猜是一个表单
)。它每次被初始化的事实并不表示有多个实例。您将泄漏一个UserObject
,我指的是一个控件,在本例中为ContextMenuStrip
。如果未引用控件,则不会对其进行垃圾收集,ContextMenuStrip
也是一个控件。您正在创建\u myMenu=new ContextMenuStrip()代码>新实例,在哪里处理?通常不需要显式处理;一旦不再显示,旧对象将不被引用,并将由垃圾收集器清理。+1您应该在不再需要旧菜单时处理它,否则我认为您会泄漏resource@SriramSakthivel泄露什么?它是一个局部对象,作用域是父对象(我猜是一个表单
)。它每次被初始化的事实并不表示有多个实例。您将泄漏一个UserObject
,我指的是一个控件,在本例中为ContextMenuStrip
。如果未引用控件,则不会对其进行垃圾收集,ContextMenuStrip
也是一个控件。您正在创建\u myMenu=new ContextMenuStrip()代码>新实例,在哪里处理?通常不需要显式处理;一旦不再显示,旧对象将不被引用,并将由垃圾收集器清理。噢,哇。这解释了很多。谢谢你。通过禁用菜单绑定的控件,菜单很容易被禁用。哦,哇。这解释了很多。谢谢你。通过禁用绑定到的控件,可以轻松禁用菜单。