2011-01-14 58 views
2

我已經寫了代碼,如果用戶輸入值大於零,以打開的形式如下如何處理文本框離開事件只有一次

private void txtNoOfAddenda_Leave(object sender, EventArgs e) 
    { 
     string traceNo = string.Empty; 
     int i = 0; 
     if (!int.TryParse(txtNoOfAddenda.Text, out i)) 
     { 
      MessageBox.Show("Enter numeric value betewwn(0-9999)"); 
      txtNoOfAddenda.Focus(); 
     } 
     else 
     { 
      if (i > 0) 
      { 
       traceNo = txtTraceNo.Text.Substring(8, 7); 
       frmAddenda frmAddenda = new frmAddenda(i, traceNo); 
       frmAddenda.ShowDialog(); 
      } 
     } 
    } 

這工作正常,但如果再次,如果我搬回我的標籤,文本框離開相同的代碼執行我只需要這個被解僱一次任何一個可以給我一個想法..

+0

你是在做這個驗證的目的? – Simon 2011-01-14 07:14:07

回答

7

如果真的希望事件處理程序只啓動一次,在處理程序中的事件只是退訂:

txtNoOfAddenda.Leave -= txtNoOfAddenda_Leave; 

我的猜測是,你只想要在其中顯示了新的形式,雖然該代碼的代碼 - 如果你不顯示消息框。

您是否真的希望用戶只能夠顯示一次的新格式?如果他們關閉那個表單並回到文本框中的那個呢?如果無法再顯示其他表單,例如如果他們改變了價值?

1

你可以把一個實例變量:

private bool eventRan = false; 
private void txtNoOfAddenda_Leave(object sender, EventArgs e) 
{ 
    if(eventRan) return; 
    eventRan = true; 
    .... 
+0

這是不是壞事(或解決辦法)的方法。正如Jon Skeet所建議的那樣,釋放處理程序 – hungryMind 2011-01-14 07:19:39

3

裏面你的方法,添加以下行:

txtNoOfAddenda.Leave -= txtNoOfAddenda_Leave; 

這將註銷事件處理程序,並確保它不會在以後再次調用。

0

在事件處理程序方法外定義表單變量,並在方法內部檢查表單是否已經實例化過。您也可以運行檢查以查看錶單是否處於打開狀態。

 
private frmAddenda _frmAddenda 

private void txtNoOfAddenda_Leave(object sender, EventArgs e) 
{ 
    ... 
    else 
    { 
    if (i > 0 && _frmAddeda == null) 
    { 
     traceNo = txtTraceNo.Text.Substring(8, 7); 
     frmAddenda frmAddenda = new frmAddenda(i, traceNo); 
     frmAddenda.ShowDialog(); 
    } 
    } 
} 
0

我只是有這個問題,並通過移動我的代碼了Leave事件,進入到Validated事件解決它。

相關問題