C#中如何获取父窗体消息的问题 最近涉及.net,做了一个公共的父窗体(例如名为frmMain,上面有公共的工具条),其余的窗体在其中显示(如frmChild1),现在在frmMain中触发工具条的事件,我想在子窗体中获取该消息,该如何做,望各位高手指教。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 观察一下当点击公共父窗体的ToolBar时Visual Studio怎样自动生成的代码this.toolBarMain.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBarMain_ButtonClick);事件处理函数private void toolBarMain_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e){...}子窗口可以订阅ToolBar的ButtonClick事件如在主窗口代码中打开子窗口时FormChild frmChild = new FormChild();this.toolBarMain.ButtonClick += new ToolBarButtonClickEventHandler(frmChild.MyFunc);frmChild.Show();//子窗口不重复显示的代码就不写了。这样在FormChild里定义一个public void MyFunc(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e){//在这里就可以捕获到所有主窗口ToolBar按钮被点击事件啦。//只要主窗口的的按钮被点击,frmChild.MyFunc也肯定被执行的,或者说被通知到的。 switch(toolBarMain.Buttons.IndexOf(e.Button)) { case 0: .... }}如果只是想在主窗口ToolBar某个特定按钮被点击时被通知到也就没必要做这么复杂了。用个delegate简单实现就行啦:-) 错了,在frmChild的MyFunc里通过((ToolBar)sender).Buttons.IndexOf(e.Button)检索到主窗口被点击按钮的索引. 其实照你的应用看,还是简单的用delegate实现一下吧。我这么搞,其实达到的效果是:主窗口的ToolBar既做他原来做的事,又能通知子窗口自己被点击的事。如果主窗口的ToolBar上某几个按钮专门是用来通知子窗口的,那就完全没必要搞的这么复杂了。用delegate或者更简单的,执行子窗口的public方法不就行了吗? 谢谢各位指点,这样还有一个问题,因为存在几个子窗体,而工具条的消息只需要传递给最上面的那个窗体,如果按照this.toolBarMain.ButtonClick += new ToolBarButtonClickEventHandler(frmChild.MyFunc);定义,那么所有的打开窗体都会接受到该消息,问只让最上面的窗体响应该如何设置,谢谢 我举的例子也正好是一个子窗体订阅事件的情况啊。frmChild是你应用中的最上面的那个窗体的话不就OK了吗?不会像你说的打开的窗体都会接受到该消息。谁订阅谁收到。 楼主,可以用反射啊,根本不要事件绑定!!设你要激活frmChild中的SayHello(string text)方法,只要这样frmChild child = new frmChild();InvokeMethod(child, "SayHello", new object[]{"WOrld!"});void InvokeMethod(Form frm, string methodName, object[] args) { Type t = frm.GetType(); BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static; MethodInfo m = t.GetMethod(methodName, flags); if (m != null) { m.Invoke(frm, args); } } 没明白你的意思。不过取消订阅:this.toolBarMain.ButtonClick -= new ToolBarButtonClickEventHandler(frmChild.MyFunc); 字段类型问题 关于foreach in 的问题 gridview绑定数据源,数据源是一个用存储过程select出来的结果,如何做 请帮忙看下这个winform分页控件 c# 联动 MY SQL 方法 公司面試題目請教 在lable的borderstyle里添加一个四个角是圆弧的正方形边框。 C#简单类问题(50) C# WinForm DataGridView 表格的数据有加载,但显示不正常,鼠标移上去才有显示? 急!关于c#读取文件内容数据自带逗号,引号的问题 求教高人:winform 窗体间怎么穿递消息。 关于父子窗体间消息的传递
this.toolBarMain.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBarMain_ButtonClick);
事件处理函数
private void toolBarMain_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e){...}子窗口可以订阅ToolBar的ButtonClick事件
如在主窗口代码中打开子窗口时
FormChild frmChild = new FormChild();
this.toolBarMain.ButtonClick += new ToolBarButtonClickEventHandler(frmChild.MyFunc);
frmChild.Show();
//子窗口不重复显示的代码就不写了。
这样在FormChild里定义一个
public void MyFunc(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
//在这里就可以捕获到所有主窗口ToolBar按钮被点击事件啦。
//只要主窗口的的按钮被点击,frmChild.MyFunc也肯定被执行的,或者说被通知到的。
switch(toolBarMain.Buttons.IndexOf(e.Button))
{
case 0:
....
}
}如果只是想在主窗口ToolBar某个特定按钮被点击时被通知到也就没必要做这么复杂了。用个delegate简单实现就行啦:-)
((ToolBar)sender).Buttons.IndexOf(e.Button)
检索到主窗口被点击按钮的索引.
frmChild是你应用中的最上面的那个窗体的话不就OK了吗?不会像你说的打开的窗体都会接受到该消息。谁订阅谁收到。
设你要激活frmChild中的SayHello(string text)方法,只要这样frmChild child = new frmChild();
InvokeMethod(child, "SayHello", new object[]{"WOrld!"});
void InvokeMethod(Form frm, string methodName, object[] args)
{
Type t = frm.GetType();
BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static; MethodInfo m = t.GetMethod(methodName, flags);
if (m != null)
{
m.Invoke(frm, args);
}
}
this.toolBarMain.ButtonClick -= new ToolBarButtonClickEventHandler(frmChild.MyFunc);