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值,未将对象引用设置到对象的实例.
怎么解决?

解决方案 »

  1.   

    ((TextBox)sender).Text = e.KeyCode.ToString(); 
    ----------------------
    为什么要加这个?
    Keydown事件结束后按键会自己显示到文本框中的.把这个去掉.
      

  2.   

    描述感觉有点乱啊是不是在一个textbox输入ASDW中的任一字符时,检查其他TextBox,如有刚才输入的这个字符,那么就清空?
    不知我这么理解对不?
      

  3.   

    简单的可以参考一下:private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        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;
        } 
      

  4.   

    楼上理解对的,我只是举个例子
    2楼,我开始也这么以为的,但如果你按了不别的键,如pageup,pagedown的键,你会发现textbox不会显示任何东西,
      

  5.   

    我需要在textbox中显示我按下了什么键,比如up,down
      

  6.   

    KeyDown事件改为KeyUp事件就OK了
      

  7.   

    http://www.haoliaozi.com/Main/Contents/97.htm
    这个可以参考一下, 它会在文本框显示你按下的每个键的名称
      

  8.   


    可以试试: textBox.Text = ((Keys)e.KeyChar).ToString();
      

  9.   

    以按下A为例,在KeyDown事件发生的时候,TextBox为空然后事件结束的时候,代码里面设置Textbox1.text =  e.KeyCode.ToString(); 
    所以Textbox1.text = "A"但是,手动按下的A也加到了TextBox1的Text里面,和前一个A连在一起,就成了两个A综合起来就是,原来Textbox1的Text为空
    代码里面设置了一个A,代码执行完后,手动输入的A也进入了Text,所以就是两个A
      

  10.   

    要修正这个Bug,去掉 ((TextBox)sender).Text = e.KeyCode.ToString();  行就可以了
    另外,你也需要把字母由小写转换成大写
      

  11.   

    我这么试了试,不知符合要求不?
    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; 
        } 
        

      

  12.   

    嗨,上面的回复有问题。
    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;
    }
      

  13.   

    第一,keyup里面写入这些代码肯定是不行的,大家可以调试一下
    第二,Textbox1.text =  e.KeyCode.ToString()这句代码是要显示键的键盘代码,如果按的是pageup之类的键,textbox是不会显示有关pageup键的任何信息,所以这句不能省
      

  14.   

    这个问题只能改在KeyUp事件中TextBox的显示是这样的先响应KeyDown事件,然后将TextBox的Text加入按下的键,然后响应KeyUp事件。如果放在KeyDown里面,那么输入的字符,如A,都会显示成AA。换成在KeyUp事件中以后,再对相应的TextBox进行控制。例如  (((int)((TextBox)temcol).Tag)  在使用前
    先判断Tag是否为null,如果不是Null,说明已经有输入值了,开始做转换也就是
    if (TextBox)temcol).Tag != null
    {
    //      开始做处理
    }
    //接下来,这里的赋值,会把原来输入的字符清除,就只有一个A了
    Textbox1.text =  e.KeyCode.ToString()
      

  15.   

    你前面提到的异常,是因为使用了一个空引用 ((TextBox)temcol).Tag  ,在这里加上相应的控制就OK了