if ((e.KeyValue>=33 && e.KeyValue<=36) || (e.KeyValue>=45 && e.KeyValue<=46) ||
(e.KeyValue>=48 && e.KeyValue<=57) || (e.KeyValue>=65 && e.KeyValue<=90) ||
(e.KeyValue>=96 && e.KeyValue<=107) || (e.KeyValue>=109 && e.KeyValue<=111) ||
(e.KeyValue>=186 && e.KeyValue<=192) || (e.KeyValue>=219 && e.KeyValue<=222 ))
{
foreach (Control c in groupBox1.Controls)
{
Control temcol = c as TextBox;
if (temcol != null && ((TextBox)temcol).Text != "")
{
if (((int)((TextBox)temcol).Tag) == e.KeyValue)
{
((TextBox)temcol).Text = "";
((TextBox)temcol).Tag = Keys.None;
}
}
} ((TextBox)sender).Text = e.KeyCode.ToString();
((TextBox)sender).Tag = (Keys)e.KeyValue;
}这段代码是设置游戏中的按键,如ASDW控制方向键,比如第一个texbox1设置的是A,当在textBox2中设置A的时候,textBox1的设置变成空的(因为冲突),问题是我按下A后文本框中显示的不是A,而是AA,不要跟我说在keyup事件中写入这段代码,因为在textbox中按下键后, if (temcol != null && ((TextBox)temcol).Text != "")
会执行if块中的语句,因为在keyup事件之前发生了keydown事件导致((TextBox)temcol).Text !="",那么在遇到if (((int)((TextBox)temcol).Tag) == e.KeyValue)的时候,)((TextBox)temcol).Tag的值是个null值,未将对象引用设置到对象的实例.
怎么解决?
(e.KeyValue>=48 && e.KeyValue<=57) || (e.KeyValue>=65 && e.KeyValue<=90) ||
(e.KeyValue>=96 && e.KeyValue<=107) || (e.KeyValue>=109 && e.KeyValue<=111) ||
(e.KeyValue>=186 && e.KeyValue<=192) || (e.KeyValue>=219 && e.KeyValue<=222 ))
{
foreach (Control c in groupBox1.Controls)
{
Control temcol = c as TextBox;
if (temcol != null && ((TextBox)temcol).Text != "")
{
if (((int)((TextBox)temcol).Tag) == e.KeyValue)
{
((TextBox)temcol).Text = "";
((TextBox)temcol).Tag = Keys.None;
}
}
} ((TextBox)sender).Text = e.KeyCode.ToString();
((TextBox)sender).Tag = (Keys)e.KeyValue;
}这段代码是设置游戏中的按键,如ASDW控制方向键,比如第一个texbox1设置的是A,当在textBox2中设置A的时候,textBox1的设置变成空的(因为冲突),问题是我按下A后文本框中显示的不是A,而是AA,不要跟我说在keyup事件中写入这段代码,因为在textbox中按下键后, if (temcol != null && ((TextBox)temcol).Text != "")
会执行if块中的语句,因为在keyup事件之前发生了keydown事件导致((TextBox)temcol).Text !="",那么在遇到if (((int)((TextBox)temcol).Tag) == e.KeyValue)的时候,)((TextBox)temcol).Tag的值是个null值,未将对象引用设置到对象的实例.
怎么解决?
----------------------
为什么要加这个?
Keydown事件结束后按键会自己显示到文本框中的.把这个去掉.
不知我这么理解对不?
{
if ((e.KeyChar >= 33 && e.KeyChar <= 36) || (e.KeyChar >= 45 && e.KeyChar <= 46) ||
(e.KeyChar >= 48 && e.KeyChar <= 57) || (e.KeyChar >= 65 && e.KeyChar <= 90) ||
(e.KeyChar >= 96 && e.KeyChar <= 107) || (e.KeyChar >= 109 && e.KeyChar <= 111) ||
(e.KeyChar >= 186 && e.KeyChar <= 192) || (e.KeyChar >= 219 && e.KeyChar <= 222))
{
foreach (Control c in this.Controls)
{
Control temcol = c as TextBox;
if (temcol != null && ((TextBox)temcol).Text != "")
{
if (((int)((TextBox)temcol).Tag) == e.KeyChar)
{
((TextBox)temcol).Text = "";
((TextBox)temcol).Tag = Keys.None; }
} } ((TextBox)sender).Tag = (Keys)e.KeyChar;
}
2楼,我开始也这么以为的,但如果你按了不别的键,如pageup,pagedown的键,你会发现textbox不会显示任何东西,
这个可以参考一下, 它会在文本框显示你按下的每个键的名称
可以试试: textBox.Text = ((Keys)e.KeyChar).ToString();
所以Textbox1.text = "A"但是,手动按下的A也加到了TextBox1的Text里面,和前一个A连在一起,就成了两个A综合起来就是,原来Textbox1的Text为空
代码里面设置了一个A,代码执行完后,手动输入的A也进入了Text,所以就是两个A
另外,你也需要把字母由小写转换成大写
public class Form1
{
private void TextBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
foreach (Control c in this.GroupBox1.Controls) {
if (object.ReferenceEquals(c.GetType, typeof(System.Windows.Forms.TextBox))) {
TextBox txtbox = (TextBox)c;
if (!object.ReferenceEquals(txtbox, sender)) {
if (!string.IsNullOrEmpty(txtbox.Text) && txtbox.Tag == e.KeyValue) {
txtbox.Text = "";
txtbox.Tag = Keys.None;
}
}
}
}
((TextBox)sender).Tag = e.KeyValue;
}
private void // ERROR: Handles clauses are not supported in C# Form1_Load(object sender, System.EventArgs e)
{
TextBox1.KeyDown += TextBox_KeyDown;
TextBox2.KeyDown += TextBox_KeyDown;
TextBox3.KeyDown += TextBox_KeyDown;
TextBox4.KeyDown += TextBox_KeyDown;
}
}
使用其他工具自动转成c#的代码如下
public class Form1
{
private void TextBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
foreach (Control c in this.GroupBox1.Controls) {
if (object.ReferenceEquals(c.GetType, typeof(System.Windows.Forms.TextBox))) {
TextBox txtbox = (TextBox)c;
if (!object.ReferenceEquals(txtbox, sender)) {
if (!string.IsNullOrEmpty(txtbox.Text) && txtbox.Tag == e.KeyValue) {
txtbox.Text = "";
txtbox.Tag = Keys.None;
}
}
}
}
((TextBox)sender).Tag = e.KeyValue;
}
private void // ERROR: Handles clauses are not supported in C# Form1_Load(object sender, System.EventArgs e)
{
TextBox1.KeyDown += TextBox_KeyDown;
TextBox2.KeyDown += TextBox_KeyDown;
TextBox3.KeyDown += TextBox_KeyDown;
TextBox4.KeyDown += TextBox_KeyDown;
}
}
private void Form1_Load(object sender, EventArgs e)
{
this.TextBox1.KeyDown += new KeyEventHandler(this.TextBox_KeyDown);
this.TextBox2.KeyDown += new KeyEventHandler(this.TextBox_KeyDown);
this.TextBox3.KeyDown += new KeyEventHandler(this.TextBox_KeyDown);
this.TextBox4.KeyDown += new KeyEventHandler(this.TextBox_KeyDown);
} private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
IEnumerator VB$t_ref$L0;
try
{
VB$t_ref$L0 = this.GroupBox1.Controls.GetEnumerator();
while (VB$t_ref$L0.MoveNext())
{
Control c = (Control) VB$t_ref$L0.Current;
if (c.GetType() == typeof(TextBox))
{
TextBox txtbox = (TextBox) c;
if ((txtbox != sender) && ((((txtbox.Text != "") && Operators.ConditionalCompareObjectEqual(txtbox.Tag, e.KeyValue, false)) ? 1 : 0) != 0))
{
txtbox.Text = "";
txtbox.Tag = Keys.None;
}
}
}
}
finally
{
if (VB$t_ref$L0 is IDisposable)
{
(VB$t_ref$L0 as IDisposable).Dispose();
}
}
((TextBox) sender).Tag = e.KeyValue;
}
第二,Textbox1.text = e.KeyCode.ToString()这句代码是要显示键的键盘代码,如果按的是pageup之类的键,textbox是不会显示有关pageup键的任何信息,所以这句不能省
先判断Tag是否为null,如果不是Null,说明已经有输入值了,开始做转换也就是
if (TextBox)temcol).Tag != null
{
// 开始做处理
}
//接下来,这里的赋值,会把原来输入的字符清除,就只有一个A了
Textbox1.text = e.KeyCode.ToString()