积极答复者
如何让ContextMenu不消失?

问题
答案
-
主要是在contextMenuStrip的Closing关闭前事件中,判断关闭理由CloseReason是否为ItemClicked,如果是,就设置关闭的Cancel=true,来禁止关闭,以便你进行多项等更多操作,这里我写了个小DEMO,可以参考一下。
测试效果:
测试代码:
namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("ID", typeof(int))); dt.Columns.Add(new DataColumn("Name", typeof(string))); dt.Columns.Add(new DataColumn("Age", typeof(int))); DataRow dr = dt.NewRow(); dr[0] = 1; dr[1] = "codeio"; dr[2] = 22; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = 2; dr[1] = "wknight"; dr[2] = 21; dt.Rows.Add(dr); dataGridView1.DataSource = dt; dataGridView1.ContextMenuStrip = contextMenuStrip1; dataGridView1.GotFocus += dataGridView1_GotFocus; } private void dataGridView1_GotFocus(object sender, EventArgs e) { ToolStripMenuItem tsm = new ToolStripMenuItem("选择显示项"); tsm.Enabled = false; ToolStripSeparator tss = new ToolStripSeparator(); contextMenuStrip1.Items.Add(tsm); contextMenuStrip1.Items.Add(tss); for (int i = 0; i < dataGridView1.Columns.Count; i++) { ToolStripMenuItem temp = new ToolStripMenuItem(dataGridView1.Columns[i].HeaderText); temp.Checked = dataGridView1.Columns[i].Visible; contextMenuStrip1.Items.Add(temp); } } private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { ToolStripMenuItem tsm = e.ClickedItem as ToolStripMenuItem; if (tsm != null) { tsm.Checked = !tsm.Checked; } } private void contextMenuStrip1_Closing(object sender, ToolStripDropDownClosingEventArgs e) { if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked) { e.Cancel = true; } } private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e) { for (int i = 2; i < contextMenuStrip1.Items.Count; i++) { ToolStripMenuItem tsm = contextMenuStrip1.Items[i] as ToolStripMenuItem; if (tsm != null) { dataGridView1.Columns[contextMenuStrip1.Items[i].Text].Visible = tsm.Checked; } } } } }
代码可以放到Form1.cs直接运行,只要你分别拖一个DataGridView和ContextMenuStrip控件到窗体上。
- 已建议为答案 ThankfulHeartModerator 2012年5月25日 5:04
- 已标记为答案 Bob ShenModerator 2012年6月7日 9:34
全部回复
-
在每个子菜单项的Click事件中再Call 菜单的Show Method.
contextMenuStrip1.Show();
以上說明若有錯誤請指教,謝謝。
亂馬客blog: http://www.dotblogs.com.tw/rainmaker/ -
主要是在contextMenuStrip的Closing关闭前事件中,判断关闭理由CloseReason是否为ItemClicked,如果是,就设置关闭的Cancel=true,来禁止关闭,以便你进行多项等更多操作,这里我写了个小DEMO,可以参考一下。
测试效果:
测试代码:
namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("ID", typeof(int))); dt.Columns.Add(new DataColumn("Name", typeof(string))); dt.Columns.Add(new DataColumn("Age", typeof(int))); DataRow dr = dt.NewRow(); dr[0] = 1; dr[1] = "codeio"; dr[2] = 22; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = 2; dr[1] = "wknight"; dr[2] = 21; dt.Rows.Add(dr); dataGridView1.DataSource = dt; dataGridView1.ContextMenuStrip = contextMenuStrip1; dataGridView1.GotFocus += dataGridView1_GotFocus; } private void dataGridView1_GotFocus(object sender, EventArgs e) { ToolStripMenuItem tsm = new ToolStripMenuItem("选择显示项"); tsm.Enabled = false; ToolStripSeparator tss = new ToolStripSeparator(); contextMenuStrip1.Items.Add(tsm); contextMenuStrip1.Items.Add(tss); for (int i = 0; i < dataGridView1.Columns.Count; i++) { ToolStripMenuItem temp = new ToolStripMenuItem(dataGridView1.Columns[i].HeaderText); temp.Checked = dataGridView1.Columns[i].Visible; contextMenuStrip1.Items.Add(temp); } } private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { ToolStripMenuItem tsm = e.ClickedItem as ToolStripMenuItem; if (tsm != null) { tsm.Checked = !tsm.Checked; } } private void contextMenuStrip1_Closing(object sender, ToolStripDropDownClosingEventArgs e) { if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked) { e.Cancel = true; } } private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e) { for (int i = 2; i < contextMenuStrip1.Items.Count; i++) { ToolStripMenuItem tsm = contextMenuStrip1.Items[i] as ToolStripMenuItem; if (tsm != null) { dataGridView1.Columns[contextMenuStrip1.Items[i].Text].Visible = tsm.Checked; } } } } }
代码可以放到Form1.cs直接运行,只要你分别拖一个DataGridView和ContextMenuStrip控件到窗体上。
- 已建议为答案 ThankfulHeartModerator 2012年5月25日 5:04
- 已标记为答案 Bob ShenModerator 2012年6月7日 9:34