2012-07-16 28 views
1

:) 我正在製作C#打字程序 並且我希望用戶無法當他鍵入一個錯誤的字母時,輸入任何東西, (我希望打字光標在它的位置凍結) 當他按下退格鍵時,只有這樣他才能恢復打字。如何在C#windows應用程序中鎖定文本框(防止用戶輸入任何內容)(不禁用它或使其不可見)

我已經通過操縱ConsoleScreenCursorCoordinates在C++中完成了這個程序,我試圖在C#中通過操作textBox.Location來做同樣的事情,但它沒有起作用。

在我的計劃中,有2個文本框,在sourceTextBox和TypingTextBox 還有一個名爲「文本」字符串變量,它從一個文本文件 通過一個StreamReader讀取,然後我用這個文本變量的每個元素進行比較從它與用戶輸入的內容。

我厭倦了這一點:

bool madeMistake = false; 
Point CurrentTypingPosition; 
string whatIsWrittenBeforeTheMistake = ""; 

private void TypingTextBox_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    try 
    { 
     if (!madeMistake) 
     { 
      if (e.KeyChar == text[typingIndex]) 
      { 
       typingIndex++; 
      } 
      else if (e.KeyChar == backspace) 
      { 
       typingIndex--; 
      } 
      else 
      { 
       CurrentTypingPosition = TypingTextBox.Location; 
       madeMistake = true; 
       TypingTextBox.Text += " "; 
       TypingTextBox.Location = CurrentTypingPosition; 
       whatIsWrittenBeforeTheMistake = TypingTextBox.Text; 
      } 
     } 
     else 
     { 

      if (e.KeyChar == backspace) 
       madeMistake = false; 
      else 
      { 
       TypingTextBox.Text = whatIsWrittenBeforeTheMistake; 
       TypingTextBox.Location = CurrentTypingPosition; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
    } 
} 

回答

2

在此另一個變化是使用KeyPress事件參數的Handled屬性,所以你喜歡的東西:

void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
{ 

    if (Char.IsControl(e.KeyChar)) 
    { 
     e.Handled = false; 
     return; 
    } 

    char expectedNext = expected[textBox1.SelectionStart]; 

    if (expectedNext != e.KeyChar) 
    { 
     e.Handled = true; 
     Console.WriteLine("Incorrect input"); 
    } 
} 
+0

與其他方法一樣,當用戶使用箭頭鍵時,這一切都變得很奇怪。根據史蒂夫的建議,最終制定一個分級控制將是最好的。 – 2012-07-16 17:55:44

1

將這項工作嗎?

private void TypingTextBox_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     ... 
     if (madeMistake) 
      TypingTextBox.ReadOnly = true; 
     ... 
    } 
+0

不,cuz然後我將如何閱讀用戶退格? – vexe 2012-07-16 17:41:16

+0

當ReadOnly爲true時,用戶鍵入時KeyPress仍會觸發。 – 2012-07-16 17:42:35

+0

哇,真的不知道,它工作得很好,THANX :))) – vexe 2012-07-16 17:44:24

2

另一個更健壯的方法是創建一個從TextBox本身繼承的自定義TextBox。然後,您將能夠處理KeyDown(PreviewKeyDown)事件等,並在每次關鍵擊時確定是否有錯誤。如果無效,您可以將KeyEventArgs(e.Handled)設置爲true,並阻止進一步的用戶輸入(除了backspace,您可以檢查)。

這樣可以避免必須掛鉤到Textbox事件中,如果使用MVVM,這是可取的。如果你需要非常細緻的控制,你可以使用這種方法。

0

你將不得不調整這使用StreamReader對象來代替字符數組我在這裏使用,但這會起作用,但不要求他們必須退格。

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
    {    
     char[] charArr = { 'a', 'b', 'c' }; //spec out what is acceptable here 

     foreach (char c in charArr) 
     { 
      if (e.KeyChar.CompareTo(c) > 0) 
      { 
       e.Handled = true;      
      } 
      else 
      { 
       e.Handled = false; 
      } 
     } 
    } 
相關問題