none
多控件共享一个菜单问题 RRS feed

  • 问题

  • 我现在有24个按钮,每个按钮的右键菜单属性都关联了同一个菜单 我想实现的是:在任意一个按钮上右击选择一项菜单,然后把菜单的TEXT赋给按钮的TEXT 请问怎么判断当前用户是在哪一个按钮上选择的菜单?
    2011年3月21日 2:47

答案

  • dear
    1.先加入contextMenuStrip1.Opening事件并设定中断
    private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
    {
    }
    2.在按钮按右键,此时会触发Opening事件,接着观察sender参数的SourceControl属性,由该属性就可得知contextMenuStrip1是被谁呼叫
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已标记为答案 A_Big_Mess 2011年3月21日 7:55
    2011年3月21日 7:24
  • 你好!

    可能是你的代码其它问题所致,参考下面的示例:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
          InitializeDemo();
        }
    
        void InitializeDemo()
        {
          ContextMenuStrip menu = new ContextMenuStrip();
    
          menu.Items.Add("1").Click += (o, e) =>
          {
            var menuItem = o as ToolStripItem;
            var button = menu.SourceControl as Button;
            MessageBox.Show(string.Format("MenuText:{0},ButtonText{1}", menuItem.Text, button.Text));
          };
    
          menu.Items.Add("2").Click += (o, e) =>
          {
            var menuItem = o as ToolStripItem;
            var button = menu.SourceControl as Button;
            MessageBox.Show(string.Format("MenuText:{0},ButtonText{1}", menuItem.Text, button.Text));
          };
    
          for (int i = 0; i < 10; i++)
          {
            Button b = new Button() { Text = i.ToString() };
            b.ContextMenuStrip = menu;
            b.Dock = DockStyle.Top;
            this.Controls.Add(b);
          }
        }
      }
    }
    
    


    知识改变命运,奋斗成就人生!
    • 已标记为答案 A_Big_Mess 2011年3月21日 7:54
    2011年3月21日 7:33
    版主

全部回复

  • 用 ContextMenuStrip 的 SourceControl 属性,指上一次使用菜单的控件
    知识改变命运,奋斗成就人生!
    2011年3月21日 5:34
    版主
  • 用 ContextMenuStrip 的 SourceControl 属性,指上一次使用菜单的控件
    知识改变命运,奋斗成就人生!
    结果是: 未将对象引用设置到对象的实例 还有别的方法吗?
    2011年3月21日 6:25
  • dear
    1.先加入contextMenuStrip1.Opening事件并设定中断
    private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
    {
    }
    2.在按钮按右键,此时会触发Opening事件,接着观察sender参数的SourceControl属性,由该属性就可得知contextMenuStrip1是被谁呼叫
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已标记为答案 A_Big_Mess 2011年3月21日 7:55
    2011年3月21日 7:24
  • 你好!

    可能是你的代码其它问题所致,参考下面的示例:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
          InitializeDemo();
        }
    
        void InitializeDemo()
        {
          ContextMenuStrip menu = new ContextMenuStrip();
    
          menu.Items.Add("1").Click += (o, e) =>
          {
            var menuItem = o as ToolStripItem;
            var button = menu.SourceControl as Button;
            MessageBox.Show(string.Format("MenuText:{0},ButtonText{1}", menuItem.Text, button.Text));
          };
    
          menu.Items.Add("2").Click += (o, e) =>
          {
            var menuItem = o as ToolStripItem;
            var button = menu.SourceControl as Button;
            MessageBox.Show(string.Format("MenuText:{0},ButtonText{1}", menuItem.Text, button.Text));
          };
    
          for (int i = 0; i < 10; i++)
          {
            Button b = new Button() { Text = i.ToString() };
            b.ContextMenuStrip = menu;
            b.Dock = DockStyle.Top;
            this.Controls.Add(b);
          }
        }
      }
    }
    
    


    知识改变命运,奋斗成就人生!
    • 已标记为答案 A_Big_Mess 2011年3月21日 7:54
    2011年3月21日 7:33
    版主