我有一个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:对不起我的英文,感谢编辑我的帖子并修复我的语法和拼写错误
答案 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}}事件在添加空间之前被触发。
工作流程因此:
OnKeyPress
; [Space]
添加到内容中;和您需要使用|
或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为用户提供提示。