从另一个表单调用方法

时间:2015-07-06 03:32:20

标签: c# .net winforms

我正在尝试从子窗体调用父窗体上的方法,子窗体又调用自定义用户控件中的方法。如果我这样做,我就能打电话......

以儿童形式:

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事件中调用该方法,它就构建得很好。我在调试模式下运行,我可以看到方法被调用,正确的参数被传递。

那么为什么从父级调用时会构建按钮,而不是从子级调用时呢?

2 个答案:

答案 0 :(得分:4)

执行此操作的一种方法是将frmMain的实例传递给https://appetize.io/app/ctxjvzhu56fjh01dw89urmvq9g方法:

// ... 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.Show()属性转换回frmMain类型并对其执行操作:

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

答案 1 :(得分:1)

一般情况下,如果你在方法调用中实例化一个表单并且你没有对它执行某些操作,比如将它保存到实例变量或Show()它那么你就犯了一个错误。用户从未看到过该表单,只是在您的方法退出后才收集垃圾。

此外,您基本上以相同的方式修改相同的按钮,并将其多次添加到同一个表单中。不要这样做。 Learn about reference semantics

如果您希望您的子表单能够在父表单中发生某些事情,您可以让父表单向子表单提供自己的引用。对孩子have the parent provide a delegate最好是孩子可以根据需要调用。