Winforms - 刷新父表单

时间:2014-07-14 08:00:31

标签: c# winforms

我知道有很多关于这个的问题,我看到他们中的大多数但是仍然没有他们似乎对我有用。 我有一个父母和一个孩子的表格。子窗体有两个按钮 - 保存和取消,我希望当其中一个按下来刷新父窗体时(基本上是为了获取新数据)。

我已经尝试在调用.showDialog()时调用父窗体作为参数,然后在调用parentForm.Refresh()的子函数中调用它,我可以看到它被调用但是窗体没有& #39; t刷新..

我还尝试在this.Refresh()行之后的父表单中添加childForm.showDialog(),希望在子表单关闭后,刷新将被调用..不起作用

我没有运气也试过这个

if (ftpsf.DialogResult == DialogResult.OK) // what button should I call when I don't OK?
{
    this.Refresh();
}

我也曾尝试订阅儿童表格的近似事件,但没有成功。

private void frm2_FormClosed(object sender, FormClosedEventArgs e)
{
   this.Refresh();
}

有人有任何其他建议吗?

2 个答案:

答案 0 :(得分:2)

请注意,Form.Refresh方法的基本实现通常只是重绘表单,它不会更新你的控件'州。为此自己实现RefreshData方法。

无论如何,我建议你使用稍微不同的方法。我过去常常使用全局UI事件来解决这种情况,因此任何表单都可以对数据更改做出反应,从何处开始并不重要。

例如,您可以定义如下事件:

public static class DataEvents {
  public static event EventHandler DataChanged;
  internal static void RaiseDataChanged() {
    var handler = DataChanged;
    if (handler != null) 
       handler();
  }
}

然后在您的父表单中收听此事件,并以您的子表单提升,或者您认为需要指出应反映的数据更改。通过这种方式,您的父母和子女形式更加松散耦合,这通常是更好的设计。

在表单构造函数中,例如:

...
DataEvents.DataChanged += (s,e) => RefreshData();
...

当您指出更改时:

if (DialogResult == DialogResult.OK)
{
  ...
  DataEvents.RaiseDataChanged();
  ...
}

你的RefreshData方法可能是这样的:

private void RefreshData() 
{
  myGridView.Reload(); // just an example
}

答案 1 :(得分:1)

也许是一个愚蠢的评论,但如果你想重新开始。为什么不使用:

Application.Restart()