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

时间:2017-05-22 18:04:04

标签: c# winforms c#-2.0

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

Form_Setting包含三个按钮确定,取消,应用和设置选项。现在的问题是,当我更改设置和更新设置文件时,单击“应用”按钮后,我无法将此设置应用于Form_Graph。 (Apply_OnClick将新设置保存在设置文件中。)

我尝试使用以下方法刷新Form_Graph:

  1. Form_Graph obj = new Form_Graph();

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

  3. 我也调试了它。所有Form_Graph代码都在路上执行,但尚未应用设置。

    我知道第一种方式永远不会起作用,因为我创建了一个新表单,但第二种方法呢?

    任何人都可以为此解决问题吗?

3 个答案:

答案 0 :(得分:2)

我需要在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();

答案 1 :(得分:0)

根据您的说明和评论,您需要重新加载表单以获取颜色和图片。您可以通过以下三种方式之一来完成:

  1. 从设置对话框返回后,请致电InitializeComponent()。这可能很危险,因为InitializeComponent()也会做其他启动工作。
  2. 从设置对话框返回后,重新加载主表单。您可能会也可能不会根据主表单的状态执行此操作。
  3. InitializeComponent()收集更新颜色和图形的所有代码,并将其移动到单独的函数中。在InitializeComponent()之后以及从设置对话框返回时调用它。
  4. 我认为第三种方法是最干净的方法。

    修改

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

    这些设置会自动加载并为您保存。没有更多手动的东西。

    编辑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));
    

答案 2 :(得分:0)

您无需在子级中创建父级的新实例。通常这样做的最佳方式是订阅来自子表单的事件,即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
}