事情是这样的,我有调用 OrderForm.Show() 的 MainForm。 现在我想用一个按钮调用 MainForm 中的公共(public)函数,但我不能。
这是 MainForm 中的代码:
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
// Main form
private void MainFrm_Load(object sender, EventArgs e)
{
FormOrder frmO = new FormOrder();
frmO.Show();
}
public void Refresh()
{
// some action
}
}
在 OrderForm 中我这样做:
public partial class FormOrder : Form
{
public FormOrder()
{
InitializeComponent();
}
private void ShowForm()
{
// some action
}
private void btnCopy_Click(object sender, EventArgs e)
{
Form form = Form.ActiveForm as frmMain;
if (form != null)
{
form.Refresh();
}
}
}
所以在程序中我运行 MainForm.Show() 然后加载 OrderForm。然后,当我单击“复制”按钮时,它将在 MainForm 中运行 Public Function Refresh。但我无法让它工作,它总是在以下位置返回 null:
Form form = Form.ActiveForm as frmMain;
那么我怎样才能真正获得事件表格,这是另一种解决方案吗?还是我弄错了?? 预先感谢您的回答:)
最佳答案
您得到一个空值,因为您的事件表单是您所在的表单,并且它不是 frmMain 类型。 (我认为您实际上可能将事件表单与父表单混淆了?)
有很多方法可以做到这一点。你可以让你的 frmMain 成为一个单例,但这很奇怪而且丑陋,最近不推荐,或者你可以以某种方式将它的引用传递给它的 child 。这是一个简单的方法:
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
// Main form
private void MainFrm_Load(object sender, EventArgs e)
{
FormOrder frmO = new FormOrder(this); // pass a ref of self
frmO.Show();
}
public void Refresh()
{
// some action
}
}
在 OrderForm 中:
public partial class FormOrder : Form
{
private frmMain _parent; // create a field that refers to the parent
public FormOrder(frmMain parent) // mod the constructor
{
if (parent == null) throw new NullReferenceException("Can't be NULL!!!"); // check clause
_parent = parent; // assign the ref of the parent
InitializeComponent();
}
private void ShowForm()
{
// some action
}
private void btnCopy_Click(object sender, EventArgs e)
{
_parent.Refresh(); // make the call to parent
}
}
您可以通过使用界面来改善这一点,但总体思路是相同的。
关于c# - 如何从子表单引用表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7816176/