我有两个表格 父表格:属性:总值。加载子窗体的按钮。 子窗体:属性:插入值。
当我运行应用程序时,首先加载父表单。我可以通过单击按钮加载第二个(子)表单。问题是当我在子表单中插入值时,即使我通过委托和其他方法传递值,父表单也没有显示任何更改。
我不想重新加载父窗口。请帮忙
您应该做的是为子级创建事件(或使用现有事件,如果他们会完成这项工作)并让父表单订阅这些事件。
一个常见的例子是让父级隐藏自己,显示子级,然后在子级关闭时再次显示自己。这是一些执行此操作的代码:
//in parent form
private void someButtonClickHander(object sender, EventArgs args)
{
ChildForm child = new ChildForm();
this.Hide();
child.Closing += (sender2, args2) =>
{
var someResultFromChildForm = child.SomePropertyOnChildForm;
this.Show();
}
child.Show();
}
如果关闭事件对您不起作用(也许您想在子窗体按下按钮时做某事),您可能需要让子窗体创建它自己的事件。MSDN 或其他网站上有很多关于如何做到这一点的教程。如果您对此(或此设计的任何其他方面)有疑问,请在评论中要求澄清。
如果您想在多个表单之间保持数据一致,我建议将数据放入您可以从两个表单访问的对象中。
最直接的方法是为对象实现INotifyPropertyChanged,这样您就可以在两种形式中绑定到该对象,并且所做的任何更改都会触发属性更改事件。
对于更复杂的场景,我创建了一个具有可以订阅的自定义事件的对象,因为 INotifyPropertyChanged 可能缺乏复杂场景中所需的微妙之处。例如,我的主导航表单有一个“Helm”对象,所有 UI 元素都订阅该对象。如果发生导航事件,则 helm 会完成所有导航和数据加载,然后触发 UI 侦听的一系列事件。
对于一个简单的父子来说,这似乎有点过头了,但是这个模型(对于 UI 简单订阅的当前状态有一个事实)允许您的 UI 发展并且 UI 的每个元素只担心自己的需求。
在您的子表单中有一个名为Parent的属性。当您创建 Child 的实例时,将当前对象(父表单对象)传递给构造函数,您将在其中将其设置为 child 的 Parent 属性值。在父表单中在您的父表单中有一个公共方法。磷
父窗体
Form1 : Form
{
decimal _totalPrice;
public void UpdateTotal(decimal val)
{
_totalPrice=_totalPrice+val;
lblTotal.Text=_totalPrice.ToString();
}
}
子表
Form2:Form
{
public Form1 Parent { set;get;}
public Form2(Parent parent)
{
this.Parent =parent;
}
}
创建子窗体的对象时
Form2 objChjild=new Child(this);
//do whatever
现在从子窗体中,如果您想更新总数,
像这样打电话
this.Parent.UpdateTotal(200);