定义按钮but_1这个控件,添加如下事件
AddHandler but_1.MouseUp, AddressOf MouseUp1怎么样可以让MouseUp1是一个字符串变量,而不是已定义好的函数或过程呢?

解决方案 »

  1.   


    这里貌似是C#版,LZ跑来这里问VB
      

  2.   

    我觉得你不如问“怎么样让AddHandler”是一个字符串变量,而不是一个方法名。因为csdn上有不少人也这样问过。不搞“万能”的字符串编程,而是强类型的编译和编程,有它的道理。许多看似万能的东西往往很明显是性能低劣、难以调试、难以维护的。想要灵活,必定有基于接口、基于多态等等设计方法需要掌握,需要学会设计方法,而不是搞“万能字符串”编程。
      

  3.   

    C#代码but_1.MouseUp += MouseUp1;更正以上代码
    Button[] butList = new Button[3];
    butList(0) = new Button();我的想法是数组里面每个按钮时面的事件都不一样
      

  4.   

    通过第三个方法反射来调用Imports System.ReflectionPublic Class Form1    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click        AddHandler Button2.Click, AddressOf FC    End Sub    Private Sub FC(sender As System.Object, e As System.EventArgs)
            Dim t As Type = Me.GetType
            Dim mi As MethodInfo = t.GetMethod("F" & TextBox1.Text)
            Dim a As Object() = {sender, e}
            mi.Invoke(Me, a)    End Sub    Public Sub FA(sender As System.Object, e As System.EventArgs)
            MessageBox.Show("A")
        End Sub    Public Sub FB(sender As System.Object, e As System.EventArgs)
            MessageBox.Show("B")
        End SubEnd Class
      

  5.   

    明显需要使用assembly,如果你不考虑性能的话。
      

  6.   


    Dictionary<String,Handle> a = new Dictionary<String,Handle>();
    a.Add("HandleName1",Handle1);
    a.Add("HandleName2",Handle2);
    a.Add("HandleName3",Handle3);click += new Handle(a[HandleName]);是这样吗?
      

  7.   

    不太明白楼主的问题,不过我一般会这样写
    以下是根据一个枚举,生成几个支付按钮的.private void LoadMethod()
    {
    Array ar = Enum.GetValues(typeof(PaymentTypeDefine));
    foreach (var i in ar)
    {
    if (i.ToString().IndexOf("免费") < 0)
    {
    MyButton btn = new MyButton();
    btn.Text = i.ToString();
    btn.CssClass = "btn";
    btn.Click += new EventHandler(this.Pay);
    pl_btn.Controls.Add(btn);
    }
    }
    }以下是事件处理函数的代码.当然是简化了的private void Pay(object sender, EventArgs e)
    {
    Button btn = (Button)sender;
    PaymentTypeDefine p = (PaymentTypeDefine)Enum.Parse(typeof(PaymentTypeDefine), btn.Text);
    Label lbl = new Label();
    lbl.Attributes.Add("style", "color:#f00");
    lbl.Text = p.ToString();
    pl_btn.Controls.Add(lbl);
    }
      

  8.   


    PaymentTypeDefine 是什么没搞明白
      

  9.   

    这个好所有函数或过程只能在From本身中定义,就失去我的本意了,因为我的From本来也是动态的。
      

  10.   

    dimerchan

    jy251
    能给更详细的例子么
    对委托还真的不了解。谢谢
      

  11.   


    这只是个示意,重点是btn.Click += new EventHandler(this.Pay);
    这里为每个按钮定义了事件处理函数.
      

  12.   

    btn.Click += new EventHandler(this.Pay);
    关键是Pay不确定。
    如一个二维数据组
    for(i=0;i<10;i++){
    btnList(i)(0).Click +=New EventHandler(btnList(i)(1));
    }
    这样创建
      

  13.   

    或btnList是一维数组,另一个数组btnListFunction()跟btnList同样长度
    for(i=0;i<10;i++){
    btnList(i).Click +=New EventHandler(btnListFunction(i));
    }
      

  14.   

    事件的处理可以是这样private void Pay(object sender, EventArgs e)
    {
                Button btn = (Button)sender;
                PaymentTypeDefine p = (PaymentTypeDefine)Enum.Parse(typeof(PaymentTypeDefine), btn.Text);
                Label lbl = new Label();
                lbl.Attributes.Add("style", "color:#f00");
                lbl.Text = p.ToString();
                pl_btn.Controls.Add(lbl);
            }Pay是处理事件的函数,只要它的参数是(object sender, EventArgs e),就可以被执行,
    sender就是触发事件的对象,在这里将是被点击的button,
    Button btn = (Button)sender;
    在这里我将它读取出来
      

  15.   

    你没搞明白我的意思,我的意思Pay这个函数不确定,具体是执行那个是从数据库中读取或配置文件中读取
      

  16.   

    坦白的说,楼主的这个需求,我没有处理过.所以我参考了以下网址
    http://www.cnblogs.com/daxnet/archive/2010/03/19/1689838.html
    并且写了一个测试片段,这可能是楼主需要的.using System;
    using System.Reflection;
    using System.Windows.Forms;namespace Test
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    object obj = Assembly.Load("Test").CreateInstance("Function.Funcs");
    Button btn = new Button();
    MethodInfo m = obj.GetType().GetMethod("Func1");
    EventInfo e = btn.GetType().GetEvent("Click");
    Delegate d = Delegate.CreateDelegate(e.EventHandlerType, m);
    e.AddEventHandler(btn, d);
    btn.Text = "确定";
    this.Controls.Add(btn);
    }
    }
    }namespace Function
    {
    class Funcs
    {
    public static void Func1(object sender, EventArgs e)
    {
    Button btn = (Button)sender;
    MessageBox.Show(btn.Text);
    }
    }
    }
      

  17.   

    新建一个名叫Test的window窗体应用程序,将上述代码拷贝到Form1的代码文件中并运行,可以看到效果.
      

  18.   

    楼主就是想写一个DLL,然后配置一下数据库或者xml文件,就能直接调用哪个dll里的功能了吧。这个是插件编程,有专门的方法,一开始就应该先写接口,然后通过注入来实现,而不是你想的这种"字符串编程"
      

  19.   

    委托delegate就是C里面的函数指针,你就这样认为就行了,与你写的handle是差不多的。
    委托在申明的时候需要写出函数类型,比如返回值,参数列表等。
    委托申明了之后,可以对委托进行实例化,而这个实例化的对象就是一个handle,你使用这个handle就可以了。
    你再10楼已经写出了伪代码了。
    Dictionary<String,Handle> a = new Dictionary<String,Handle>();
    你把handle换成你申明的委托类型就可以了,你要调用的时候写错了一点,应该是click+=a[string],就可以了。
      

  20.   

    对了,你要是用+=挂上了一个delegate,那么你不再使用它,或者你要换成其他的delegate替换他之前,你记得要-=来卸载,否则后果就是你的click会调用两个delegate,之前那个也会被调用。
      

  21.   


    这样确实可行。
    不过很奇怪的是,同样的代码,换成vb.net就返回空值Dim obj As Object = Assembly.Load("testvb").CreateInstance("WindowsFormsApplication1.Funcs")
    object obj = Assembly.Load("btocc").CreateInstance("btocc.App_Codde.FromEv");C#没任何问题。
    难不成真的要我转向c#,刚买的书,还没做好准备呢
      

  22.   

    vb.net没写过,应该和语言没有关系,楼主可以分别调试一下Load()和CreateInstance()看到底是哪里返回了nothing.
      

  23.   

    Load有返回值,CreateInstance就返回nothing了。我也很奇怪,我查msdn,上面也没说c# 跟vb有区别
      

  24.   

    可以做到,不过稍微有点麻烦可以继承 ControlBuilder 或者 BuildProvider 去自己提供编译生成机制,在其中获取原始代码,而后使用codedom去临时替换你需要的代码这玩意不属于正常编程手段,已经类似hacker的手段了。
      

  25.   

    Dim obj As Object = Assembly.Load("testvb").CreateInstance("WindowsFormsApplication1.Funcs")
    C# code
    object obj = Assembly.Load("btocc").CreateInstance("btocc.App_Codde.FromEv");
    Assembly.Load("testvb")是程序集,你vb既然建立的是WindowsFormsApplication1,为什么不用这么名字呢?Dim obj As Object = Assembly.Load("WindowsFormsApplication1").CreateInstance("WindowsFormsApplication1.Funcs")
      

  26.   

    按hztltgg的方法搞定,同时也测试jy251方法,可能是我这边出错,没成功。
    非常感谢hztltgg,同进也感谢所有回贴的同志
      

  27.   

    更正,按xuStanly的方法搞定的。