我正在尝试从子窗体调用父窗体上的方法,子窗体又调用自定义用户控件中的方法。如果我这样做,我就能打电话......
以儿童形式:
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事件中调用该方法,它就构建得很好。我在调试模式下运行,我可以看到方法被调用,正确的参数被传递。
那么为什么从父级调用时会构建按钮,而不是从子级调用时呢?
答案 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最好是孩子可以根据需要调用。