交叉形式的沟通

时间:2014-04-01 13:53:29

标签: c# winforms

我有一个有两种形式的程序。 第二种形式,Form2,其中我想要使用主窗体中的值初始化一些标签。

代码:

public Form2()
        {
            InitializeComponent();
            Form1 mainForm = (Form1)this.Owner;
            lblName.Text = mainForm.gvRow.Cells[2].Value.ToString();
            lblItemType.Text = mainForm.gvRow.Cells[1].Value.ToString();
            lblLocation.Text = mainForm.gvRow.Cells[3].Value.ToString();
        }

由于某种原因,这在Form2()部分不起作用,this.Owner为null。但是,如果我将代码放在事件方法中,它就可以正常工作。

我该如何解决?

7 个答案:

答案 0 :(得分:4)

第二种形式不应该首先知道关于你的主要表格。即使这样做,阅读其内部控制也是一个非常糟糕的主意。

相反,您的第二个表单应该具有公共属性,通过它可以接受主表单要提供给它的数据,而不会暴露任何内部控件,主表单可以使用其控件中的数据设置这些属性。如果您只有一些数据,那么您也可以使用构造函数的参数,这是您需要提供它的唯一时间。

public class Form2
{
    public string Name
    {
        get { return lblName.Text; }
        set { lblName.Text = value; }
    }
}

public class MainForm
{
    public void Foo()
    {
        Form2 child = new Form2();
        child.Name = mainForm.gvRow.Cells[2].Value.ToString();
        child.Show();
    }
}

答案 1 :(得分:2)

Form2表单创建时执行此代码。 Owner尚未设置(并且,可能,数据尚未存在)。如果你将它放在VisibleChanged事件处理程序中 - 它将在Owner和数据(可能)存在时执行。

答案 2 :(得分:1)

使用Load事件。 Owner仅在您显示表单后初始化,然后返回会引发Load事件。

答案 3 :(得分:1)

在显示表单之前不会设置所有者 - 即在ShowDialog中,而不是在构造函数期间。您应该将父项作为参数传递给构造函数:

public Form2(Form1 mainForm)
{
    InitializeComponent();
    lblName.Text = mainForm.gvRow.Cells[2].Value.ToString();
    lblItemType.Text = mainForm.gvRow.Cells[1].Value.ToString();
    lblLocation.Text = mainForm.gvRow.Cells[3].Value.ToString();
}

答案 4 :(得分:1)

因为所有者尚未在Form2构造函数中初始化,所以在Form2_Load事件中设置代码

答案 5 :(得分:0)

使用Form.Show(IWin32Window)重载将所有者传递给子表单。

http://msdn.microsoft.com/en-us/library/szcefbbd(v=vs.110).aspx

答案 6 :(得分:-1)

You need to set the Owner property yourself

作为替代方法,您可以将对Form1的引用传递给Form2构造函数。在打开Form2的代码中,您可能有类似这样的内容:

var form2 = new Form2();
form2.Show();

您可以将其替换为:

var form2 = new Form2(this);
form2.Show();

在Form2中,您将添加一个构造函数重载:

public Form2(Form1 owningForm)
{
     InitializeComponent();
     Form1 mainForm = owningForm;
     lblName.Text = mainForm.gvRow.Cells[2].Value.ToString();
     lblItemType.Text = mainForm.gvRow.Cells[1].Value.ToString();
     lblLocation.Text = mainForm.gvRow.Cells[3].Value.ToString();
}

如果可能有不同的“拥有表单”,您可能需要定义一个接口而不是传递Form2。