gpt4 book ai didi

c# - 当子窗体关闭时,为什么不为在主窗体中创建的窗体上的控件触发 Validated 事件?

转载 作者:太空狗 更新时间:2023-10-29 22:10:22 29 4
gpt4 key购买 nike

假设我有一个 winforms 应用程序,它有两个窗体,一个是程序运行时启动的主窗体,另一个是另一个窗体。这是主窗体的代码:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
var f2 = new Form2();
f2.ShowDialog();
}

private void textBox1_Validated(object sender, EventArgs e)
{
System.Diagnostics.Debug.Print("Main Form: Validated!");
}
}

这是子表单:

public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private void textBox1_Validated(object sender, EventArgs e)
{
System.Diagnostics.Debug.Print("Child Form: Validated!");
}
}

当我运行应用程序时,我可以将焦点放在主窗体的文本框中,当然,当我退出时,它会触发 Validated 事件并打印 Main Form: Validated! 到输出。 如果我在文本框中获得焦点并关闭主窗体(即结束程序),也会发生这种情况。

当我单击弹出子窗体实例的主窗体上的按钮时,我可以将焦点放在子窗体的文本框中,并且 Validated 事件会按预期触发当我退出它时。但是,与关闭窗体时的主窗体行为不同,如果我将焦点放在子窗体的文本框中并关闭子窗体,Validated 事件永远不会触发。

为什么经过验证的事件没有触发,有没有办法让它触发。

我依靠某些控件的验证事件来更新我的 View 模型。我想确保它们始终触发,即使由于表单关闭甚至应用程序本身结束而失去焦点也是如此。

最佳答案

这是由 ShowDialog() 引起的。这是一个记录在案的错误,是 .NET 1.x 中的一个错误,他们无法再修复了。来自 Form.cs source code :

   // NOTE: We should also check !Validate(true) below too in the modal case,
// but we cannot, because we didn't to this in Everett (bug), and doing so
// now would introduce a breaking change. User can always validate in the
// FormClosing event if they really need to. :-(

所以只要遵循指导即可:

    protected override void OnFormClosing(FormClosingEventArgs e) {
if (e.CloseReason == CloseReason.UserClosing && this.DialogResult != DialogResult.Cancel) {
if (!base.Validate(true)) e.Cancel = true;
}
base.OnFormClosing(e);
}

假设当对话框关闭时您不需要该事件,并且您希望对话框在验证失败时保持打开状态。后一个子句是新行为。

关于c# - 当子窗体关闭时,为什么不为在主窗体中创建的窗体上的控件触发 Validated 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47822313/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com