1

输入无效日期(必须是当前日期或过去日期)后,我有 e.Cancel = true ,但是退出按钮的关闭事件不会触发。我取出了 e.Canel = true 声明,一切似乎都运行良好,但我担心这会在未来引起另一个问题。对此进行编码的正确方法是什么?

private void maskedTextBoxDate_TypeValidationCompleted(object sender, TypeValidationEventArgs e)
    {
        if (!e.IsValidInput)
        {
            toolTip1.ToolTipTitle = "Invalid Date";
            toolTip1.Show("The data you supplied must be a valid date in the format mm/dd/yyyy.", maskedTextBoxDate, 40, 25, 2000);
        }
        else
        {
            //Now that the type has passed basic type validation, enforce more specific type rules.
            DateTime userDate = (DateTime)e.ReturnValue;
            if (userDate > DateTime.Today)
            {
                toolTip1.ToolTipTitle = "Invalid Date";         
                toolTip1.Show("The date can't be greater than today's date.", maskedTextBoxDate, 40, 25, 2000);
                //Cancel property: true if the event should be canceled; otherwise false
                e.Cancel = true;

            }
        }

    }

退出按钮关闭事件:

private void cmdExit_Click(object sender, EventArgs e)
    {
        this.Close();
    }
4

3 回答 3

1

如果您以这种方式取消类型验证事件,则 MaskedTextBox 永远不会失去焦点。这个想法是您不能将数据提交到无效的文本框中,因此它“强制”用户在继续之前输入有效数据。您必须决定如何处理文本框中未验证的数据。

解决此问题的一种方法是将 MaskedTextBox 上的 CausesValidation 属性设置为 false。这可以防止在控件失去焦点时触发验证序列。如果您这样做,您将需要以另一种方式触发验证,例如按钮(例如,“保存”)。根据您正在寻找的用户体验,这可能不可行。

于 2013-01-24T17:12:32.020 回答
0

检查日期不是在 Date 控件的 OnExit 中,而是在窗体的 Close 事件中,并将 e.cancel 设置为 true 或 false。无论如何,当用户无法从控件中逃脱时,这对用户来说是非常烦人的,通常是因为他不知道格式并且他只是想逃脱:-)

斯蒂芬·哈利米

于 2013-01-24T17:22:28.603 回答
0

有一个Control名为 的属性CausesValidation。这指示哪些控件在获得焦点时将导致先前获得焦点的控件生效。

maskedTextBoxDate.CausesValidation = true

对于每个父控件,即窗体和它之间的每个容器maskedTextBoxDate,设置CausesValidation = false

这将允许您关闭或操作表单,而不会导致控件验证。

于 2013-01-24T21:43:22.723 回答