多次调用FormClosing事件

时间:2017-02-02 12:12:11

标签: c# winforms infragistics

我有一个用于设置用户文化的组合框: User culture combo-box

如果我更改文化值 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 个答案:

答案 0 :(得分:5)

由于InitializeComponent,因为forms design mode properties/events设置了该方法。因此,每次添加FormClosing event一次。为避免这种情况,请在this.InitializeComponent();

上方添加此行
this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.FrmParent_FormClosing);

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

答案 1 :(得分:1)

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

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

您可以手动执行此操作,也可以使用设计器删除处理程序。

然后,不是使用设计器添加此事件处理程序,而是手动添加它,例如通过在调用InitializeComponent之后向构造函数添加相同的行。

尽管如此,调用InitializeComponent也会重新初始化您的UI状态。也许您可能会寻找其他解决方案,例如this one(我没有亲自尝试过,也无法保证)。