Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#父窗体未从子窗体更新_C#_Winforms - Fatal编程技术网

C#父窗体未从子窗体更新

C#父窗体未从子窗体更新,c#,winforms,C#,Winforms,我有两张表格 父窗体:属性:总值。按钮以加载子窗体。 子表单:属性:插入值 运行应用程序时,首先加载父窗体。我可以通过单击按钮加载第二个(子)表单。 问题是,当我在子窗体中插入值时,父窗体并没有显示任何更改,即使我通过委托和其他方法传递值 我不想重新加载父窗口。请帮助您应该做的是在子级上为创建事件(或使用现有事件,如果它们将执行此任务),并让父窗体订阅这些事件 一个常见的例子是让父对象隐藏自己,显示子对象,然后在关闭子对象时再次显示自己。下面是一些代码: //in parent form pri

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

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


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

您应该做的是在子级上为创建事件(或使用现有事件,如果它们将执行此任务),并让父窗体订阅这些事件

一个常见的例子是让父对象隐藏自己,显示子对象,然后在关闭子对象时再次显示自己。下面是一些代码:

//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可能缺少复杂场景中所需的微妙之处。例如,我的主导航表单有一个“Helm”对象,所有UI元素都订阅该对象。如果发生导航事件,helm将执行所有导航和数据加载,然后触发UI侦听的一系列事件


对于一个简单的父子关系来说,这似乎有些过分,但是这个模型(对于用户界面订阅的当前状态只有一个事实)允许用户界面不断发展,并且用户界面的每个元素只关心自己的需要。

在您的子关系中有一个名为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;
  }    
}
创建子窗体的对象时

Form2 objChjild=new Child(this);
//do whatever
现在从子窗体开始,如果要更新总数

像这样打电话

this.Parent.UpdateTotal(200);

使用子级发布且父级订阅的事件。尝试要更新的control.Refresh方法“在子窗体中插入值”必须执行的操作以及确保“父窗体…显示任何更改”必须执行的操作。代码会很有帮助。虽然这可以工作,但通常被认为是不好的做法。它将两个表单紧密地耦合在一起,并在不需要的情况下公开关于Form1到Form2的所有信息。应使用事件:NewTotal(这个,200),parent侦听该事件并根据需要添加/调整。