插入问题" |"而不是" "当按下空格键时

时间:2014-12-27 00:24:41

标签: c#

我有一个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)); 

但它不起作用,因为它会删除"|"而不是空格。

另一个问题是:我想禁用插入" "当文本框为空时按下空格。当你想在文本框为空时按空格键时,没有任何反应,文本框将保持空白,光标停留在文本框的开头

我试试这个

  

void TextBox1KeyDown(object sender,KeyEventArgs e)
  {

     

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

          textBox1.Text=string.Empty;

  }
     

}

它起作用的原因与我之前的问题相同。该事件在"之后处理。 "已添加,因此文本框不为空

PS:对不起我的英文,感谢编辑我的帖子并修复我的语法和拼写错误

4 个答案:

答案 0 :(得分:4)

而不是KeyPress在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下面的评论)。对于CTRL和SHIFT修饰符,检查Keys.None也会避免这种逻辑,如果您想要考虑这些修饰符,则需要更改该检查。

答案 1 :(得分:3)

{<1}}事件在添加空间之前被触发。

工作流程因此:

  1. 您按下OnKeyPress;
  2. 触发事件,将[Space]添加到内容中;和
  3. 处理空间事件本身会为内容添加空格。
  4. 您需要使用|KeyRelease ...

答案 2 :(得分:1)

文档说:

  

使用KeyChar属性在运行时对键击进行采样,使用在特殊运行时环境下修改击键。例如,您可以使用KeyChar在用户输入邮政编码时禁用非数字按键,在数据输入字段中将所有按字母顺序的按键更改为大写,或者监视键盘或其他键输入设备以获取特定的键组合。

所以你需要的只是

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

答案 3 :(得分:1)

您忘记了e.Handled = true;来压制空间。

使用用户输入进行修改是非常不明智的。这是非常迷惑的,在某些情况下只是不起作用。明显的失败模式是用户键入Ctrl + V或使用右键单击+粘贴来插入文本。使用Validating事件正确执行此操作:

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

您希望通过检查两个||来进一步改进此代码的概率很高彼此相邻或领先或尾随|。您可以在不满意时设置e.Cancel = true,使用ErrorProvider为用户提供提示。