输入无效日期后我有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();
}
答案 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
这将让您关闭或操作表单,而不会导致控件验证。