【问题标题】:C# Parent form not updating from childC#父表单不从子更新
【发布时间】:2015-12-26 23:17:31
【问题描述】:

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

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

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

【问题讨论】:

  • 使用子发布和父订阅的事件。
  • 试试你要更新的control.Refresh方法
  • 必须做什么才能“在子表单中插入值”以及您做了什么来确保“父表单...显示任何更改”。代码会很有帮助。

标签: c# winforms


【解决方案1】:

您应该做的是在子窗体上创建事件(或使用现有事件,如果它们能完成这项工作)并让父窗体订阅这些事件。

一个常见的例子是让父级隐藏自己,显示子级,然后在子级关闭时再次显示自己。这是一些执行此操作的代码:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      在您的子表单中有一个名为 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;
        }    
      }
      

      创建子窗体对象时

      Form2 objChjild=new Child(this);
      //do whatever
      

      现在从子窗体中,如果你想更新总数,

      这样打电话

      this.Parent.UpdateTotal(200);
      

      【讨论】:

      • 虽然这可行,但通常被认为是不好的做法。它将两个表单紧密耦合在一起,并且在根本不需要发生的情况下,还将有关 Form1 的所有内容暴露给 Form2。
      • 应该使用事件:NewTotal(this, 200),父级监听并根据需要添加/调整。
      猜你喜欢
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 2020-10-31
      • 1970-01-01
      相关资源
      最近更新 更多