1

我有两个表格 父表格:属性:总值。加载子窗体的按钮。 子窗体:属性:插入值。

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

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

4

3 回答 3

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 或其他网站上有很多关于如何做到这一点的教程。如果您对此(或此设计的任何其他方面)有疑问,请在评论中要求澄清。

于 2012-05-15T17:03:40.727 回答
0

如果您想在多个表单之间保持数据一致,我建议将数据放入您可以从两个表单访问的对象中。

最直接的方法是为对象实现INotifyPropertyChanged,这样您就可以在两种形式中绑定到该对象,并且所做的任何更改都会触发属性更改事件。

对于更复杂的场景,我创建了一个具有可以订阅的自定义事件的对象,因为 INotifyPropertyChanged 可能缺乏复杂场景中所需的微妙之处。例如,我的主导航表单有一个“Helm”对象,所有 UI 元素都订阅该对象。如果发生导航事件,则 helm 会完成所有导航和数据加载,然后触发 UI 侦听的一系列事件。

对于一个简单的父子来说,这似乎有点过头了,但是这个模型(对于 UI 简单订阅的当前状态有一个事实)允许您的 UI 发展并且 UI 的每个元素只担心自己的需求。

于 2012-05-15T17:04:54.517 回答
0

在您的子表单中有一个名为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);
于 2012-05-15T17:05:08.963 回答