使表单实例成为公共C#

时间:2013-05-19 23:42:27

标签: c# wpf winforms function public

我正在尝试将信息从子表单传递给父表单。我一直在使用我在论坛上找到的以下代码来帮助我:

Form1.cs的

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace childform
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 tempDialog = new Form2(this);
        tempDialog.ShowDialog();
    }

    public void msgme()
    {
        MessageBox.Show("Parent Function Called");
    }

}
}

Form2.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace childform
{
public partial class Form2 : Form
{
    private Form1 m_parent;

    public Form2(Form1 frm1)
    {
        InitializeComponent();
        m_parent = frm1;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        m_parent.msgme();
    }
}
}

哪个有效并且一切都很好。麻烦的是,我的程序要求我在button1_Click以外的方法中从表单1中设置tempDialog中的变量。但是,这些找不到tempDialog的实例,因为它位于button1_click。

另外,我无法将其移出方法(例如,进入类),因为'this'修饰符不会引用Form1 ...

我有什么想法可以从Form2引用Form1,反之亦然?使用此代码还是其他?

由于

4 个答案:

答案 0 :(得分:0)

我不确定您对this的上一条评论的含义。创建一个引用Form2的字段并在构造函数中初始化它。然后,您可以在_form2的其他方法中引用Form1

public partial class Form1 : Form
{
    private Form2 _form2;
    public Form1()
    {
        InitializeComponent();
        _form2 = new Form2(this);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _form2.ShowDialog();
    }

}

当复杂性增加时,这种事情很难理解。更好的方法可能是让Form1Form2引用一些他们可以操纵的共同对象。

答案 1 :(得分:0)

您可以尝试在Form对象上研究MdiParent和Parent属性。这些允许您获取和设置父级并在需要时访问其方法。

有关详细信息,请参阅MSDN上的Parent propertyMdiParent property

希望这有帮助。

答案 2 :(得分:0)

根据您的应用程序,如果您只有一个在应用程序中显示和隐藏的表单副本,您可能只能制作单例静态引用。这仅适用于您只是实例化一次表单然后在其上使用show() / hide()使其消失或根据需要重新出现。

public partial class Form2 : Form
{
    public static Form2 Instance;

    public Form2()
    {
        InitializeComponent();
        this.Instance = this;
    }
}

然后,您可以使用以下代码从任何地方访问表单2:

Form2.Instance.xxx

答案 3 :(得分:-2)

在表单属性中,将Modifier属性更改为“Public”,您将能够从公共表单引用任何控件

从form2开始,您应该能够编写以下内容以使用form1的用户名文本框,例如

UserName = Form1.UserNameTextbox.Text