从另一个窗体调用方法

本文关键字:方法 调用 窗体 另一个 | 更新日期: 2023-09-27 18:01:12

我正试图从子窗体调用父窗体上的一个方法,而子窗体又调用我的自定义用户控件中的方法。如果我这样做,我可以打电话。。。

以儿童形式:

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);
    // ...
}

通常,如果您在方法调用中实例化一个表单,而您没有对它执行某些操作,例如将其保存到实例变量或显示((,那么您就犯了一个错误。该表单永远不会被用户看到,只是在方法退出后被收集垃圾。

此外,您以基本相同的方式修改同一按钮,并多次将其添加到同一表单中。不要这样做。了解引用语义。

如果您希望您的子窗体能够在父窗体中导致某些事情发生,您可以让父窗体为子窗体提供对自身的引用。最好让父级为子级提供一个委托,子级可以根据需要调用该委托。