簡體   English   中英

MDIParents表格和兒童活動

[英]Events in MDIParents Forms and Childs

如何處理兒童表單中的MDIParent表單事件? 例如,在“父表單”中,我有一個“在子網格上搜索”選項,當單擊該按鈕時,在子表單中,網格上的一行將獲得焦點。

我正在使用C#3.5 Windows Forms應用程序

提前致謝

對於該問題,我看到了兩種不同的選擇方式。

如果可以考慮將命令托管在MenuStrip ,並且該子窗體存在於MDI應用程序的多個實例中,則可以將命令添加到子窗體中的MenuStrip控件中。 這些菜單命令將自動與父表單中的命令合並,但是所有單擊事件都將在活動子表單中進行。

您可以通過MergeActionMergeIndex屬性控制子窗體中菜單命令與父窗體中命令的合並位置和方式。 如果使用這種方法,則可能應將子窗體中MenuStripVisible屬性設置為false以防止其占用窗體上不必要的空間。

我建議的第二個選項是創建一個用於定義搜索功能的接口,在支持該功能的子窗體中實現該接口,並根據MDI父窗體的MdiChildActivate事件啟用還是禁用該搜索功能。當前孩子是否支持。

第二種方法的簡化代碼示例:

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");
        }
    }
}

不太復雜:

public partial class Form1 : Form
{
    // other stuff...

    // e.g. some button's click event handler
    private void addChild_Click(object sender, EventArgs e)
    {
        Form2 child = new Form2();

        child.MdiParent = this;

        this.SomeEvent += child.SomeMethod();

        // other init stuff...
    }
}

只要確保子窗體上的處理程序方法的簽名與父級的事件處理程序委托的簽名匹配即可。

要注意的一件事是,如果您只希望活動的子窗體響應該事件。 在這種情況下,您可以創建這樣的輔助擴展方法

public static bool IsActiveMDIChild(this Form child)
{
    Form mdiParent = Form.ActiveForm;

    Form activeChild = mdiParent.ActiveMdiChild;

    return child == activeChild;
}

然后將這樣的代碼添加到SomeMethod()處理程序中:

public bool SomeMethod(*/ signature here /*)
{
    if(!this.IsActiveMDIChild()) return;

    //do stuff normally, we're in the active child form
}

在子窗體中,創建一個新事件供父窗體調用:

Friend Event search(ByVal token As String)

在父表單中,使用事件聲明子表單的實例:

Private WithEvents _FChild As frmChild

在父窗體中,當您要調用子窗體時,請引用已聲明的變量。 該事件應出現在智能感知中:

Private Sub searchChild_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearchChild.Click
               _FChild.search(txtToken)

您有一些代碼,以便我們提供更多幫助嗎?

無論如何,您都可以在子表單上創建自定義事件,並獲取父表單來訂閱這些事件

我現在正在做同樣的事情,這是我的做法:

  • 由於父級是引發事件的那個,因此該事件需要存在於父級表單上
  • 在加載子項的父項上的代碼期間(您在某個地方實例化了子窗體的代碼),在子窗體存在后,使用AddHandler將MDI父項上的事件與子窗體上的public子項綁定在一起
  • 當父窗體觸發事件時,子窗體的實例將處理該事件。

這有意義嗎? 我正在使用VB.NET,所以語言可能會略有不同,但這是我正在使用的通用技術。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM