【问题标题】:Update form when other form is active当其他表单处于活动状态时更新表单
【发布时间】:2017-05-22 18:04:04
【问题描述】:

我有两个表单(Form_Graph(Main Form)、Form_Setting)和一个设置文件。当我点击设置按钮时,Form_Setting 使用 ShowDialog() 打开。

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

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

  1. Form_Graph obj = new Form_Graph();

  2. Application.OpenForms["Form_Graph"].Refresh();

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

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

谁能解决这个问题?

【问题讨论】:

  • winforms 或 wpf,不能同时使用。查看您的代码 sn-ps 对我来说它看起来像是 winforms。
  • 你的主窗体依赖什么设置?它如何/何时读取这些设置?
  • 在设置文件中有颜色,还有一些布尔属性。在 form_graph 中有一些按钮和一些图形。所以当 InitializeComonent () 被调用时,我已经给这个按钮和图形设置了值,所以它会在设置更改时更新@dotNET

标签: c# winforms c#-2.0


【解决方案1】:

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

【讨论】:

  • 最好的朋友@chibuezeOpata
【解决方案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();

【讨论】:

    【解决方案3】:

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

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

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

    编辑

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

    这些设置会自动为您加载和保存。不再需要手动操作。

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

    【讨论】:

    • 我尝试了 1 和 3,但仍然无法应用设置。当我单击应用按钮时,Form_Setting 不再关闭,它必须聚焦并打开,所以我不能应用第二种方式。设置的任何更改都需要应用于 Form_Graph @dotNET
    • 我认为添加 stackoverflow.com/questions/33348930/… 和其他有关 InitializeComponent 的链接很重要。一般因为这样的问题,在 InitializeComponent 中修改代码是个坏主意;它应该都是由设计器生成的代码。请注意,手动更改此功能将更改设计器中显示的内容。通常,如果您在 InitializeComponent 中添加了任何更改,最好将这些更改放在您在创建表单之后(但在打开之前)调用的单独函数中。
    • 真正正确的做法是使用winforms中的应用程序设置功能。您可以将控件的属性直接绑定到您的设置,它们会在启动时自动加载(并在您退出表单时保存)。我不知道您是否有足够的技能来关注这些内容,但如果您有兴趣,请查看我的编辑。
    • 我确实做到了(这里的设置文件是属性->设置->默认值)但问题是它在启动期间自动更新但在程序运行时没有更新并且设置文件有变化@点网
    • @XanderCage:见编辑 2。
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多