我正在开发一个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();
}
任何想法?
谢谢
答案 0 :(得分:4)
两个事件都应该正常。只需打开一个新项目并进行这个简单的测试:
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
无关(否则,代码将无法编译)。
答案 1 :(得分: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();
}
非常感谢你们!
答案 2 :(得分: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
已经太晚了。
答案 3 :(得分:1)
我注意到你的方法名称末尾有一个“_1”。你重命名这些方法吗?
如果是这样,您的UI代码(设计器文件)将需要使用这些新方法名称进行更新。
您可以在这些方法中放置一个断点,以查看它们是否被调用。
答案 4 :(得分:0)
正如旁注,Form.Hide()方法没有引发form_closed或form_closing事件
答案 5 :(得分:0)
我也遇到了类似的问题,它是通过使用Dispose()
引起的。
确保您使用Close()
引发关闭/关闭事件。