2014-09-25 91 views
-3

我有一個文本框,其中包含字母和數字以及其他符號,您可以在鍵盤上找到它們。我有這樣的代碼,當我手動將數據放入時它可以正常工作,它只允許我放入數字並刪除字母。一切都是我想要的,除了數據被複制和粘貼之外,它們都不起作用。下面是我的代碼。從文本框中提取數字

private void textBox7_TextChanged(object sender, EventArgs e) 
{ 
    Exception X = new Exception(); 

    TextBox T = (TextBox)sender; 

    T.Text = T.Text.Trim(); 
    try 
    { 
     if (T.Text != "-") 
     { 
      int x = int.Parse(T.Text); 
     } 
    } 
    catch (Exception) 
    { 
     try 
     { 
      int CursorIndex = T.SelectionStart - 1; 
      T.Text = T.Text.Remove(CursorIndex, 1); 

      //Align Cursor to same index 
      T.SelectionStart = CursorIndex; 
      T.SelectionLength = 0; 
     } 
     catch (Exception) { } 

    } 
} 
+0

請寄出編譯的代碼。你有很多我爲你修復的錯誤括號。 – gunr2171 2014-09-25 17:56:15

+0

嘗試添加一個斷點,然後再次粘貼文本?...我不知道是否粘貼在整個字符串中,而不是手動輸入TextChanged方法每個字符將被調用一次...... – Ian 2014-09-25 18:00:40

+0

@Ian這就是究竟是什麼粘貼。 – juharr 2014-09-25 18:04:58

回答

0

從文本框的文本中刪除非數字字符,使用Regex.Replace

private void numericTextbox_TextChanged(object sender, EventArgs e) 
{ 
    TextBox tb = (TextBox)sender; 
    tb.Text = Regex.Replace(tb.Text, "\\-?[^\d]", ""); 
} 

嘗試正則表達式替換這將取代任何非數字字符(除了在前面的儀表板,負數字),每當框中的文本發生變化時,無論用戶是直接輸入內容還是從別處粘貼文本,都不會有任何內容。

另外,如果你想保留任何破折號(,比如說,一個電話號碼):

tb.Text = Regex.Replace(tb.Text, "\\[^-\d]", ""); 
+0

這不處理作爲負號的第一個字符。 – juharr 2014-09-25 18:14:26

+0

好點。我相應地編輯了我的正則表達式。 – 2014-09-25 19:06:51

0

基本上你的問題是,粘貼值僅適用於整個更換一次調用TextChanged事件。你的代碼依賴於被放入文本框的每個字符所調用的事件。

這聽起來像你真正想要做的是在可能的負號後過濾所有非數值。如果是這種情況,你可以這樣做。

private void textBox7_TextChanged(object sender, EventArgs e) 
{ 
    textBox7.Text = string.Concat(
     textBox7.Text.Trim().Where((c,i)=>char.IsDigit(c) || (i==0 && c=='-'))); 
} 

該代碼使用LINQ要經過每一個字符,修剪開頭和結尾的空格,只保留了那些數字或負號,如果它是第一個字符的那些之後。它相當於以下內容。

private void textBox7_TextChanged(object sender, EventArgs e) 
{ 
    StringBuilder builder = new StringBuilder() 
    string trimmed = textBox7.Text.Trim(); 
    for(int i=0; i<trimmed.Length; i++) 
    { 
     char c = trimmed.Text[i]; 
     if(char.IsDigit(c) || (i==0 && c=='-')) 
     { 
      builder.Append(c); 
     } 
    } 

    textBox7.Text = builder.ToString(); 
} 
0

你當前的代碼的問題是,你只是從光標位置刪除最後輸入的字符。粘貼超過一個字符的文本會破壞你的算法。

假設您粘貼9個字母,CursorIndex爲9,您只刪除一個字符(即T.Text = T.Text.Remove(CursorIndex, 1);行),剩下8個不正確的字符。

一個更好的方法(這是不是過於複雜,像你這樣)是這樣的:

private void textBox7_TextChanged(object sender, EventArgs e) 
{ 
    textBox7.Text = string.Concat(textBox7.Text.Where(char.IsDigit)); 
} 

所以在這裏我們要替換每個更改文本與包含經過每個字符的新文本char.IsDigit測試。但是,光標不會處於良好的位置。除非在字符串中間的多個編輯預計,它可能是最好只在方法結束錶帶

textBox1.SelectionStart = textBox1.Text.Length; 

,它會過於處理粘貼的文本。

要處理這種情況,如果您不想在文本框中只刪除字符-,那麼可以添加明顯的if條件。在全球範圍內,它看起來像這樣:

private void textBox7_TextChanged(object sender, EventArgs e) 
{ 
    if (textbox7.Text != "-") 
     textBox7.Text = string.Concat(textBox7.Text.Where(char.IsDigit)); 

    textBox1.SelectionStart = textBox1.Text.Length; 
} 
+0

這不處理第一個字符是負號。 – juharr 2014-09-25 18:12:49

+0

@juharr編輯,即使做什麼是相當不明顯的。 – 2014-09-25 18:16:19

0

試試這個。它將舊值保存在var中,如果新值無法解析,則會將文本恢復爲old。否則,它會將old更新爲最新的有效值。這是你採取的另一種方法,但在我看來更簡單。

string old; 
private void textBox7_TextChanged(object sender, EventArgs e) { 
    int i; 
    if (textBox1.Text == "" || int.TryParse(textBox7.Text, out i)) { 
     old = textBox7.Text; 
    } else { 
     textBox7.Text = old; 
    } 
}