2010-09-26 75 views
22

嗨 我有一個包含幾個文本框和兩個按鈕取消和確定的表單。這些按鈕被分配來接受和取消窗體中的按鈕屬性。問題是我必須驗證在所有文本框中輸入的文本。c#AcceptButton和驗證

我想這樣做,如果用戶點擊確定按鈕(這是acceptButton)。所以我寫了一個負責驗證的函數,如果用戶點擊Ok按鈕,我會觸發這個函數。問題是,即使驗證函數返回false,我也無法停止關閉窗體。這是因爲我爲我的Ok按鈕分配了acceptbutto屬性。如果驗證失敗而沒有刪除接受按鈕屬性,是否有任何方法可以阻止表單關閉?

回答

1

不要在您的表單中設置AcceptButton屬性,並從您的按鈕中刪除DialogResult屬性(改爲將其設置爲DialogResult.None)。

您可以改爲在驗證碼中設置表單的DialogResult屬性。

if (allFieldsValidated) { 
    DialogResult = DialogResult.OK; 
} 
+0

我以前試過這個approuch,但是這段代碼不起作用。如果我點擊確定按鈕,並且驗證返回true,則不會發生任何事情,但是如果再次單擊按鈕Ok,就會自動關閉。 – exMode 2010-09-26 14:39:35

+0

@exMode:你什麼意思什麼都沒有發生?它沒有進入驗證?當您完成驗證後,您是否可以不將表單的DialogResult設置爲DialogResult.OK,並讓Form自動關閉? – Patrick 2010-09-26 15:59:25

+0

我的意思是即使驗證返回true,窗體也不會關閉。 Unofrtunatelly我不能從註冊DialorResult.OK – exMode 2010-09-26 16:30:19

5

一種方法是在OnFormClosing事件中應用驗證並根據驗證結果取消操作。

- 編輯 -

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (this.DialogResult == DialogResult.OK) 
    { 
     if (!IsValid()) 
     { 
      Info("Invalid data"); 
      e.Cancel = true; 
     } 
     else 
     { 
      Info("Valid data found, closing dialog"); 
     } 
    } 
    else if (this.DialogResult == DialogResult.Cancel) 
    { 
     Info("Just cancelling!"); 
    } 
} 

你可以叫上取消/確定事件this.Close();

或者,在您的確定按鈕實施中,您可以更改該按鈕的DialogResult並將其設置爲None;

acceptButton.DialogResult = DialogResult.None; 
+0

第一snipet的作品,但它也阻止從關閉,即使你點擊取消按鈕 – exMode 2010-09-26 14:20:23

+0

@exMode:根據您的評論看我的更新代碼。 'Info()'只是一個調用'MessageBox'的方法 – 2010-09-26 18:30:51

+0

但是在窗體關閉事件上監聽意味着你設置了dialogresult的值,讓對話框發佈事件分派,然後它被取消,然後窗體的dialogresult是變回無。爲什麼需要額外的步驟來監聽Form.Close?只需等待並設置DialogResult驗證時的值,而不是每次。 – Patrick 2010-09-28 10:36:16

5

在OK按鈕單擊處理變化的DialogResult到DialogResult.None驗證失敗時

+0

不工作:(儘管事實上我設置DialorResult,因爲你說 – exMode 2010-09-26 14:46:59

+1

適用於我。也許exMode意外地將它設置爲DialogResult.No,而不是DialogResult.None? – 2011-12-20 19:04:05

28

這是我們使用的工作溶液(和它有點從其他的答案編譯)。

您只需將DialogResult設置爲None即可阻止表單關閉。

//form init, auto-generated code (this is the case described) 
private void InitializeComponent() 
{ 
    //.... 
    this.AcceptButton = btnOk; 
    this.btnOk.DialogResult = DialogResult.OK; 
    //.... 
} 

//event handlers 
private void btnOK_Click(object sender, EventArgs e) 
{ 
    if (!Validate()) 
     this.DialogResult = DialogResult.None; 
} 

private void Form_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (this.DialogResult == DialogResult.None) 
     e.Cancel = true; 
} 
+1

這很好用 – 2012-09-20 22:02:27

+5

是否需要有FormClosing-EventHandler?對於我來說,將DialogResult設置爲None就足夠了。 – NobodysNightmare 2014-01-13 09:08:54

0

不要設置Button.DialogResult在設計或其他地方(不要混淆Form.DialogResult)。在Button的click處理程序中進行驗證,如果成功,則將Form.DialogResult設置爲DialogResult.OK並關閉表單。

private void OkBtn_Click(object sender, EventArgs e) 
{ 
    if (isValid()) 
    { 
     this.DialogResult = DialogResult.OK; 
     this.Close(); 
    } 
}