MDIParents表格和孩子们的活动

Jon*_*edo 1 .net c# event-handling winforms

如何处理子项表单中的MDIParent表单事件?例如,在父窗体I中有一个选项"搜索子网格",当单击该按钮时,在子窗体中,网格上的一行会聚焦.

我使用C#3.5 Windows窗体应用程序

提前致谢

Fre*_*örk 5

我看到两种不同的方式,我会在这个问题之间做出选择.

如果您可以考虑在一个MenuStrip替代方案中托管命令,并且它与MDI应用程序中的多个实例中的子窗体相同,则可以将命令添加到MenuStrip子窗体中的控件.这些菜单命令将自动与父窗体中的命令合并,但任何单击事件都将在活动子窗体中执行.

您可以通过MergeActionMergeIndex属性控制子窗体中的菜单命令与父窗体中的命令的合并位置和方式.如果使用这种方法,您应该设置子表单中的Visible属性,以防止它占用表单上不必要的空间.MenuStripfalse

我建议的第二个选项是创建一个界面来定义搜索功能,在支持它的子表单中实现该接口,并使用MdiChildActivateMDI父表单的事件根据当前是否启用或禁用搜索功能孩子支持与否.

第二种方法的简化代码示例:

interface IGridSearch
{
    void PerformSearch(string criteria);
}

public partial class MdiChildUI : Form, IGridSearch
{
    public MdiChildUI()
    {
        InitializeComponent();
    }

    public void PerformSearch(string criteria)
    {
        // peform the search
    }        
}

public partial class MdiParentUI : Form
{
    public MdiParentUI()
    {
        InitializeComponent();
    }

    private void MdiParentUI_MdiChildActivate(object sender, EventArgs e)
    {
        SetControlStates();

    }

    private void SetControlStates()
    {
        _searchCommand.Enabled = (this.ActiveMdiChild is IGridSearch);
    }

    private void _searchCommand_Click(object sender, EventArgs e)
    {
        IGridSearch child = (this.ActiveMdiChild as IGridSearch);
        if (child != null)
        {
            child.PerformSearch("whatever to search for");
        }
        else
        {
            MessageBox.Show("Can't search in the active form");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)