0

这是我的情况:我有TabControl两个TabPage'stabPage1& tabPage2)。tabPage2有一个我创建的自定义用户控件(因为它在多种表单中使用),其中包含一个TextBox通过自定义用户控件的事件附加了一些自定义验证Validating的自定义用户控件。如果我tabPage2选择并在文本框中输入了无效数据并尝试离开文本框,则验证会正常工作,我的自定义事件处理程序会运行,并且事情会按照我告诉他们的方式运行。但是,如果(在同一场景中)我切换到tabPage1fromtabPage2而不是仅仅离开文本框,则允许切换到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();
  }
}
4

2 回答 2

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);
}
于 2013-06-28T20:51:57.020 回答
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;
}
于 2013-06-28T21:31:34.707 回答