2010-03-20 84 views
2

當我嘗試使用窗口關閉按鈕(X)關閉窗體時,是否有任何方法可以關閉該死的錯誤提供程序。它會觸發驗證,並且用戶必須先填寫所有字段,然後才能關閉表單。這將成爲可用性問題,因爲許多人傾向於使用(X)按鈕關閉表單。Errorprovider在使用窗口關閉按鈕(X)時顯示錯誤

我已經放置了取消按鈕,導致驗證爲false,並且它也觸發了驗證。

我發現有人說,如果您使用Form.Close()函數驗證正在運行... 我怎麼能通過這個惱人的功能。

我有一個MDI sturucture和使用

CreateExam.MdiParent = Me 
     CreateExam.Show() 

顯示窗體MDI父的菜單項上單擊

,並曾以此爲集驗證

Private Sub TextBox1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating 
     If String.IsNullOrEmpty(TextBox1.Text) Then 
      Err.SetError(TextBox1, "required") 
      e.Cancel = True 
     End If 
     If TextBox1.Text.Contains("'") Then 
      Err.SetError(TextBox1, "Invalid Char") 
      e.Cancel = True 
     End If 
    End Sub 

任何幫助深表感謝。 谷歌搜索僅表現,用戶使用一個命令按鈕,關閉按鈕有問題,結果和我的情況

回答

4

的ValidateChildren()方法可以防止形式從關閉。將此代碼粘貼到您的表單中以解決此問題:

protected override void OnFormClosing(FormClosingEventArgs e) { 
    e.Cancel = false; 
} 
+0

@nobugz:非常感謝。它工作完美無瑕 – 2010-03-20 13:06:56

2

,過多導致的問題這是很簡單的解決,在你的窗體的Closing事件,設置一個標誌,指示離開形式,例如blnLeave,當表單被加載時,該標誌設置爲False,當Closing事件被觸發,設置該事件處理程序中True,那麼如下變化將

 
Private Sub TextBox1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating 

     If (blnLeave) Then 
      e.Cancel = False; 
      Return 
     End If 

     If String.IsNullOrEmpty(TextBox1.Text) Then 
      Err.SetError(TextBox1, "required") 
      e.Cancel = True 
     End If 
     If TextBox1.Text.Contains("'") Then 
      Err.SetError(TextBox1, "Invalid Char") 
      e.Cancel = True 
     End If 
    End Sub 

編輯:修改此答案的公司根據OP的評論,我的建議是處理表單的內部活動,如圖

 
    Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed 
     blnLeave = True 
    End Sub 

並在窗體的窗口過程倍率在此處理它,如下所示....

 
    Private Const SC_CLOSE As Integer = &HF060 
    Private Const WM_MENUSELECT As Integer = &H11F 
    Private Function LoWord(ByVal Num As Integer) As Integer 
     LoWord = Num & &HFFFF 
    End Function 
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
     If m.Msg = WM_MENUSELECT Then 
      If LoWord(m.WParam.ToInt32()) = SC_CLOSE Then 
       ' Handle the closing via system Menu 
       blnLeave = True 
      End If 
     End If 
     MyBase.WndProc(m) 
    End Sub 
+0

非常感謝......它的工作原理......但第二次點擊....只要我點擊關閉按鈕,它就會顯示錯誤信息第二次點擊它允許關閉窗體.........有什麼辦法來防止它? – 2010-03-20 05:04:02

+0

@Pankaj:處理Form.Close事件,並在那裏設置標誌...你可能需要通過子類化的形式添加一個覆蓋...我將修改這個答案來說明這一點.... – t0mm13b 2010-03-20 13:17:26

+0

感謝您採取該回答了。 我將使用nobugz答案作爲接受的解決方案。 – 2010-03-22 11:42:21

相關問題