我有一个具有多个TabControl的TabPages,每个TabPages都包含多个控件。当用户使用按钮离开我的选项卡时,我希望验证该选项卡上的控件是否已被正确修改。具体来说,我想检查他们是否选择了一个单选按钮。
如果验证失败(意思是,我将CancelEventArgs设置为true),UI将不再响应输入。控件仍然响应于悬停和单击(意味着颜色的变化),但不采取任何行动。我无法导航到其他选项卡,甚至关闭应用程序使用"X“按钮。
我尝试过添加errorProvider、添加SelectTab调用、向选项卡和选项卡上的控件添加一个Focus()调用,以及添加一个MessageBox。MessageBox允许我单击OK,但随后将我返回到“锁定”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;
}
}
}
}发布于 2014-07-08 19:35:59
经过大量研究,我得出的结论是,这不能使用在TabPage级别引发的事件来完成。我发现了一个与我的问题类似的2006年MSDN论坛帖子,得出的结论是,这是.NET框架中的一个bug。如果那是真的,从我所能看到的情况来看,它仍然没有被修复。
我完成验证的方式是在取消选举事件上使用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-06-11 19:04:18
看起来您使用的验证处理程序不正确。您应该使用CancelEventArgs参数来取消导航,而不是强制选项卡控件转到或停留在选项卡上。
查看本文是关于CancelEventArgs.Cancel属性的文档的和这个Q/A线程以获得特定场景的解释和代码示例。
您还可以使用选项卡控件的选择事件执行验证和阻止选项卡页更改。
选择事件发生在选项卡被选中之前,从而使处理程序能够取消选项卡更改。
在本例中,您将使用TabControlCancelEventArgs参数来设置Cancel = true;
https://stackoverflow.com/questions/24170501
复制相似问题