以下是我的情况:我有一个TabControl
,其中包含两个TabPage's
(tabPage1
& tabPage2
)。 tabPage2
有一个我自己创建的自定义用户控件(因为它以多种形式使用),其上包含一个TextBox
,它通过Validating
事件附加了一些自定义验证自定义用户控件。如果我选择tabPage2
并在文本框中输入了无效数据并尝试离开文本框,则验证将按预期工作,我的自定义事件处理程序将运行,并且操作正如我告诉他们的那样。但是,如果(在相同的情况下)我从tabPage1
切换到tabPage2
而不是仅仅离开文本框,则可以切换到tabPage1
。然后我的文本框验证两次。另外,我无法控制表单上的任何其他内容,因为如果发现文本框无效,我会给文本框提供焦点,但我看不到文本框能够将任何有效数据放入其中! (我希望一切都有道理。如果需要,不要害怕让我澄清。)
以下是我的问题:如果发现某个字段无效,我怎样才能停止切换标签;因此,还解决了运行两次验证的问题?
这是我的代码:(此方法包含在提到的自定义用户控件中。)
private void OnValidatingUserControl(object sender, CancelEventArgs args)
{
if (IsTextBoxInvalid())
{
args.Cancel = true;
MessageBox.Show("Invalid data in text box!!!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.textBox.Focus();
}
}
答案 0 :(得分:1)
我通过执行以下操作修复了此问题:
tabCtrl.CausesValidation = false;
tabPage1.CausesValidation = false;
tabPage2.CausesValidation = false;
userCtrl.CausesValidation = false;
只要用户无法在没有验证的情况下离开表单,我真的不在乎是否切换标签。因此,此解决方案允许切换选项卡,但仍允许正常验证。我还重新编写了我的OnValidatingTextBox代码,以便在将错误地放在焦点之前选择选项卡:
private void OnValidatingUserControlPanel(object sender, CancelEventArgs args)
{
if (IsTextBoxInvalid())
{
args.Cancel = true;
MessageBox.Show("Invalid data in text box!!!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.GiveFocusToControlIfTabPage(this.Parent);
this.textBox.Focus();
}
}
private void GiveFocusToControlIfTabPage(Control ctrl)
{
if (ctrl== null)
{
return;
}
if (ctrl is TabPage)
{
TabPage tabPage = (TabPage)ctrl;
((TabControl)tabPage.Parent).SelectedTab = tabPage;
return;
}
this.GiveFocusToControlIfTabPage(ctrl.Parent);
}
答案 1 :(得分:0)
虽然您已找到问题的解决方案,但如果您需要阻止用户更改标签,则可以创建全局变量
static class GlobalVariables
{
public static bool UserControlValidationError = false;
}
在OnValidatingUserControl中更改其状态
private void OnValidatingUserControl(object sender, CancelEventArgs args)
{
if (IsTextBoxInvalid())
{
args.Cancel = true;
GlobalVariables.UserControlValidationError = true;
MessageBox.Show("Invalid data in text box!!!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.textBox.Focus();
}
else
{
GlobalVariables.UserControlValidationError = false;
}
}
并阻止标签像这样更改
private void tabCtrl_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = GlobalVariables.UserControlValidationError;
}