C#keypress不捕获'删除'键

时间:2011-11-18 19:54:17

标签: c# winforms

我在ListView上添加了一个keyPress事件。通过我的事件断点,我可以看到大多数键触发事件。然而,其中一些,我感兴趣的(删除),只是不会触发我的事件。

这有点奇怪吗?不,我的键盘上没有坏键:D

    private void listView1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Delete)
        {
            ListView target = (ListView)sender;
            if (target.SelectedIndices != null && target.SelectedIndices.Count > 0)
            {
                string ric = target.SelectedItems[0].SubItems[0].Text;
                //target.Items.RemoveAt(target.SelectedIndices[0]);
                ListModels.getInstance().getModel("Vols").removeRic(ric);
            }
        }
    }

8 个答案:

答案 0 :(得分:38)

原因是KeyPress事件根据您按下的字符键向控件发送一个字符。但是,正如您所期望的那样,删除键不代表字符,因此是非字符键。

因此,使用KeyPress事件将不会发生任何事情,因为您已经注意到了。您应该使用KeyDown或KeyUp事件,其中任何一个都可以正常工作。细微之处在于您是否希望在按下或放开钥匙时触发事件。

答案 1 :(得分:4)

您需要使用KeyDown事件。

答案 2 :(得分:3)

改用keyDown; keyPress类似于完整keyDown + keyUp

答案 3 :(得分:2)

在KeyDown中使用以下条件,

if (e.KeyCode == Keys.Delete)
{
   // Your Logic....
}

答案 4 :(得分:1)

问题是如果你将EditMode属性设置为EditOnEnter,它就不会被激活。如果您使用EditOnKeyStrokeOfF2,它将触发事件

答案 5 :(得分:0)

如果您正在寻找用户只能从定义的项目中进行选择的解决方案,那么我相信您可以这样做:

  private void DropDownRank_KeyDown(object sender, KeyEventArgs e)
    {
        e.SuppressKeyPress = true;
    }

答案 6 :(得分:0)

查看此代码:

private void Form1_Load(object sender, EventArgs e)
{
    listView1.KeyUp += new KeyEventHandler(ListView_KeyUp);
}

/// <summary>鍵盤觸發 ListView 清單</summary>
private void ListView_KeyUp(object sender, KeyEventArgs e)
{
    ListView ListViewControl = sender as ListView;
    if (e.KeyCode == Keys.Delete)
    {
        foreach (ListViewItem eachItem in ListViewControl.SelectedItems)
        {
            ListViewControl.Items.Remove(eachItem);
        }

    }
}

答案 7 :(得分:0)

我尝试了上面提到的所有内容,但对我没有任何帮助,所以我张贴了我的实际工作内容,以期希望帮助其他与我有相同问题的人

在构造函数中添加事件处理程序:


public partial class Test
    {
    public Test()
        {
            this.RemoveHandler(KeyDownEvent, new KeyEventHandler(Test_KeyDown)); 
            // im not sure if the above line is needed (or if the GC takes care of it
            // anyway) , im adding it just to be safe  
            this.AddHandler(KeyDownEvent, new KeyEventHandler(Test_KeyDown), true);
            InitializeComponent();
        }
     //....
      private void Test_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                //your logic
            }
        }
    }