对于DateTime,当e.Cancel = true时,不能关闭表单

时间:2013-01-24 16:22:13

标签: c# winforms

输入无效日期后我有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();
    }

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

StéphaneHalimi

答案 2 :(得分:0)

有一个名为Control的{​​{1}}属性。这表明当给定焦点时,哪些控件将导致先前聚焦的控件验证。

设置CausesValidation

对于每个父控件,即表单和它与maskedTextBoxDate.CausesValidation = true之间的每个容器,设置maskedTextBoxDate

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