无法获得 keydown c# 所需的输出
Unable to get desired output for keydown c#
我正在尝试使用 windows 表单创建两个同步文本框,但我似乎 运行 遇到了多个问题。也许你们可以帮助我提高效率。
如您所见,回车键没有问题,因为我已经解决了。
- 我按住 shift 键时看到一个特殊符号
- 按退格键向该行添加一个新符号。
- 同时按下后退键不会多次删除或添加(新符号)。我假设每次按下后退键都会删除 1 个字符。
- 后退键不删除新行 ("\n\r");
- 最后两行分别对应 alt 和 ctrl 键。
目前此表单的代码是
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
//Disable usage of arrowkeys
if(e.KeyCode==Keys.Left || e.KeyCode==Keys.Right || e.KeyCode==Keys.Up || e.KeyCode==Keys.Down)
{
e.SuppressKeyPress=true;
}
//Remove a character
if (e.KeyCode == Keys.Back)
textBox2.Text = textBox2.Text.Remove(textBox2.TextLength - 1, 1);
//Upper and lower case characters
if (!e.Shift && e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z)
textBox2.Text += (char)(e.KeyValue + 32);
else
textBox2.Text += (char)(e.KeyValue);
//Next Line
if (e.KeyData == Keys.Enter)
textBox2.Text += "\n\r";
}
你建议我做什么?
编辑:这不是我的最终意图。我希望将每个输入实时转换为不同的表示形式。现在,我只是检查每个输入的含义。
您为什么不直接将文本从第一个文本框复制到第二个:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
textBox2.Text = textBox1.Text;
}
我同意 M4N 的观点,将文本从一个文本框复制到下一个文本框会容易得多。
但是,如果您打算这样做,还有很长的路要走。
每次按键都会有一个值,您可以转义所有不想使用的键。
这是来自 MSDN 网站
的值的 link
https://msdn.microsoft.com/en-us/library/aa243025(v=vs.60).aspx
您已准备好使用类似的方法将字符更改为大写。
If (e.KeyValue >= 65 && e.KeyValue <= 90 ){
#check for spaces and return the enter add to other text box.
}
或者更好,使用正则表达式模式。
Regex regex = new Regex(@"[0-9A-Z\s]+");
MatchCollection matches = regex.Matches(textValue);
解决方案来自 Only allow specific characters in textbox
我已经解决了。这与 user3649914 所建议的一致。
以下解决了这个问题,但在这种情况下,if else 条件的顺序非常重要。不确定如此严重依赖 if else 的顺序是否是良好的编程习惯。
//Upper and lower case characters
if (!e.Shift && e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z)
textBox2.Text += (char)(e.KeyValue + 32);
else if (e.Shift && e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z)
textBox2.Text += (char)(e.KeyValue);
else if (e.Shift || e.Alt || e.Control)
textBox2.Text += "";
想法是user3649914提到的,关于t
我正在尝试使用 windows 表单创建两个同步文本框,但我似乎 运行 遇到了多个问题。也许你们可以帮助我提高效率。
如您所见,回车键没有问题,因为我已经解决了。
- 我按住 shift 键时看到一个特殊符号
- 按退格键向该行添加一个新符号。
- 同时按下后退键不会多次删除或添加(新符号)。我假设每次按下后退键都会删除 1 个字符。
- 后退键不删除新行 ("\n\r");
- 最后两行分别对应 alt 和 ctrl 键。
目前此表单的代码是
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
//Disable usage of arrowkeys
if(e.KeyCode==Keys.Left || e.KeyCode==Keys.Right || e.KeyCode==Keys.Up || e.KeyCode==Keys.Down)
{
e.SuppressKeyPress=true;
}
//Remove a character
if (e.KeyCode == Keys.Back)
textBox2.Text = textBox2.Text.Remove(textBox2.TextLength - 1, 1);
//Upper and lower case characters
if (!e.Shift && e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z)
textBox2.Text += (char)(e.KeyValue + 32);
else
textBox2.Text += (char)(e.KeyValue);
//Next Line
if (e.KeyData == Keys.Enter)
textBox2.Text += "\n\r";
}
你建议我做什么?
编辑:这不是我的最终意图。我希望将每个输入实时转换为不同的表示形式。现在,我只是检查每个输入的含义。
您为什么不直接将文本从第一个文本框复制到第二个:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
textBox2.Text = textBox1.Text;
}
我同意 M4N 的观点,将文本从一个文本框复制到下一个文本框会容易得多。
但是,如果您打算这样做,还有很长的路要走。
每次按键都会有一个值,您可以转义所有不想使用的键。
这是来自 MSDN 网站
的值的 linkhttps://msdn.microsoft.com/en-us/library/aa243025(v=vs.60).aspx
您已准备好使用类似的方法将字符更改为大写。
If (e.KeyValue >= 65 && e.KeyValue <= 90 ){
#check for spaces and return the enter add to other text box.
}
或者更好,使用正则表达式模式。
Regex regex = new Regex(@"[0-9A-Z\s]+");
MatchCollection matches = regex.Matches(textValue);
解决方案来自 Only allow specific characters in textbox
我已经解决了。这与 user3649914 所建议的一致。
以下解决了这个问题,但在这种情况下,if else 条件的顺序非常重要。不确定如此严重依赖 if else 的顺序是否是良好的编程习惯。
//Upper and lower case characters
if (!e.Shift && e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z)
textBox2.Text += (char)(e.KeyValue + 32);
else if (e.Shift && e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z)
textBox2.Text += (char)(e.KeyValue);
else if (e.Shift || e.Alt || e.Control)
textBox2.Text += "";
想法是user3649914提到的,关于t