C#父表单不从子进行更新

时间:2012-05-15 16:57:55

标签: c# winforms

我有两张表格 父表单:属性:总价值。用于加载子表单的按钮。 子表单:属性:插入值。

当我运行应用程序时,首先加载父表单。我可以通过点击按钮加载第二个(儿童)表格。 问题是当我在子窗体中插入值时父窗体不显示任何更改,即使我通过委托和其他方法传递值。

我不想重新加载父窗口。请帮忙

3 个答案:

答案 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);