按下空格键时插入“|”而不是“”时出现问题
本文关键字:问题 空格键 插入 | 更新日期: 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
事件。
因此,工作流程是:
- 你按下
[Space]
; - 触发事件,向内容添加
|
;和 - 处理空间事件本身,向内容添加空间。
您需要使用KeyRelease
或KeyUp
...
文档 说:
使用 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 给用户提示。