我定义了三个button,事件就是Click
private void btn_1_Click(object sender, EventArgs e) { MessageBox.Show("Button1"); }
private void btn_2_Click(object sender, EventArgs e) { MessageBox.Show("Button2"); }
private void btn_3_Click(object sender, EventArgs e) { MessageBox.Show("Button3"); }定义一个新Button,btn_all
      btn_All.Click += btn_1_Click;
      btn_All.Click += btn_2_Click;
      btn_All.Click += btn_3_Click;
但执行时点一下btn_all没反应,点第二下才执行委托链的函数,显示123.
然后我定义一个EventArgs 类型的委托eh
EventHandler eh = new EventHandler(btn_1_Click);
            eh += new EventHandler(btn_2_Click);
            eh += new EventHandler(btn_3_Click);
            eh(sender, e);
这样执行点一次就行了。
我想知道Click事件的执行代码在哪,有没有类似 eh(sender, e);事件执行代码?
为什么上面的点两次才执行,下面点一次就治行了?

解决方案 »

  1.   

     btn_All.Click += btn_1_Click;
      btn_All.Click += btn_2_Click;
      btn_All.Click += btn_3_Click;
    你这个写在哪里?是不是写在按钮事件里,第一次点得时候没有注册事件,所以点第二次才会有
      

  2.   

    你试试这种写法,看看是否一次点击就ok
    btn_All.Click += new EventHandler(btn_1_Click);
      

  3.   

    加不加new EventHandler应该是一样的,没有这个也行,无伤大雅。1楼解释的我也想过。我也想知道事件触发的执行代码在哪?为什么看不到?
      

  4.   

    上面的多了一步click,而下面是通过委托后是直接click
      

  5.   

    上面的Click能显示的执行吗?就像下面的委托执行一样,代码显示出来
      

  6.   

    看一下窗體設計代碼是不是重複了Click方法
      

  7.   

    和那个没关系,那个窗体设计器里也是Click事件加载_Click函数,和我手动添加的加载函数方法一样。
      

  8.   

    我定义了三个button,事件就是Click
    private void btn_1_Click(object sender, EventArgs e) { MessageBox.Show("Button1"); }
    private void btn_2_Click(object sender, EventArgs e) { MessageBox.Show("Button2"); }
    private void btn_3_Click(object sender, EventArgs e) { MessageBox.Show("Button3"); }定义一个新Button,btn_all
      btn_All.Click += btn_1_Click;
      btn_All.Click += btn_2_Click;
      btn_All.Click += btn_3_Click;

    这个对吗?可以这样用吗,你用一个事件=一个方法返回..
    是不是应该用 
    new EventHandler(btn_1_Click);一下呢.
      

  9.   

    btn_All.Click += btn_1_Click;
    btn_All.Click += btn_2_Click;
    btn_All.Click += btn_3_Click;
    这段是写在哪的?
    要是写构造里应该不会有问题
      

  10.   

    如果一个事件=一个方法,要委托何用?new不new一样的,委托虽然和类性质差不多,但不需要new也行,直接
    委托名 委托实例=方法名,
    不需要委托名 委托实例=new 委托名(方法名)
    你的方法为本了委托的意义
      

  11.   

    执行代码是写在Button类里面的。
    你可以写一写自定义事件。  比较好写的是ValueChanged事件。定义一个委托,在set方法里加入事件。就可以了。
    不过类似于Click这种事件是系统从监听程序拿到的。
      

  12.   

    执行代码能否发图?找不到带两个参数(objevt sender,EventArgs e)的方法
      

  13.   

    protected virtual void OnClick(EventArgs e)引发事件时会通过委托调用事件处理程序。有关更多信息,请参见 引发事件。OnClick 方法还允许派生类对事件进行处理而不必附加委托。这是在派生类中处理事件的首选技术。继承者说明:在派生类中重写 OnClick 时,一定要调用基类的 OnClick 方法,以便已注册的委托对事件进行接收。
    13楼真牛人也!
      

  14.   

    public partial class Form1 : Form
        {
            //private bool BBB;
            Tokens t;
            public Form1()
            {            InitializeComponent();
                t = new Tokens();
                t.DDDValueChanged += new Tokens.DDDChanged(DDDChanged);
            }
            //Regex rx = new Regex(@"^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$");
            //Regex rx1 = null;        private void button1_Click(object sender, EventArgs e)
            {
                 
                t.DDD = "AA";
                t.DDD = "BB";
            }
            private void DDDChanged(object sender,string value)
            {
                MessageBox.Show(sender.ToString() + "    " + value);
                MessageBox.Show("事件触发了");
            }    } public class Tokens 
        {
            public delegate void DDDChanged(object sender, string value);
            public event DDDChanged DDDValueChanged;
            private string elements;
            public string DDD
            {
                get { return elements; }
                set { elements = value;
                DDDValueChanged.Invoke(this, value);
                }
            }
        }刚写的一个自定义事件。
    这东西真挺不好懂的。不过也不经常用。