从另一个窗体调用方法
本文关键字:方法 调用 窗体 另一个 | 更新日期: 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);
// ...
}
通常,如果您在方法调用中实例化一个表单,而您没有对它执行某些操作,例如将其保存到实例变量或显示((,那么您就犯了一个错误。该表单永远不会被用户看到,只是在方法退出后被收集垃圾。
此外,您以基本相同的方式修改同一按钮,并多次将其添加到同一表单中。不要这样做。了解引用语义。
如果您希望您的子窗体能够在父窗体中导致某些事情发生,您可以让父窗体为子窗体提供对自身的引用。最好让父级为子级提供一个委托,子级可以根据需要调用该委托。