2013-01-24 57 views
1

輸入無效日期(必須是正確的或過去的日期)後,e.Cancel = true,但退出按鈕的關閉事件不會觸發。我拿出了e.Canel = true聲明,一切似乎都正常,但我擔心這會在未來導致另一個問題。對此進行編碼的正確方法是什麼?當e.Cancel = True時,表單無法關閉DateTime

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

當你嘗試退出時觸發'TypeValidationCompleted'事件? – AbZy

+0

如果用戶沒有輸入日期,我必須說不,它不會觸發。但他們可能會將它拖到下一個文本框中,然後它會。 – KFP

+0

我不明白你爲什麼取消TypeValidationEventArgs事件?通過明確設置事件取消意味着你不想驗證?不要這樣做,你可以使用公共變量並隨時隨地讀取其值。 –

回答

1

如果取消以這種方式類型驗證事件時,MaskedTextBox中從來沒有失去焦點。這個想法是你不能將數據提交給無效的文本框,因此在繼續之前「強制」用戶輸入有效數據。您將不得不決定如何在文本框中處理未驗證的數據。

解決此問題的一種方法是將MaskedTextBox上的CausesValidation屬性設置爲false。這可以防止控件失去焦點時激活驗證序列。如果你這樣做,你需要以另一種方式觸發驗證,例如按鈕(例如「保存」)。根據您正在尋找的用戶體驗,這可能不可行。

0

在日期控件的OnExit中,但在窗體的Close事件中,請將您的日期剪掉,並將e.cancel設置爲true或false。 不管怎麼說,這是對用戶來說非常刺激他的時候沒有辦法從控制逃脫,往往是因爲他不知道日的格式和他只想逃離:-)

斯特凡哈里米

+0

在FormClosing事件中,我嘗試了一個如果DateTime.TryParse,但這不會做任何事情來防止用戶輸入將來的日期或格式不正確。如何在關閉事件中使用vaidation? – KFP

0

有一個名爲CausesValidationControl屬性。這表明哪些控件在給定焦點時會導致以前聚焦的控件進行驗證。

maskedTextBoxDate.CausesValidation = true

對於每一位家長控制,即形式與它和maskedTextBoxDate之間的每個容器,設置CausesValidation = false

這將讓你接近或操縱的形式,而不會導致驗證控制。