Подтвердить что ты не робот

С# keypress не захватывает ключ "delete"

Я добавил событие keyPress на ListView. С точкой останова на моем событии я вижу, что большинство ключей запускают событие. Тем не менее, некоторые из них, которые меня интересуют (удаляют), просто не вызовут моего события.

Это странно? И нет, на моей клавиатуре нет сломанных клавиш: 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);
            }
        }
    }
4b9b3361

Ответ 1

Причина этого в том, что событие KeyPress отправляет символ в элемент управления на основе нажатой клавиши. Однако, как и следовало ожидать, ключ удаления не представляет символ и, следовательно, является не символьным ключом.

Поэтому использование события KeyPress ничего не даст, как вы заметили. Вы должны использовать KeyDown или KeyUp Events, которые будут работать абсолютно нормально. Нюанс в том, хотите ли вы, чтобы ваше событие срабатывало при нажатии или отпускании клавиши.

Ответ 2

Для этого вам понадобится событие KeyDown.

Ответ 3

Используйте keyDown; keyPress - это что-то вроде полного keyDown + keyUp

Ответ 4

В KeyDown используйте условие следующим образом:

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

Ответ 5

Проблема заключается в том, что если вы установите свойство EditMode в EditOnEnter, это не сработает. Если вы используете EditOnKeyStrokeOfF2, он запустит событие

Ответ 6

Если вы ищете решение, в котором пользователь должен иметь возможность выбирать только из определенных элементов, то, я думаю, вы можете сделать это следующим образом:

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

Ответ 7

Смотрите этот код:

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

    }
}

Ответ 8

Я перепробовал все вышеперечисленное, но у меня ничего не получалось, поэтому я публикую то, что на самом деле делал и работал, в надежде помочь другим с той же проблемой, что и я:

Добавьте обработчик событий в конструктор:


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.Key == Key.Delete)
            {
                //your logic
            }
        }
    }