3

我有一个带有多个 TabPages 的 TabControl,每个 TabPages 都包含多个控件。当用户使用按钮离开我的选项卡时,我想验证该选项卡上的控件是否已正确修改。具体来说,我想检查他们是否选择了单选按钮。

发生的情况是,如果验证失败(意思是,我将 CancelEventArgs 设置为 true),UI 将不再响应输入。控件仍然响应悬停和单击(意思是颜色改变),但不采取任何行动。我无法导航到其他选项卡,甚至无法使用“X”按钮关闭应用程序。

我尝试添加 errorProvider、添加 SelectTab 调用、向选项卡和选项卡上的控件添加 Focus() 调用,以及添加 MessageBox。MessageBox 允许我单击“确定”,但随后将我返回到“锁定”的 UI。将 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;
            }
        }
    }
}
4

2 回答 2

1

经过大量研究,我得出的结论是,这不能使用在 TabPage 级别引发的事件来完成。我发现 2006 年的一篇 MSDN 论坛帖子与我的问题相似,结论是这是 .NET 框架中的一个错误。如果这是真的,从我所看到的情况来看,它仍然没有得到修复。

我完成验证的方法是使用TabControl 上的取消选择事件。这意味着我的所有选项卡都有一个事件处理程序(然后我有自定义验证函数,这些函数会根据被取消选择的选项卡触发),它不像我想要的那样干净,但它很实用。我不能使用之前建议的选择事件,因为它只给了我导航到的选项卡,我需要验证我要离开的选项卡。我第一次错过了取消选择的存在。

我的事件处理程序中的代码:

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;
    }
}
于 2014-07-08T19:35:59.617 回答
0

您似乎错误地使用了验证处理程序。您应该使用 CancelEventArgs 参数来取消导航,而不是强制选项卡控件转到或停留在选项卡上。

查看此 MSDN 文章以获取有关 CancelEventArgs.Cancel 属性的文档此 Q/A 线程以获取针对您的特定方案的解释和代码示例。

您还可以使用选项卡控件的选择事件来执行验证并阻止选项卡页面更改。

Selecting 事件在选择选项卡之前发生,使处理程序能够取消选项卡更改。

在这种情况下,您将使用TabControlCancelEventArgs参数来设置Cancel = true;

于 2014-06-11T19:04:18.747 回答