我有一个带有多个 TabPage 的 TabControl,每个 TabPage 包含多个控件。当用户使用按钮离开我的选项卡时,我想验证该选项卡上的控件是否已正确修改。具体来说,我想检查他们是否选择了一个单选按钮。
如果验证失败(也就是说,我将 CancelEventArgs 设置为 true),UI 将不再响应输入。控件仍然响应悬停和单击(意思是颜色发生变化),但不采取任何操作。我无法导航到其他选项卡,甚至无法使用“X”按钮关闭应用。
我试过添加 errorProvider、添加 SelectTab 调用、向选项卡和选项卡上的控件添加 Focus() 调用,以及添加 MessageBox。 MessageBox 允许我单击确定,但随后返回到“锁定”用户界面。将 Focus() 调用添加到当前选项卡上的控件(验证失败)会导致选择下一个控件,但 UI 仍处于锁定状态。
知道为什么会发生这种情况或如何解决它吗?
注意:仅当我尝试使用选项卡上的按钮更改选项卡时才会发生这种情况。如果我只是单击另一个选项卡,取消会起作用,并且我会按预期返回到我的选项卡,所有控件都可用。
编辑: 我终于有时间重新审视这个。我创建了一个简单的 2 选项卡控件,其中包含取消验证的复选框。我在选项卡上放置了一些其他控件(单选按钮和文本框)以演示“锁定”,但它们未包含在此处,因为它们背后没有代码。此代码说明了我遇到的问题。选中复选框并单击 button1 后,所有控件都变得无响应。代码如下。可应要求提供项目文件。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace TabEventTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
tabControl1.SelectedIndex++;
}
private void button2_Click(object sender, EventArgs e)
{
tabControl1.SelectedIndex--;
}
private void tabPage2_Validating(object sender, CancelEventArgs e)
{
if (checkBox2.Checked)
{
e.Cancel = true;
}
}
private void tabPage1_Validating(object sender, CancelEventArgs e)
{
if (checkBox1.Checked)
{
e.Cancel = true;
}
}
}
}
最佳答案
经过大量研究,我得出的结论是,使用在 TabPage 级别引发的事件无法做到这一点。我发现 2006 年的一篇 MSDN 论坛帖子与我的问题类似,结论是这是 .NET 框架中的错误。如果那是真的,就我所见,它仍然没有修复。
我完成验证的方法是使用 Deselecting Event在选项卡控件上。这意味着我的所有选项卡都有一个事件处理程序(然后我有根据取消选择的选项卡触发的自定义验证函数),这不像我想要的那样干净,但它是有用的。我无法按照之前的建议使用 Selecting Event,因为它只给了我导航到的选项卡,我需要验证我离开的选项卡。我第一次错过了 Deselecting 的存在。
来 self 的事件处理程序的代码:
private void tabControl1_Deselecting(object sender, TabControlCancelEventArgs e)
{
switch (e.TabPageIndex)
{
case 0:
if (!validateTab1())
{
e.Cancel = true;
}
break;
case 1:
if (!validateTab2())
{
e.Cancel = true;
}
break;
default:
break;
}
}
关于c# - 取消 TabPage.Validating 锁定我的 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24170501/