C#代码but_1.MouseUp += MouseUp1;更正以上代码 Button[] butList = new Button[3]; butList(0) = new Button();我的想法是数组里面每个按钮时面的事件都不一样
通过第三个方法反射来调用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
明显需要使用assembly,如果你不考虑性能的话。
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]);是这样吗?
不太明白楼主的问题,不过我一般会这样写 以下是根据一个枚举,生成几个支付按钮的.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); }
PaymentTypeDefine 是什么没搞明白
这个好所有函数或过程只能在From本身中定义,就失去我的本意了,因为我的From本来也是动态的。
dimerchan 跟 jy251 能给更详细的例子么 对委托还真的不了解。谢谢
这只是个示意,重点是btn.Click += new EventHandler(this.Pay); 这里为每个按钮定义了事件处理函数.
委托delegate就是C里面的函数指针,你就这样认为就行了,与你写的handle是差不多的。 委托在申明的时候需要写出函数类型,比如返回值,参数列表等。 委托申明了之后,可以对委托进行实例化,而这个实例化的对象就是一个handle,你使用这个handle就可以了。 你再10楼已经写出了伪代码了。 Dictionary<String,Handle> a = new Dictionary<String,Handle>(); 你把handle换成你申明的委托类型就可以了,你要调用的时候写错了一点,应该是click+=a[string],就可以了。
这里貌似是C#版,LZ跑来这里问VB
Button[] butList = new Button[3];
butList(0) = new Button();我的想法是数组里面每个按钮时面的事件都不一样
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
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]);是这样吗?
以下是根据一个枚举,生成几个支付按钮的.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);
}
PaymentTypeDefine 是什么没搞明白
跟
jy251
能给更详细的例子么
对委托还真的不了解。谢谢
这只是个示意,重点是btn.Click += new EventHandler(this.Pay);
这里为每个按钮定义了事件处理函数.
关键是Pay不确定。
如一个二维数据组
for(i=0;i<10;i++){
btnList(i)(0).Click +=New EventHandler(btnList(i)(1));
}
这样创建
for(i=0;i<10;i++){
btnList(i).Click +=New EventHandler(btnListFunction(i));
}
{
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;
在这里我将它读取出来
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);
}
}
}
委托在申明的时候需要写出函数类型,比如返回值,参数列表等。
委托申明了之后,可以对委托进行实例化,而这个实例化的对象就是一个handle,你使用这个handle就可以了。
你再10楼已经写出了伪代码了。
Dictionary<String,Handle> a = new Dictionary<String,Handle>();
你把handle换成你申明的委托类型就可以了,你要调用的时候写错了一点,应该是click+=a[string],就可以了。
这样确实可行。
不过很奇怪的是,同样的代码,换成vb.net就返回空值Dim obj As Object = Assembly.Load("testvb").CreateInstance("WindowsFormsApplication1.Funcs")
object obj = Assembly.Load("btocc").CreateInstance("btocc.App_Codde.FromEv");C#没任何问题。
难不成真的要我转向c#,刚买的书,还没做好准备呢
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")
非常感谢hztltgg,同进也感谢所有回贴的同志