protected void Button2_Click(object sender, EventArgs e)

   TestClick tc = Button3_Click;
   tc(sender, e);
}
public delegate void TestClick(object sender, EventArgs e);protected void Button3_Click(object sender, EventArgs e)
{
   Response.Write("button3 clicked");
}如上代码!我可以用委托来实现,点击BTN2时执行BTN3的事件.现在的问题是:假设有N个按钮点击事件.如果我现在点击BTN2时不确定要执行哪个按钮的事件(要通过程序自己判断,请问如何实现?也就是说:TestClick tc ;
if (a==1)
tc= ??????(Button3_Click);
if (a=2)
tc= ??????(Button4_Click);
tc(sender, e);这里的Button3_click 是Void类型,要定义什么类型的变量来对取得这个值.(我看控件的事件属性里比如ONCLICK事件,可以选择哪个事件.但是当我这样做时却不行:
EventHandle aa=Button3_click;
tc=aa;

EventArags aa= Button3_click;
tc=aa;
---------------------------------------
求教高手,分不够再加!

解决方案 »

  1.   

    不明白这里为什么要用委托?
    Button3_Click、Button4_Click不是预先定义的么,如果是代码编写的时候就已经确定内容的函数,Button2 Click的时候根本不需要用什么委托。这样写就可以了。
    if (a==1)
        Button3_Click(sender,e);
    if (a=2)
        Button4_Click(sender,e);
      

  2.   

    public delegate void TestClick(object sender, EventArgs e);
    public event TestClick tc;if (a==1)
    this.tc += new TestClick(Button3_click); 
    if (a=2)
    this.tc += new TestClick(Button4_click);这样可以吗?
      

  3.   

    TestClick tc ;
    if (a==1)
    tc(Button3_Click);
    if (a=2)
    tc(Button4_Click);
      

  4.   

    通过sender不能知道是哪个控件么?
      

  5.   

    你要想实现Button3的click事件的处理函数没必要用委托,直接
    Button3_Click(null,null);就行
      

  6.   

    xiyun 的回答貌似是那么回事,可以写个示例吗?
      

  7.   

    public class MyControl
    {
     ... public event EventHandler BtnClick; private void btn_Click(object sender, eventArgs e)
     {
       if(BtnClick != null) BtnClick.Invork(sender, e);
     }
    }public class MyForm : Form
    {
     public MyForm()
     {
      myControl.BtnClick += new EventHandler(myControl_BtnClick);
     }
     private void myControl_BtnClick(object sender, eventArgs e)
     {
       ...
     }
    }============
    手写的代码,不知道有没有错误,大概意思是这样的了
      

  8.   

    o,这错了,多打了个invorkprivate void btn_Click(object sender, eventArgs e) 
     { 
       if(BtnClick != null) BtnClick(sender, e); 
     } 
      

  9.   

    首先,我把你的问题再重复一下,看看理解对不对?
    你是想在点击btn2时动态触发某个方法,对不?可以动态托管某个事件,也可以动态加载某段文本来执行,如果是这样的,我可以把我的例子源代码发给你了。
      

  10.   

    楼主说的不明不白的。先把自己的语言组织好,让人看了头大。
    xiyun兄演示只是如何建立事件并使用,应该不是楼主想要的。
      

  11.   

    下面是我写的一个动态添加托管事件的代码,可以随便选择的。指定控件名、事件名和方法名,就可以添加或删除事件了。对了,还支持动态脚本来作为需要托管的方法。private bool MyEventHandler(bool IsAddEvent, object controlName, string EventName, string MethodName)
            {
                bool result = true;
                try
                {
                    //事件
                    Type objType = Type.GetType("WindowsApplication2.Form2");
                    EventInfo eventname = null;
                    eventname = controlName.GetType().GetEvent(EventName);
                    Type objEventHandlerType = eventname.EventHandlerType;
                    //方法
                    BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static;
                    MethodInfo miHandler = objType.GetMethod(MethodName, flags);
                    if(checkBox1.Checked)
                    {
                        if (String.IsNullOrEmpty(textBox2.Text))
                        {
                            MessageBox.Show("Please input code.");
                            textBox2.Focus();
                            return false;
                        }
                        if (null == GettedMethod)
                        {
                            GettedMethod = GetMethod(textBox2.Text);
                        }
                        else
                        {
                            if (IsChanged)
                            {
                                //删除
                                Delegate dEvent = Delegate.CreateDelegate(objEventHandlerType, null, GettedMethod);
                                eventname.RemoveEventHandler(controlName, dEvent);
                                GettedMethod = GetMethod(textBox2.Text);
                            }
                        }
                        miHandler = GettedMethod;
                    }
                    //创建委托
                    Delegate delegateEvent = Delegate.CreateDelegate(objEventHandlerType, null, miHandler);
                    //绑定
                    if (IsAddEvent)
                        eventname.AddEventHandler(controlName, delegateEvent);
                    else
                        eventname.RemoveEventHandler(controlName, delegateEvent);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                    LastError = ex.Message;
                    GettedMethod = null;
                    result = false;
                }
                return result;
            }
      

  12.   

    匿名方法(C#2.0以上)BTN2.Click += delegate{ButtonClick(a);}void ButtonCLick(a) {
        switch(a) {...}
    }
    顺便说一下:这是很基础的问题,熟练C#语法的都应该会,而不是所谓的“高手”专利!
      

  13.   

    遍历所有的Button名,然后添加委托
      

  14.   

    LZ, 凡是语言层面的东西,都永远只是初级的,入门的。除非你有本事去研究类型系统,语言理论。既然LZ要高手的答复,那我可以给你个中手的解决方案,将a等于多少归结于不同状态,采用状态模式来解决你的问题。
      

  15.   

    有必要用到委托吗
    用Sender不就可以判断出来了?
    Button btn=new Button();
           btn=(Button)Sender ...
    根据btn.Id执行相应的方法
      

  16.   

    if(((Button)sender).text=="button1")
    {
        label.text="you click button1";
    }
    if(((Button)sender).text=="button2")
    {
        label.text="you click button2";
    }
      

  17.   

    看来楼主也是个垃圾..
    菜鸟怎么了?。。看看是给你面子。什么叫不要浪费时间。
       
      我不知道你上面写了些什么东东
    //看下面的话
    如上代码!我可以用委托来实现,点击BTN2时执行BTN3的事件.现在的问题是:假设有N个按钮点击事件.如果我现在点击BTN2时不确定要执行哪个按钮的事件(要通过程序自己判断,请问如何实现?也就是说: 
    -----
    如果是N个的话我建议用数组或泛型做,
    动态邦定在一个事件上通过for或别的方法(自己写一个标示自己的东西,方法很多)
    执行你想要到结果..
    自己接来的自己想法.
    不敢看完了怕浪费您的时间了
      

  18.   

    很就没搞C#了,sender不是摆设吧,,查查
      

  19.   

    定义一个全局变量。点击其余控件时记录其sender。将其保存下来,在btn2中调用。objece Isender;protected void Button1_Click(object sender, EventArgs e)
    {    
       Isender = sender;
    }protected void Button2_Click(object sender, EventArgs e)
    {    
      if (Isender != null)
      {
        TestClick tc = new TestClick(Isender, e);
        tc(sender, e);
      }
    }
      

  20.   

    关键是要用你的事件来判断此sender指向何处。可以指向自身,也可以指向其余的控件。