嗨 我有一個包含幾個文本框和兩個按鈕取消和確定的表單。這些按鈕被分配來接受和取消窗體中的按鈕屬性。問題是我必須驗證在所有文本框中輸入的文本。c#AcceptButton和驗證
我想這樣做,如果用戶點擊確定按鈕(這是acceptButton)。所以我寫了一個負責驗證的函數,如果用戶點擊Ok按鈕,我會觸發這個函數。問題是,即使驗證函數返回false,我也無法停止關閉窗體。這是因爲我爲我的Ok按鈕分配了acceptbutto屬性。如果驗證失敗而沒有刪除接受按鈕屬性,是否有任何方法可以阻止表單關閉?
嗨 我有一個包含幾個文本框和兩個按鈕取消和確定的表單。這些按鈕被分配來接受和取消窗體中的按鈕屬性。問題是我必須驗證在所有文本框中輸入的文本。c#AcceptButton和驗證
我想這樣做,如果用戶點擊確定按鈕(這是acceptButton)。所以我寫了一個負責驗證的函數,如果用戶點擊Ok按鈕,我會觸發這個函數。問題是,即使驗證函數返回false,我也無法停止關閉窗體。這是因爲我爲我的Ok按鈕分配了acceptbutto屬性。如果驗證失敗而沒有刪除接受按鈕屬性,是否有任何方法可以阻止表單關閉?
不要在您的表單中設置AcceptButton
屬性,並從您的按鈕中刪除DialogResult
屬性(改爲將其設置爲DialogResult.None
)。
您可以改爲在驗證碼中設置表單的DialogResult屬性。
if (allFieldsValidated) {
DialogResult = DialogResult.OK;
}
一種方法是在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;
第一snipet的作品,但它也阻止從關閉,即使你點擊取消按鈕 – exMode 2010-09-26 14:20:23
@exMode:根據您的評論看我的更新代碼。 'Info()'只是一個調用'MessageBox'的方法 – 2010-09-26 18:30:51
但是在窗體關閉事件上監聽意味着你設置了dialogresult的值,讓對話框發佈事件分派,然後它被取消,然後窗體的dialogresult是變回無。爲什麼需要額外的步驟來監聽Form.Close?只需等待並設置DialogResult驗證時的值,而不是每次。 – Patrick 2010-09-28 10:36:16
在OK按鈕單擊處理變化的DialogResult到DialogResult.None
驗證失敗時
不工作:(儘管事實上我設置DialorResult,因爲你說 – exMode 2010-09-26 14:46:59
適用於我。也許exMode意外地將它設置爲DialogResult.No,而不是DialogResult.None? – 2011-12-20 19:04:05
這是我們使用的工作溶液(和它有點從其他的答案編譯)。
您只需將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;
}
這很好用 – 2012-09-20 22:02:27
是否需要有FormClosing-EventHandler?對於我來說,將DialogResult設置爲None就足夠了。 – NobodysNightmare 2014-01-13 09:08:54
不要設置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();
}
}
我以前試過這個approuch,但是這段代碼不起作用。如果我點擊確定按鈕,並且驗證返回true,則不會發生任何事情,但是如果再次單擊按鈕Ok,就會自動關閉。 – exMode 2010-09-26 14:39:35
@exMode:你什麼意思什麼都沒有發生?它沒有進入驗證?當您完成驗證後,您是否可以不將表單的DialogResult設置爲DialogResult.OK,並讓Form自動關閉? – Patrick 2010-09-26 15:59:25
我的意思是即使驗證返回true,窗體也不會關閉。 Unofrtunatelly我不能從註冊DialorResult.OK – exMode 2010-09-26 16:30:19