按下空格键时插入“|”而不是“”时出现问题

本文关键字:问题 空格键 插入 | 更新日期: 2023-09-27 18:35:19

我有一个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:对不起我的英语,感谢编辑我的帖子并修复我的语法和拼写错误的人

按下空格键时插入“|”而不是“”时出现问题

而不是 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;   
    }
}

另请注意,必须检查 KeyEventArgs 参数的修饰符属性的值。例如,ALT + SPACE应该激活系统菜单,而不是以任何方式更改文本框(请参阅HansPassant先生下面的评论)。检查Keys.None将避免 CTRL 和 SHIFT 修饰符的此逻辑,如果您希望考虑这些修饰符,则需要更改该检查。

在添加空格之前触发OnKeyPress事件。

因此,工作流程是:

  1. 你按下[Space];
  2. 触发事件,向内容添加|;和
  3. 处理空间事件本身,向内容添加空间。

您需要使用KeyReleaseKeyUp...

文档 说:

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

所以你所需要的只是

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

你忘了e.Handled = true;来抑制空格。

使用用户输入是相当不明智的。 它非常令人迷失方向,在某些情况下,简单是行不通的。 明显的失败模式是用户键入 Ctrl+V 或使用右键单击 + 粘贴插入文本。 使用验证事件正确执行此操作:

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

检查彼此相邻的两个 || 或前导或尾随 |来进一步改进此代码的可能性很高。 你可以设置 e.Cancel = true 当你不满意时,使用 ErrorProvider 给用户提示。