当其他表单处于活动状态时更新表单
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 使用:
Form_Graph obj = new Form_Graph();
Application.OpenForms["Form_Graph"].刷新();
而且我也调试过了。所有 Form_Graph 代码都在双向执行,但尚未应用设置。
我知道第一种方法行不通,因为我创建了一个新表单,但是第二种方法呢?
谁能解决这个问题?
根据您的描述和评论,您需要重新加载表单以获得颜色和图形。您可以通过以下 3 种方式之一进行操作:
- 在您从设置对话框 return 之后调用
InitializeComponent()
。这可能很危险,因为 InitializeComponent()
也会执行其他启动操作。
- 从设置对话框 return 后也重新加载您的主窗体。根据您的主窗体的状态,您可能会或可能不会这样做。
- 从
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
}
我有两个表格(Form_Graph(主表格),Form_Setting)和一个设置文件。当我单击“设置”按钮时,使用 ShowDialog() 打开 Form_Setting。
Form_Setting 包含三个按钮OK、Cancel、Apply和设置选项。现在的问题是,当我更改设置并更新设置文件并单击“应用”按钮后,我无法将此设置应用到 Form_Graph。 (Apply_OnClick 将新设置保存在设置文件中。)
我尝试刷新 Form_Graph 使用:
Form_Graph obj = new Form_Graph();
Application.OpenForms["Form_Graph"].刷新();
而且我也调试过了。所有 Form_Graph 代码都在双向执行,但尚未应用设置。
我知道第一种方法行不通,因为我创建了一个新表单,但是第二种方法呢?
谁能解决这个问题?
根据您的描述和评论,您需要重新加载表单以获得颜色和图形。您可以通过以下 3 种方式之一进行操作:
- 在您从设置对话框 return 之后调用
InitializeComponent()
。这可能很危险,因为InitializeComponent()
也会执行其他启动操作。 - 从设置对话框 return 后也重新加载您的主窗体。根据您的主窗体的状态,您可能会或可能不会这样做。
- 从
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
}