C#按键不';t捕获&x27;删除';钥匙

C#按键不';t捕获&x27;删除';钥匙,c#,winforms,C#,Winforms,我在列表视图上添加了一个按键事件。通过事件上的断点,我可以看到大多数键都会触发事件。然而,其中一些,我感兴趣的(删除),只是不会触发我的事件 奇怪吗?不,我的键盘上没有坏键:D private void listView1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Delete) { ListView target =

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

奇怪吗?不,我的键盘上没有坏键: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);
            }
        }
    }

您需要使用
KeyDown
事件来执行此操作。

使用
KeyDown
keyPress
类似于完整的
keyDown
+
keyUp

原因是keyPress事件根据您按下的字符键向控件发送字符。但是,正如您所期望的,delete键并不表示字符,因此是非字符键


因此,如您所注意到的,使用KeyPress事件不会起任何作用。您应该使用KeyDown或KeyUp事件,这两种事件都可以正常工作。细微差别在于您是否希望事件在按下或松开某个键时触发。

在KeyDown中,使用以下条件

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

问题是,如果将EditMode属性设置为Editonner,它将不会启动。如果您使用EditOnKeyStrokeOfF2,它将触发事件

如果您正在寻找一个用户只能从定义的项目中进行选择的解决方案,那么我相信您可以通过以下方式完成:

  private void DropDownRank_KeyDown(object sender, KeyEventArgs e)
    {
        e.SuppressKeyPress = true;
    }
请参阅此代码:

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);
        }

    }
}
private void Form1\u加载(对象发送方,事件参数e)
{
listView1.KeyUp+=新的KeyEventHandler(ListView\u KeyUp);
}
/// 鍵盤觸發 列表视图清單
私有void ListView_KeyUp(对象发送方,KeyEventArgs e)
{
ListView ListViewControl=发件人作为ListView;
if(e.KeyCode==Keys.Delete)
{
foreach(ListViewControl中的ListViewItem每个项目。SelectedItems)
{
ListViewControl.Items.Remove(每个项目);
}
}
}

我尝试了上面提到的所有东西,但没有任何效果,因此我发布了我实际做过和做过的事情,希望能帮助与我有同样问题的其他人:

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


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
            }
        }
    }

你能包括你正在使用的代码吗?可能重复的代码不完全相同,但我的重复建议中的答案回答了这个问题。你写“正如你所期望的,删除键不代表字符。”绝对正确!更清楚地说,delete键是非字符键,因此不会触发KeyPress事件,因为当您按下字符键(如“a”等)时,它会向控件发送字符。如果delete键是字符键,则KeyPress事件将完全触发。我还将把这个添加到我的答案中以供进一步阅读。好的,那么您能解释一下,鉴于ascii表(一个字符表,一个字符集)中的backdelete和forwarddelete吗?(你是说它们不是字符)虽然DEL在ASCII表中有一个引用是正确的,但它是一个控制字符。它不代表可打印的ASCII字符(这一点应该是不言自明的),因此,它是一个非字符键。您只是以不同的方式重复自己,我不确定您的意图是什么。除非特别要求,否则无需澄清;如果每次使用约定时都要明确描述为什么要使用约定,那么它们将完全不切实际。这种环境中的约定是将ASCII控制字符称为非字符键,不知道特定语言或环境约定的人有责任通过询问或进行必要的研究来理解为什么以特定方式引用事物。