c# - 取消 TabPage.Validating 锁定我的 UI

标签 c# tabcontrol validating-event

我有一个带有多个 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/

相关文章:

c# - aspnet_Membership 表中有解密密码的方法吗?

c# - TabControl - ToggleButtons 作为 TabSelector(仅 XAML 逻辑)

WPF TabItem 内容对齐始终居中

wpf - XAML DataTemplate 只创建一个实例

c# - 为什么我的验证事件没有在 C# 中触发?

c# - 将 ASP.Net OWIN 引入现有的 TopShelf Windows 服务

c# - 如何重构linq表达式树

c# - ASP.NET 3.5 onClientClick 返回 false 不工作