2014-12-27 43 views
2

我有一個TextBox控件。在按空格之後,我想要,而不是空格,把"|"。這是我的代碼:插入「|」的問題而不是「」當空格鍵被按下時

void TextBox1KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) 
{ 
    if (e.KeyChar == (char)Keys.Space) 
    { 
     textBox1.AppendText("|"); 
    } 
} 

問題是,它不僅"|"寫,但"| ":管道字符後,它把一個空間和空間後,光標移動。我試圖用這個方法:

textBox1.Text = textBox1.Text.Substring(0, (textBox1.TextLength - 1)); 

,但它不工作,因爲它會刪除"|",而不是空間。

而另一個問題是:我想禁用插入「」時,空格按下時,文本框是空的。當U想按空間,而文本框是空的,什麼都不會發生,文本框將在文本框的開頭留空白和光標停留

我試試這個

無效TextBox1KeyDown(對象發件人,發送KeyEventArgs E)
{

如果(textBox1.Text.Length == 0 & & e.KeyCode == Keys.Space){

  textBox1.Text=string.Empty; 

    } 

}

它不起作用,導致像我以前的問題一樣的原因。該事件是經過「處理」已添加這樣的文本框不爲空

PS:對不起,我的英語和感謝誰編輯自己的帖子和修復我的語法和spellig錯誤

+0

嘗試使用'onKeyRelease' – nbro

+0

這個問題不值得投票,在我的謙虛的意見。 – nbro

+1

@nbro:我同意,大多數開發人員通過嘗試錯誤學習UI組件事件的正確順序。 –

回答

3

OnKeyPress事件之前觸發添加空間。

的工作流程是這樣的:

  1. 你按下[Space];
  2. 事件被觸發,加入|的內容;和
  3. 處理空間事件本身是爲內容添加空間。

您需要使用KeyReleaseKeyUp ...

+0

我甚至不需要知道這一點,但它提供了一個很好的見解,我將不得不考慮+1 – Carcigenicate

4

代替按鍵響應的處理在KeyDown事件

void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if(e.KeyCode == Keys.Space && e.Modifiers == Keys.None) 
    { 
     e.SuppressKeyPress = true; 
     textBox1.AppendText("|"); 
    } 
} 

正如從下面DrewMcGowen注意到您的要求,這將永遠是管加文本框文本的結尾。如果將光標移動到當前文本的某處,則此方法的行爲會令人困惑,並且可能不正確。 此代碼代替試圖放置管的確切位置光標

void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if(e.KeyCode == Keys.Space && e.Modifiers == Keys.None) 
    { 
     e.SuppressKeyPress = true; 
     int pos = textBox1.SelectionStart; 
     textBox1.Text = textBox1.Text.Substring(0, pos) + "|" + textBox1.Text.Substring(pos); 
     textBox1.SelectionStart = pos + 1; 
    } 
} 

還請注意,在Modifiers property of the KeyEventArgs參數的值的檢查是必需的。例如,ALT + SPACE應該激活系統菜單,不要以任何方式更改文本框(請參閱下面的註釋Mr HansPassant)。檢查Keys.None也會避免這種邏輯,也適用於CTRL和SHIFT修飾符,如果您想要考慮這些修飾符,則需要更改該檢查。

+0

Argh,我正要發佈這個!有一件事是,這將始終將管道放在文本的末尾而不是光標處。 –

+0

@DrewMcGowen你是對的。立即修復 – Steve

+0

對此使用KeyDown幾乎從來都不是錯誤。依靠可預測的鍵盤佈局危害您的代碼進一步向東行進,世界上任何地方的代碼中的失敗模式是Alt + Space應該顯示系統菜單,而不是添加| –

1

文件說:

使用作爲keyChar屬性樣品在運行時的擊鍵和修改按鍵在特殊的運行時環境。例如,您可以使用KeyChar在用戶輸入郵政編碼時禁用非數字按鍵,在數據輸入字段中將所有按字母順序的按鍵更改爲大寫,或者監視鍵盤或其他鍵輸入設備的特定組合鍵。

因此,所有你需要的是

if (e.KeyChar == ' ') 
{ 
    e.KeyChar = '|'; 
} 
1

你忘e.Handled = true;打壓的空間。

用用戶輸入進行矇騙是相當不明智的。這是非常迷茫,明白只是在某些情況下不起作用。明顯的故障模式是用戶輸入Ctrl + V或使用右鍵單擊+粘貼插入文本。通過驗證事件正確執行此操作:

private void textBox1_Validating(object sender, CancelEventArgs e) { 
     textBox1.Text = textBox1.Text.Replace(' ', '|'); 
    } 

如果您希望通過檢查兩個||來進一步改進此代碼,彼此相鄰或前導或尾隨|。當你不滿意時,你可以設置e.Cancel = true,使用ErrorProvider給用戶提示。

相關問題