c# - 如何从子表单引用表单?

标签 c# winforms

事情是这样的,我有调用 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/

相关文章:

c# - HttpClient - 忽略 404

c# - 使用 WPF 在 C# 中动态更改图像

c# - C#: Call a method every 5 minutes from a foreach loop

具有多个皮肤的 C# Windows 窗体应用程序——条件编译是一个好的解决方案吗?

c# - 向 DevExpress GridView 添加行

c# - 打开Outlook后无法创建带有Outlook Interop的电子邮件

c# - visual studio 2012 中的 TFS 强制 checkin

c# - 为什么将 DoEvents 放入循环中会导致 StackOverflow 异常?

c# - 何时注册将调用 Form.Invoke 的方法?

c# - 在窗体上绘制自定义图标