当其他表单处于活动状态时更新表单

Update form when other form is active

我有两个表格(Form_Graph(主表格),Form_Setting)和一个设置文件。当我单击“设置”按钮时,使用 ShowDialog() 打开 Form_Setting。

Form_Setting 包含三个按钮OK、Cancel、Apply和设置选项。现在的问题是,当我更改设置并更新设置文件并单击“应用”按钮后,我无法将此设置应用到 Form_Graph。 (Apply_OnClick 将新设置保存在设置文件中。)

我尝试刷新 Form_Graph 使用:

  1. Form_Graph obj = new Form_Graph();

  2. Application.OpenForms["Form_Graph"].刷新();

而且我也调试过了。所有 Form_Graph 代码都在双向执行,但尚未应用设置。

我知道第一种方法行不通,因为我创建了一个新表单,但是第二种方法呢?

谁能解决这个问题?

根据您的描述和评论,您需要重新加载表单以获得颜色和图形。您可以通过以下 3 种方式之一进行操作:

  1. 在您从设置对话框 return 之后调用 InitializeComponent()。这可能很危险,因为 InitializeComponent() 也会执行其他启动操作。
  2. 从设置对话框 return 后也重新加载您的主窗体。根据您的主窗体的状态,您可能会或可能不会这样做。
  3. InitializeComponent() 收集所有更新颜色和图形的代码,并将其移动到一个单独的函数中。在 InitializeComponent() 之后以及从设置对话框中 returning 时调用它。

我认为第三个是最干净的方法。

编辑

另一种通常更简洁的方法是使用应用程序设置。您只需转到您的表单设计器,select 您的控件,然后从属性 window 中选择应用程序设置。选择要绑定到设置的 属性,然后从下拉列表中选择相应的设置。如果该设置尚不存在,您只需单击“新建”按钮,设计师就会为您创建一个。

这些设置会自动为您加载和保存。没有更多的手动内容。

编辑 2

为了将设置立即传播到控件属性中,您可能需要在将您的设置绑定到您的设置时更改默认更新事件。为此,请转到您的设计器文件并查找 属性 绑定语句:

this.TextBox1.DataBindings.Add("Text", Project1.Properties.Settings.Default.UserName, ""))

并将它们设置为在 属性 更改时立即更新:

this.TextBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", global::Project1.Properties.Settings.Default, "UserName", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

我只需要在 Apply_OnClick

上编写代码
// Get Form_Graph object
Form_Graph objGraph = (Form_Graph)Application.OpenForms["Form_Graph"];

// Create a method in Form_Graph class which apply all setting to components
objGraph.UpdateGraph();

// Now refresh Form_Graph
objGraph.Refresh();

您不需要在子对象中创建父对象的新实例。通常执行此操作的最佳方法是订阅来自子表单的事件,即 Form_Setting。您需要在子表单中创建一个事件,如下所示:

public event EventHandler SettingsApplied;

public void NotifySettingsApplied(EventArgs e)
{
    if(SettingsApplied != null)
        SettingsApplied(this, e);
}

public void Apply_OnClick(object sender, EventArgs e)
{
    //trigger event here to notify main form
    NotifySettingsApplied(e);
}

然后在您的父表单中,在构造函数或任何其他合适的地方订阅此事件:

public Form_Graph()
{
     fs = new Form_Setting();
     fs.SettingsApplied += new EventHandler(fs_SettingsApplied);
}

void fs_SettingsApplied(object sender, EventArgs e)
{
     //update your main graph form here
}