簡體   English   中英

從另一個表單調用方法

[英]Method call from another form

我試圖從子窗體調用我父窗體上的方法,子窗體又調用我的自定義用戶控件中的方法。 如果我這樣做,我就能打電話......

以兒童形式:

private void btnSaveNode_Click(object sender, EventArgs e)
{
    frmMain frm = new frmMain();
    frm.getNodeData(txtPartName.Text);
    this.Hide();
}

在父母形式:

public void getNodeData(string partNbr)
{
    string strPartNbr = partNbr;
    buildNode(strPartNbr);
}

public void buildNode(string partNbr)
{
    drewsTreeView tv = new drewsTreeView();
    tv.addNode(partNbr);
}

最后,用戶控件中的方法

public void addNode(string strPartNbr)
{
    btnNode.Location = new Point(13, 13);
    btnNode.Width = 200;
    btnNode.Height = 40;
    //btnNode.Text = strPartNbr;
    btnNode.Text = "Testing";
    this.Controls.Add(btnNode);
    btnNode.Click += btnNode_Click;
}

所以我的問題是,按鈕不會在addNode()方法中構建。 如果我在主窗體的onLoad事件中調用該方法,它就構建得很好。 我在調試模式下運行,我可以看到方法被調用,正確的參數被傳遞。

那么為什么它會在從父級調用時構建按鈕,而不是從子級調用時?

一種方法是將您的frmMain實例傳遞給Form.Show()方法:

// ... in frmMain, displaying the "child" form:
frmChild child = new frmChild(); // <-- whatever your child type is
child.Show(this); // passing in a reference to frmMain via "this"

現在,在您的子表單代碼中,您可以將Form.Owner屬性轉換回您的frmMain類型並使用它執行某些操作:

private void btnSaveNode_Click(object sender, EventArgs e)
{
    frmMain frm = (frmMain)this.Owner;
    frm.getNodeData(txtPartName.Text);
    // ...
}

一般來說,如果你在方法調用中實例化一個表單並且你沒有對它做一些事情,比如將它保存到實例變量或Show()它那么你就犯了一個錯誤。 用戶從未看到過該表單,只是在您的方法退出后才收集垃圾。

此外,您將以基本相同的方式修改相同的按鈕,並將其多次添加到同一表單。 不要這樣做。 了解參考語義

如果您希望您的子表單能夠在父表單中發生某些事情,您可以讓父表單向子表單提供自己的引用。 最好讓父母為子女提供子女可以根據需要調用的代理人

暫無
暫無

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

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