我有两张表格 父表单:属性:总价值。用于加载子表单的按钮。 子表单:属性:插入值。
当我运行应用程序时,首先加载父表单。我可以通过点击按钮加载第二个(儿童)表格。 问题是当我在子窗体中插入值时父窗体不显示任何更改,即使我通过委托和其他方法传递值。
我不想重新加载父窗口。请帮忙
答案 0 :(得分:0)
您应该做的是在子项上创建事件(或者如果他们将完成工作则使用现有事件)并让父表单订阅这些事件。
一个常见的例子是让父母隐藏自己,显示孩子,然后在孩子关闭时再次展示自己。以下是一些代码:
//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或其他网站上有很多教程。如果您遇到问题(或此设计的任何其他方面),请在评论中要求澄清。
答案 1 :(得分:0)
如果要在多个表单之间保持数据一致,我建议将数据放入可以从两个表单中访问的对象中。
最直接的方法是为对象实现INotifyPropertyChanged,因此您可以在两种形式中绑定到此对象,并且所做的任何更改都将触发属性更改事件。
对于更复杂的场景,我创建了一个具有我可以订阅的自定义事件的对象,因为INotifyPropertyChanged可能缺乏复杂场景中所需的微妙之处。作为一个例子,我的主要导航表单有一个“Helm”对象,所有UI元素都订阅了该对象。如果发生导航事件,则helm会执行所有导航和数据加载,然后它会触发UI侦听的一系列事件。
对于一个简单的父子,这看起来有点矫枉过正,但是这个模型(对UI简单订阅的当前状态有一个真理)允许你的UI进化,并且UI的每个元素只需要担心它自己需要。
答案 2 :(得分:0)
在您的子表单中有一个名为 Parent 的属性。在创建Child的实例时,将当前对象(父窗体对象)传递给构造函数,在该构造函数中将其设置为child的Parent属性值。在父表单中,在父表单中有一个公共方法。 P
父表格
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;
}
}
创建Child表单的对象时
Form2 objChjild=new Child(this);
//do whatever
现在从子表单中,如果要更新总计,
像这样打电话
this.Parent.UpdateTotal(200);