6

我正在开发一个C#应用程序并且我需要在用户关闭表单之前进行一些验证。

我尝试使用该FormClosing事件,但没有成功,后来我使用了该FormClosed事件,但还是一样。

问题是,当我单击“关闭按钮”(在表单顶部)时,它什么也没做,但我在表单属性和所有内容中都有事件。

在此处输入图像描述 在此处输入图像描述

这是我的代码:

    private void Inicio_FormClosing_1(object sender, FormClosingEventArgs e)
    {
    //things I have to do
    //...
    //...

    if(bandera==true)
    Application.Exit();

    }

    private void Inicio_FormClosed_1(object sender, FormClosingEventArgs e)
    {
    //things I have to do
    //...
    //...

    if(bandera==true)
    Application.Exit();

    }

任何的想法?

谢谢

4

6 回答 6

5

这两个事件都应该正常工作。只需打开一个新项目并做这个简单的测试:

 private void Form1_Load(object sender, EventArgs e)
 {
     this.FormClosing += new FormClosingEventHandler(Inicio_FormClosing_1);
     this.FormClosed += new FormClosedEventHandler(Inicio_FormClosed_1);
 }

 private void Inicio_FormClosing_1(object sender, FormClosingEventArgs e)
 {
     //Things while closing

 }

 private void Inicio_FormClosed_1(object sender, FormClosedEventArgs e)
 {
     //Things when closed
 }

如果您在这些方法中设置断点,您会看到在单击关闭按钮后到达它们。您的事件附加代码似乎存在一些问题。例如:Inicio_FormClosed_1(object sender, FormClosingEventArgs e)是错误的,只要它应该带一个FormClosedEventArgs论点;因此此方法肯定与FormClosed event(否则,代码将无法编译)无关。

于 2013-10-28T17:48:05.043 回答
4

我发现了错误;

这里:(当我初始化我的表单时)

    public Inicio()
    {
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.AutoScroll = true;

        this.ClientSize = new System.Drawing.Size(635, 332);
        this.StartPosition = FormStartPosition.CenterScreen;
        llenaForm(nombreFormulario);
        Application.EnableVisualStyles();

    }

我只需要: InitializeComponent();
我误删了

它应该是:

    public Inicio()
    {
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.AutoScroll = true;`

        InitializeComponent();//<<<<<<<<------------------- 

        this.ClientSize = new System.Drawing.Size(635, 332);
        this.StartPosition = FormStartPosition.CenterScreen;
        llenaForm(nombreFormulario);
        Application.EnableVisualStyles();
    }

十分感谢大家!

于 2013-10-28T18:58:34.730 回答
3

为了防止用户关闭表单以响应某些验证,您需要设置FormClosingEventArgs.Cancel = true.

例如:

private void Inicio_FormClosing_1(object sender, FormClosingEventArgs e)
{
    if (string.IsNullOrEmpty(txtSomethingRequired.Text))
    {
        MessageBox.Show("Something is required here!");
        if (txtSomethingRequired.CanFocus) txtSomethingRequired.Focus();
        e.Cancel = true;
        return;
    }
}

您只能在FormClosing事件中进行验证以防止表单关闭;如果你等到FormClosed已经太晚了。

于 2013-10-28T17:52:41.340 回答
1

我注意到您的方法名称末尾有一个“_1”。您是否重命名了这些方法?

如果是这样,您的 UI 代码(设计器文件)将需要使用这些新方法名称进行更新。

您可以在这些方法中放置一个断点以查看它们是否被调用。

于 2013-10-28T17:57:15.677 回答
0

顺便说一句,Form.Hide() 方法不会引发 form_closed 或 form_closing 事件

于 2018-06-09T22:53:34.753 回答
0

我也遇到了类似的问题,是使用Dispose(). 确保您Close()用于引发关闭/关闭事件。

于 2020-11-26T10:30:46.467 回答