关于form.click的问题(事件委托)
namespace CreateLoadShowTest{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
//[SRCategory("CatAction")]
//[SRDescription("ControlOnClickDescr")]
public event EventHandler messarr;//自己定义的事件委托
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
messarr += new EventHandler(frm_Click);
messarr += new EventHandler(frm_Click2);
frm.Click += new EventHandler(frm_Click);
frm.Click(sender, e);//这个是调用C#里form定义的
this.messarr(sender, e);//自己定义的
frm.ShowDialog();
}
void frm_Click(object sender, EventArgs e)
{
MessageBox.Show("hhh");
}
void frm_Click2(object sender, EventArgs e)
{
MessageBox.Show("hhh2");
}
}
}
问题:1、为什么我自己定义的可以调用this.messarr(sender, e);,但是类似这样调用form.click却不行呢?请高手解释一下。谢谢
2、应该如何调用?
--------------------编程问答-------------------- 1:事件和委托的区别就是 虽然事件是一种委托 但是事件不能在对象外强制调用
2:调用onclick方法 一般onclick里面都是这样写的
if(click!=null)
{
var e=eventarg.empty;
click(this,e);
} --------------------编程问答-------------------- 直接调用frm.click的时候会如下错误提示:
错误 1 事件“System.Windows.Forms.Control.Click”只能出现在 += 或 -= 的左边 F:\C#\Projects\CreateLoadShowTest\CreateLoadShowTest\Form1.cs 32 17 CreateLoadShowTest
但是自己定义的没有这个错误!!! --------------------编程问答-------------------- 你先搞清楚事件是什么,
frm.Click += new EventHandler(frm_Click);
在这儿就报错吧?
Form2 根本就没有Click事件,
除非你在Form2也像下面这样定义:
public event EventHandler Click;
你要调用一个不存在的事件当然不行了
this.messarr是在本窗体中已经定义好了的
当然可以直接调用了 --------------------编程问答-------------------- frm.Click是事件,不能这么使用,要用的话应该是
frm_Click --------------------编程问答-------------------- onclick方法怎么调用? --------------------编程问答-------------------- form有click事件 --------------------编程问答-------------------- frm_click是private方法,我改成public到是可以用,但是只能用frm_click这一个方法,其他的+=new(其他)的就执行不到了 --------------------编程问答-------------------- frm.OnClick(); --------------------编程问答-------------------- To 1楼:
frm.OnClick()是Form类的protected方法,我没有覆盖写他,无法调用他啊!
再就是即使是在form2里,调用this.click(sender,e);仍然有那个错误提示,看来和是否在类本身里调用
没什么关系。 --------------------编程问答-------------------- frm.Click += new EventHandler(frm_Click);
你虽然给Click注册了frm_Click
但frm没有show
而且Click是frm的一种行为
而frm_Click就是这个行为具体要做的事。
具体微软怎么规定这个Click。
还是看下MSDN --------------------编程问答--------------------
楼主,真的不好意思,我刚看了一下,winform中form是有click事件的,
这个可能和你调用的参数有关系吧,
如果你在事件绑定的方法中没有调用sender,e,
那么你可以这样调用:
this.click(null,null);
另外,要注意事件的访问级别 --------------------编程问答-------------------- 1:这个看来我记错了 貌似是protected vitural的 方便继承的类重写事件发生是传递的一些参数
2:form2是继承自form,对于事件,只有定义的他的类才可以调用这个事件委托 你在form2里面可以调用OnClick方法
--------------------编程问答-------------------- To:ohkuy
现在的问题是和里面具体传递的参数没有关系,就是不知道为什么直接调用系统提供的event delegate就不行,而自己定义的就可以。
是我调用的方法不对,还是C#对系统自己的类的event delegate做了什么限制?
--------------------编程问答--------------------
没什么限制,就是人在哪个类中绑定了,就在哪个类中调用 --------------------编程问答-------------------- http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.click.aspx --------------------编程问答-------------------- to:xboxeer
在form里调用Onclick没错,这个会引起form.click事件,
难不成我这样用:
public void NewOnClick(EventArgs e)//由于Onclick保护,所以封装另外一层
{
base.OnClick(e); ;
}
private void button3_Click(object sender, EventArgs e)
{
this.NewOnClick(e);
}
在form1里:
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
messarr += new EventHandler(frm_Click);
messarr += new EventHandler(frm_Click2);
frm.Click += new EventHandler(frm_Click);
frm.NewOnClick(e);//这样用
frm.ShowDialog();
}
这感觉也太不爽了吧!!! --------------------编程问答-------------------- LZ考虑这样一种状况就能知道为什么只有事件的拥有者才可以调用事件了
sender参数和e,假设e里面包含鼠标的坐标和滚轮位置信息(事实上MouseClick事件的e参数就有),你在你自己的类里面调用click事件 你怎么知道如何给这两个参数赋值?但是Form类自身是知道的 所以可以给sender和e参数赋值 --------------------编程问答-------------------- 先不讨论给参数付值的事情,大家再想想,还有没有更好的方法能直接调用的。
补充:.NET技术 , C#