我有一个有两种形式的程序。第二种形式,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。但是,如果我要将代码放在一个事件方法中,它就工作得很好。
我怎么才能解决呢?
发布于 2014-04-01 14:00:23
第二种形式一开始就不需要知道你的主表单。即使是这样,解读其内部控制也是一个非常糟糕的想法。
相反,第二个窗体应该具有公共属性,通过它可以接受主窗体希望提供给它的数据,而无需公开任何内部控制,主窗体可以使用其控件中的数据设置这些属性。如果您只有少量数据,那么也可以将参数用于构造函数,这是您唯一需要提供的时候。
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();
}
}发布于 2014-04-01 13:59:23
此代码在创建Form2窗体时执行。Owner还没有被设置(而且,大概数据还没有出现)。如果把它放在VisibleChanged事件处理程序中--它将在Owner和数据出现时执行。
发布于 2014-04-01 14:00:47
使用Load事件。只有在显示表单之后才初始化Owner,然后表单会引发Load事件。
https://stackoverflow.com/questions/22788008
复制相似问题