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侦听该事件并根据需要添加/调整。