我知道有很多关于这个的问题,我看到他们中的大多数但是仍然没有他们似乎对我有用。 我有一个父母和一个孩子的表格。子窗体有两个按钮 - 保存和取消,我希望当其中一个按下来刷新父窗体时(基本上是为了获取新数据)。
我已经尝试在调用.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();
}
有人有任何其他建议吗?
答案 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()