最近涉及.net,做了一个公共的父窗体(例如名为frmMain,上面有公共的工具条),其余的窗体在其中显示(如frmChild1),现在在frmMain中触发工具条的事件,我想在子窗体中获取该消息,该如何做,望各位高手指教。

解决方案 »

  1.   

    观察一下当点击公共父窗体的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简单实现就行啦:-)
      

  2.   

    错了,在frmChild的MyFunc里通过
    ((ToolBar)sender).Buttons.IndexOf(e.Button)
    检索到主窗口被点击按钮的索引.
      

  3.   

    其实照你的应用看,还是简单的用delegate实现一下吧。我这么搞,其实达到的效果是:主窗口的ToolBar既做他原来做的事,又能通知子窗口自己被点击的事。如果主窗口的ToolBar上某几个按钮专门是用来通知子窗口的,那就完全没必要搞的这么复杂了。用delegate或者更简单的,执行子窗口的public方法不就行了吗?
      

  4.   

    谢谢各位指点,这样还有一个问题,因为存在几个子窗体,而工具条的消息只需要传递给最上面的那个窗体,如果按照this.toolBarMain.ButtonClick += new ToolBarButtonClickEventHandler(frmChild.MyFunc);定义,那么所有的打开窗体都会接受到该消息,问只让最上面的窗体响应该如何设置,谢谢
      

  5.   

    我举的例子也正好是一个子窗体订阅事件的情况啊。
    frmChild是你应用中的最上面的那个窗体的话不就OK了吗?不会像你说的打开的窗体都会接受到该消息。谁订阅谁收到。
      

  6.   

    楼主,可以用反射啊,根本不要事件绑定!!
    设你要激活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);
    }
    }
      

  7.   

    没明白你的意思。不过取消订阅:
    this.toolBarMain.ButtonClick -= new ToolBarButtonClickEventHandler(frmChild.MyFunc);