none
多文档窗体中,如何通过单击父窗体按钮调用当前活动子窗体的方法? RRS feed

  • 问题

  • 做数据库编程免不了要"增删改查",很多子窗体都有相似的功能,因此我想在父窗体中用相同的按钮调用活动子窗体中对应的功能,也就是说子窗体不提供菜单和工具栏,只提供要调用的方法,只有父窗体上有菜单栏和工具栏.

    比如:当前有frmA/frmB/frmC三个子窗体被打开,点击父窗体frmP中的"保存"按钮btnSv,就自动调用当前活动子窗体中对应的保存方法,假定,frmA的方法名为svA(),frmB的方法名为svB(),frmC的方法名为svC().

    那么这个父窗体frmP中的保存按钮btnSv的代码该如何写呢(这里面临判断子窗体、调用子窗体方法两个问题),希望各位老师给个完整的示例代码


    LJH

    2013年2月1日 7:57

答案

  • 使用Form.ActiveMdiChild属性得到当前活动的MDI子窗体。

    e.g.

    先定义一个接口ISavable,表示可以保存的东西。

    interface ISavable
    {
        void Save();
    }

    MDI主窗体中的“保存”按钮的Click事件处理器:

    void SaveClick(object sender, EventArgs e)
    {
        ISavable activeChild = this.ActiveMdiChild as ISavable;
        if (activeChild != null)
            activeChild.Save();
    }

    每个MDI子窗体去实现ISavable接口,例如:

    partial class ReallySimpleSavableForm : Form
    {
        public ReallySimpleSavableForm()
        {
            this.InitializeComponent();
        }
        public void Save() { /*...*/ }
    }

    2013年2月2日 15:50

全部回复

    1. 写一个接口类包含增、删、改方法,让所有子窗体都去实现
    2. 主窗体增加一个 "当前窗体" 的属性,切换子窗体时将当前子窗体设为 "当前窗体"
    3. 点击按钮时调用 "当前窗体对应的增、删、改方法

    知识改变命运,奋斗成就人生!


    2013年2月1日 8:15
    版主
  • 谢谢肖小勇老师的帮助,思路大致是这样,但我希望看到详细的示例代码。

    LJH

    2013年2月2日 0:58
  • 使用Form.ActiveMdiChild属性得到当前活动的MDI子窗体。

    e.g.

    先定义一个接口ISavable,表示可以保存的东西。

    interface ISavable
    {
        void Save();
    }

    MDI主窗体中的“保存”按钮的Click事件处理器:

    void SaveClick(object sender, EventArgs e)
    {
        ISavable activeChild = this.ActiveMdiChild as ISavable;
        if (activeChild != null)
            activeChild.Save();
    }

    每个MDI子窗体去实现ISavable接口,例如:

    partial class ReallySimpleSavableForm : Form
    {
        public ReallySimpleSavableForm()
        {
            this.InitializeComponent();
        }
        public void Save() { /*...*/ }
    }

    2013年2月2日 15:50
  •          非常感谢各位老师帮助,特别感谢Gee Law的回复,本示例代码正表达了我的意图,谢谢!

    LJH

    2013年2月4日 6:50