我有一个有两种形式的程序。 第二种形式,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。但是,如果我将代码放在事件方法中,它就可以正常工作。
我该如何解决?
答案 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。