C# Winforms-刷新父窗体

C# Winforms-刷新父窗体,c#,winforms,C#,Winforms,我知道关于这一点有很多问题,我看到了大多数问题,但仍然没有一个对我有用。 我有一个父母和一个孩子。子窗体有两个按钮-保存和取消,我希望在按下其中一个按钮时刷新父窗体(基本上是为了获取新数据) 我尝试在调用.showDialog()时将父窗体作为参数传递,然后在子函数中调用parentForm.Refresh()时,我可以看到它被调用了,但窗体没有刷新 我还尝试将this.Refresh()添加到父窗体的childForm.showDialog()行之后,希望在子窗体关闭后调用刷新。。不起作用 我

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

我尝试在调用
.showDialog()
时将父窗体作为参数传递,然后在子函数中调用
parentForm.Refresh()
时,我可以看到它被调用了,但窗体没有刷新

我还尝试将
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();
}

有人有其他建议吗?

请注意,
Form.Refresh方法的基本实现通常只是重新绘制表单,它不会!不要更新控件的状态。例如,为自己实现一个
RefreshData
方法

无论如何,我建议您使用稍微不同的方法。我曾经用全局UI事件来解决这种情况,因此任何形式都可以对数据更改做出反应,而不管它来自何处)

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

public static class DataEvents {
  public static event EventHandler DataChanged;
  internal static void RaiseDataChanged() {
    var handler = DataChanged;
    if (handler != null) 
       handler();
  }
}
private void RefreshData() 
{
  myGridView.Reload(); // just an example
}
然后在您的父窗体中收听此事件,并在您的子窗体中提出它,或者在您认为需要指示应反映的数据更改的任何地方。这样,您的父窗体和子窗体将更加紧密地耦合,这通常是一种更好的设计

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

...
DataEvents.DataChanged += (s,e) => RefreshData();
...
当您指示更改时:

if (DialogResult == DialogResult.OK)
{
  ...
  DataEvents.RaiseDataChanged();
  ...
}
您的RefreshData方法可以是这样的:

public static class DataEvents {
  public static event EventHandler DataChanged;
  internal static void RaiseDataChanged() {
    var handler = DataChanged;
    if (handler != null) 
       handler();
  }
}
private void RefreshData() 
{
  myGridView.Reload(); // just an example
}

请注意,
Form.Refresh
方法的基本实现通常只是重新绘制表单,它不会!不要更新控件的状态。例如,为自己实现一个
RefreshData
方法

无论如何,我建议您使用稍微不同的方法。我曾经用全局UI事件来解决这种情况,因此任何形式都可以对数据更改做出反应,而不管它来自何处)

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

public static class DataEvents {
  public static event EventHandler DataChanged;
  internal static void RaiseDataChanged() {
    var handler = DataChanged;
    if (handler != null) 
       handler();
  }
}
private void RefreshData() 
{
  myGridView.Reload(); // just an example
}
然后在您的父窗体中收听此事件,并在您的子窗体中提出它,或者在您认为需要指示应反映的数据更改的任何地方。这样,您的父窗体和子窗体将更加紧密地耦合,这通常是一种更好的设计

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

...
DataEvents.DataChanged += (s,e) => RefreshData();
...
当您指示更改时:

if (DialogResult == DialogResult.OK)
{
  ...
  DataEvents.RaiseDataChanged();
  ...
}
您的RefreshData方法可以是这样的:

public static class DataEvents {
  public static event EventHandler DataChanged;
  internal static void RaiseDataChanged() {
    var handler = DataChanged;
    if (handler != null) 
       handler();
  }
}
private void RefreshData() 
{
  myGridView.Reload(); // just an example
}

请注意,
Form.Refresh
方法的基本实现通常只是重新绘制表单,它不会!不要更新控件的状态。例如,为自己实现一个
RefreshData
方法

无论如何,我建议您使用稍微不同的方法。我曾经用全局UI事件来解决这种情况,因此任何形式都可以对数据更改做出反应,而不管它来自何处)

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

public static class DataEvents {
  public static event EventHandler DataChanged;
  internal static void RaiseDataChanged() {
    var handler = DataChanged;
    if (handler != null) 
       handler();
  }
}
private void RefreshData() 
{
  myGridView.Reload(); // just an example
}
然后在您的父窗体中收听此事件,并在您的子窗体中提出它,或者在您认为需要指示应反映的数据更改的任何地方。这样,您的父窗体和子窗体将更加紧密地耦合,这通常是一种更好的设计

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

...
DataEvents.DataChanged += (s,e) => RefreshData();
...
当您指示更改时:

if (DialogResult == DialogResult.OK)
{
  ...
  DataEvents.RaiseDataChanged();
  ...
}
您的RefreshData方法可以是这样的:

public static class DataEvents {
  public static event EventHandler DataChanged;
  internal static void RaiseDataChanged() {
    var handler = DataChanged;
    if (handler != null) 
       handler();
  }
}
private void RefreshData() 
{
  myGridView.Reload(); // just an example
}

请注意,
Form.Refresh
方法的基本实现通常只是重新绘制表单,它不会!不要更新控件的状态。例如,为自己实现一个
RefreshData
方法

无论如何,我建议您使用稍微不同的方法。我曾经用全局UI事件来解决这种情况,因此任何形式都可以对数据更改做出反应,而不管它来自何处)

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

public static class DataEvents {
  public static event EventHandler DataChanged;
  internal static void RaiseDataChanged() {
    var handler = DataChanged;
    if (handler != null) 
       handler();
  }
}
private void RefreshData() 
{
  myGridView.Reload(); // just an example
}
然后在您的父窗体中收听此事件,并在您的子窗体中提出它,或者在您认为需要指示应反映的数据更改的任何地方。这样,您的父窗体和子窗体将更加紧密地耦合,这通常是一种更好的设计

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

...
DataEvents.DataChanged += (s,e) => RefreshData();
...
当您指示更改时:

if (DialogResult == DialogResult.OK)
{
  ...
  DataEvents.RaiseDataChanged();
  ...
}
您的RefreshData方法可以是这样的:

public static class DataEvents {
  public static event EventHandler DataChanged;
  internal static void RaiseDataChanged() {
    var handler = DataChanged;
    if (handler != null) 
       handler();
  }
}
private void RefreshData() 
{
  myGridView.Reload(); // just an example
}

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

Application.Restart()

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

Application.Restart()

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

Application.Restart()

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

Application.Restart()

你为什么要这么做?Windows窗体中没有多少次需要刷新。你可能很好,我不想在这里践踏你的知识或任何东西,只是你确定这就是你想要的实际功能吗?你是否覆盖了
Refresh
方法来实际获取更新的数据?你希望
Refresh
方法做什么?
Refresh
是一个图形化的东西,它与数据值无关,您需要研究数据绑定,或者创建一个可以调用以更新值的自定义方法。作为警告,如果更新数据绑定类中的一个值,它将更新数据绑定类中的所有值;这是一个问题,你为什么要这样做?Windows窗体中没有多少次需要刷新。您可能很好,我不想在这里或任何地方践踏您的知识,只是您确定这就是您正在寻找的实际功能吗?您是否覆盖了
Refresh
方法以实际获取更新的数据?您希望
Refresh
方法做什么