关于form.click的问题(事件委托)

DBgrid 2012-04-28 01:29:02
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、应该如何调用?
...全文
392 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
DBgrid 2012-04-28
  • 打赏
  • 举报
回复
先不讨论给参数付值的事情,大家再想想,还有没有更好的方法能直接调用的。
xboxeer 2012-04-28
  • 打赏
  • 举报
回复
LZ考虑这样一种状况就能知道为什么只有事件的拥有者才可以调用事件了
sender参数和e,假设e里面包含鼠标的坐标和滚轮位置信息(事实上MouseClick事件的e参数就有),你在你自己的类里面调用click事件 你怎么知道如何给这两个参数赋值?但是Form类自身是知道的 所以可以给sender和e参数赋值
DBgrid 2012-04-28
  • 打赏
  • 举报
回复
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();
}


这感觉也太不爽了吧!!!
全局变量 2012-04-28
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.click.aspx
ohkuy 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

To:ohkuy
现在的问题是和里面具体传递的参数没有关系,就是不知道为什么直接调用系统提供的event delegate就不行,而自己定义的就可以。
是我调用的方法不对,还是C#对系统自己的类的event delegate做了什么限制?
[/Quote]
没什么限制,就是人在哪个类中绑定了,就在哪个类中调用
DBgrid 2012-04-28
  • 打赏
  • 举报
回复
To:ohkuy
现在的问题是和里面具体传递的参数没有关系,就是不知道为什么直接调用系统提供的event delegate就不行,而自己定义的就可以。
是我调用的方法不对,还是C#对系统自己的类的event delegate做了什么限制?

xboxeer 2012-04-28
  • 打赏
  • 举报
回复
1:这个看来我记错了 貌似是protected vitural的 方便继承的类重写事件发生是传递的一些参数
2:form2是继承自form,对于事件,只有定义的他的类才可以调用这个事件委托 你在form2里面可以调用OnClick方法
[Quote=引用 9 楼 的回复:]

To 1楼:
frm.OnClick()是Form类的protected方法,我没有覆盖写他,无法调用他啊!

再就是即使是在form2里,调用this.click(sender,e);仍然有那个错误提示,看来和是否在类本身里调用
没什么关系。
[/Quote]
ohkuy 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

To 1楼:
frm.OnClick()是Form类的protected方法,我没有覆盖写他,无法调用他啊!

再就是即使是在form2里,调用this.click(sender,e);仍然有那个错误提示,看来和是否在类本身里调用
没什么关系。
[/Quote]
楼主,真的不好意思,我刚看了一下,winform中form是有click事件的,
这个可能和你调用的参数有关系吧,
如果你在事件绑定的方法中没有调用sender,e,
那么你可以这样调用:
this.click(null,null);
另外,要注意事件的访问级别
全局变量 2012-04-28
  • 打赏
  • 举报
回复
frm.Click += new EventHandler(frm_Click);
你虽然给Click注册了frm_Click
但frm没有show
而且Click是frm的一种行为
而frm_Click就是这个行为具体要做的事。
具体微软怎么规定这个Click。
还是看下MSDN
DBgrid 2012-04-28
  • 打赏
  • 举报
回复
To 1楼:
frm.OnClick()是Form类的protected方法,我没有覆盖写他,无法调用他啊!

再就是即使是在form2里,调用this.click(sender,e);仍然有那个错误提示,看来和是否在类本身里调用
没什么关系。
xboxeer 2012-04-28
  • 打赏
  • 举报
回复
frm.OnClick();
DBgrid 2012-04-28
  • 打赏
  • 举报
回复
frm_click是private方法,我改成public到是可以用,但是只能用frm_click这一个方法,其他的+=new(其他)的就执行不到了
DBgrid 2012-04-28
  • 打赏
  • 举报
回复
form有click事件
bdmh 2012-04-28
  • 打赏
  • 举报
回复
frm.Click是事件,不能这么使用,要用的话应该是
frm_Click
DBgrid 2012-04-28
  • 打赏
  • 举报
回复
onclick方法怎么调用?
ohkuy 2012-04-28
  • 打赏
  • 举报
回复
你先搞清楚事件是什么,
frm.Click += new EventHandler(frm_Click);
在这儿就报错吧?
Form2 根本就没有Click事件,
除非你在Form2也像下面这样定义:
public event EventHandler Click;
你要调用一个不存在的事件当然不行了
this.messarr是在本窗体中已经定义好了的
当然可以直接调用了
DBgrid 2012-04-28
  • 打赏
  • 举报
回复
直接调用frm.click的时候会如下错误提示:
错误 1 事件“System.Windows.Forms.Control.Click”只能出现在 += 或 -= 的左边 F:\C#\Projects\CreateLoadShowTest\CreateLoadShowTest\Form1.cs 32 17 CreateLoadShowTest
但是自己定义的没有这个错误!!!
xboxeer 2012-04-28
  • 打赏
  • 举报
回复
1:事件和委托的区别就是 虽然事件是一种委托 但是事件不能在对象外强制调用
2:调用onclick方法 一般onclick里面都是这样写的
if(click!=null)
{
var e=eventarg.empty;
click(this,e);
}

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧