2011-09-16 49 views
1

我有幾個文本框應該允許某種格式,但是當用戶在文本框中以錯誤的格式輸入它時,我想要捕獲控件名稱並清除文本框的文本。如何捕捉在C#中導致異常的控件名稱?

+2

你能告訴我們你是如何檢查格式,什麼是產生異常? –

+1

窗體?我認爲你不需要捕捉任何東西,你不會喜歡拋出你所描述的任何異常稱爲輸入驗證。 –

+0

我有幾個文本框,並且我有一個面板有三個單選按鈕(十進制,二進制和十六進制)。我只需要在每個文本框中只輸入一個字節,如果用戶輸入的字節數多於二進制「111100001」中的字節數,我就會得到格式異常。所以,爲了使一切變得簡單,我想在發生這種情況時清除控件的文本。 – Vikyboss

回答

1

清除用戶輸入,因爲它不是給定的格式是非常用戶不友好的。如果只有十個字符中的一個出錯了呢?他們必須重新輸入。只需使用MaskedTextBoxMask作爲您期望的模式。

當使用MaskedTextBox,您可以訂閱MaskInputRejected事件描述here

public void Form1_Load(Object sender, EventArgs e) 
{ 
    ... // Other initialization code 
    maskedTextBox1.Mask = "00/00/0000"; 
    maskedTextBox1.MaskInputRejected += new MaskInputRejectedEventHandler(maskedTextBox1_MaskInputRejected) 
} 

void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) 
{ 
    toolTip1.ToolTipTitle = "Invalid Input"; 
    toolTip1.Show("We're sorry, but only digits (0-9) are allowed in dates.", maskedTextBox1, maskedTextBox1.Location, 5000); 
} 
+0

我真的很喜歡,但我有一個文本框中的三種格式(十進制,二進制和十六進制)。 – Vikyboss

+0

這些是我正在尋找的最大可用值: 二進制=> 11111111 十六進制=> ff 十進制=> 255 它是否可以在掩碼文本框中使用,特別是當我嘗試時設置小數最大值似乎更難。 – Vikyboss

+1

解析'KeyPress'事件中的輸入並嘗試解析輸入。如果不正確,你可以將'e.Handled'設置爲true,所以它不會被輸入到文本框中。 – CodeCaster

0

的預期行爲拋出異常是永遠正確的,因爲它們是非常昂貴的。如果您需要查看發生異常的位置,請檢查堆棧跟蹤的第一行。

+0

如何檢查堆棧?我非常喜歡C#。 – Vikyboss

0

調試只

你可以從yourForm.cs調試模式得到控制的名字。我不認爲這個代碼會在相關cuz上運行。源文件不會在其他版本的權利?

using System.Diagnostics; 

public void ParseControlText() 
{ 
    try 
    { 
     var doubleval = Double.Parse(tb_double.Text); 
     var intval = Int32.Parse(tb_int.Text); 

     //... bunch of controls need to be parssed to calculate something 

    } 
    catch (FormatException ex) 
    { 
     var stlast = new StackTrace(ex,true).GetFrames().Last(); 

     //this requires form.cs to exist . how am i gonna do this in release? idk 
     var stLine = File.ReadLines(stlast.GetFileName()) 
      .ToList()[stlast.GetFileLineNumber()-1]; 
     var m = Regex.Match(stLine ,@"\((.*?)\..*?\)"); 
     var ctrlname = m.Groups[1].Value; 

     MessageBox.Show(ctrlname + " control's text coundnt be Parsed! "); 

    } 

}