FormClosing事件被多次调用

3
我有一个下拉框用于设置用户文化(语言和地区): 用户文化下拉框 如果我更改文化值x次,当用户尝试退出时FormClosing方法将会触发x次。
以下是我的FormClosing事件:
    private void FrmParent_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show(this, Properties.Resources.msgExit, this.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No)
            e.Cancel = true;
    }

这是我的组合框值改变事件:

    void cbCulture_ToolValueChanged(object sender, ToolEventArgs e)
    {
        ComboBoxTool cbCulture = (ComboBoxTool)sender;
        var culture = cbCulture.Value.ToString();

        FormHelpers.SetCulture(culture);

        this.Controls.Clear();
        this.InitializeComponent();
        InitForm();
    }

我需要清理和初始化控件,以便将UI更改为新的文化。但是这样做会在InitializeComponent()中多次分配FormClosing事件吗?我如何避免这种行为?


2
这是因为InitializeComponent方法中添加了事件。 - kgzdev
确定,对事件进行多次订阅。清除控件集合并调用InitializeComponent是否真的有必要?通过在“InitForm”中进行分配,保持控件布局不变,分配区域特定属性(文本、从左到右等)应该就足够了吧? - Cee McSharpface
在每次文化变更时不调用InitializeComponent() - Pikoh
更改所有控件名称和文化工作时,不需要调用InitializeComponent(),你为什么要这样做? - NicoRiff
1
请参阅在运行时更改语言的正确方法获取更多信息。 - stuartd
显示剩余2条评论
2个回答

5

这是因为InitializeComponent方法中,设计模式下的属性/事件被设置了。因此每次添加FormClosing事件时就会再次添加一个。为避免这种情况,请在this.InitializeComponent();之前添加以下代码:

this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.FrmParent_FormClosing);

注意:它仅解决了FormClosing事件问题。


yah -= 解决了这个问题,但是你的回答让我意识到可能会出现更多的问题。 有没有办法在不清理和初始化控件的情况下更改UI界面? - Fábio Silva
1
您可以从 YourFile.designer.cs 中删除任何设计时事件,并在代码中手动设置它们。这样,InitializeComponent() 方法就不会多次添加每个事件了。 - kgzdev

1

从InitializeComponent中删除添加FormClosing事件处理程序的代码行:

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmParent_FormClosing);

你可以手动完成此操作,或通过使用设计器删除处理程序来完成。
然后,不要使用设计器添加此事件处理程序,而是手动添加,例如在调用InitializeComponent后立即将相同的行添加到构造函数中。
尽管如此,调用InitializeComponent也会重新初始化您的UI状态。也许你可以寻找其他解决方案,例如this one(我个人没有尝试过,也无法保证)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接