none
为何我无法利用Listbox控件中的Item.Remove()方法清除包含的元素?

    问题

  • 我正在通过Head first c#中文第二版学习.NET,目前根据书中P160尝试设计一个打字游戏,在这个项目里我需要通过timer控件往listbox里添加元素,具体方法是

    private void timer1_Tick(object sender, EventArgs e)
            {
                listBox1.Items.Add((Keys)random.Next(65, 90));}

    然后再通过窗体的KeyDown方法消除listbox的元素,具体方法是

      private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                if (listBox1.Items.Contains(e.KeyCode))
                {
                    listBox1.Items.Remove(e.KeyCode);
                    listBox1.Refresh();
                }
            }

    然后我运行时发现键入对应的值,listbox里的元素并不会消除,只会将光标移动。

    我认为问题在于istBox1.Items.Add((Keys)random.Next(65, 90));}中的(Keys)random.Next()获得的元素与e.KeyCode并不是一类元素,导致if (listBox1.Items.Contains(e.KeyCode))不为true,那么问题是(Keys)random.Next(65, 90)到底获得的是个什么类型的元素呢?

    2016年3月28日 14:18

答案

  • 谢谢,问题已解决,的确是设定form的KeyPreview属性为True就可以了。

    一开始我还以为(Keys)方法获得的字符是char属性,.Keycode方法获得的字符是别的属性,还在e.Keycode前加了显示转换(char)然后IDE告诉我这是多余的转换我才发现问题不是我想象的那样。

    总而言之谢谢你了

    • 已标记为答案 Mirage_j 2016年3月29日 5:35
    2016年3月29日 5:31
  • 我在Form属性里设置了KeyPreview为True之后可以了,可能默认Keycode方法获得的就是大写的吧
    • 已标记为答案 Mirage_j 2016年3月29日 5:35
    2016年3月29日 5:33
  • 我的Keydown事件是在Form里触发的,所以我设置From属性里的KeyPrevie方法为True就好了。
    • 已标记为答案 Mirage_j 2016年3月29日 5:35
    2016年3月29日 5:34

全部回复

  • 65~90就是 A~Z

    都是 Keys ,所以我測試是沒問題的說!

    請問 Form 的 KeyPreview 屬性有設定為 True 嗎?

    您可以在 Form1_KeyDown 上加入以下的代碼,看一下 KeyCode 的值是什麼

    Console.WriteLine("e.KeyCode:{0}, e.KeyValue:{1}", e.KeyCode, e.KeyValue);

    不管是大小寫英文,e.KeyCode 都會是大寫的哦!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2016年3月28日 15:06
  • random.Next()返回的是int, 但是你已经强制转换成了Keys(Keys是一个enum详细的见Keys Enumeration), 然后添加进ListBox. 

    e.KeyCode的类型也是Keys,  Keys是一个值类型,因此进行比较是比较值,没有问题,用在Contains里也没有问题。

    你的代码,我在测试工程里测试了一下,运行没有问题。

    我觉得测试是要注意两点,一个是listbox要有焦点,这样才能进入Key down事件,另一个是敲入大写的键(ascii 码是65到90).


    2016年3月29日 0:53
  • 谢谢,问题已解决,的确是设定form的KeyPreview属性为True就可以了。

    一开始我还以为(Keys)方法获得的字符是char属性,.Keycode方法获得的字符是别的属性,还在e.Keycode前加了显示转换(char)然后IDE告诉我这是多余的转换我才发现问题不是我想象的那样。

    总而言之谢谢你了

    • 已标记为答案 Mirage_j 2016年3月29日 5:35
    2016年3月29日 5:31
  • 我在Form属性里设置了KeyPreview为True之后可以了,可能默认Keycode方法获得的就是大写的吧
    • 已标记为答案 Mirage_j 2016年3月29日 5:35
    2016年3月29日 5:33
  • 我的Keydown事件是在Form里触发的,所以我设置From属性里的KeyPrevie方法为True就好了。
    • 已标记为答案 Mirage_j 2016年3月29日 5:35
    2016年3月29日 5:34