C #, winform — выбор списка с помощью клавиш со стрелками вверх и вниз?

#c# #winforms #listbox

#c# #winforms #список

Вопрос:

У меня есть список, я могу выбирать записи (режим одиночного выбора — по одному за раз) с помощью клавиатуры и мыши, но когда я использую клавиши со стрелками вверх и вниз, он не выбирает список. Но возможность прокручивать список с подчеркиванием под каждым объектом, с которым связана клавиша со стрелкой. Спасибо

Комментарии:

1. Итак, в основном, когда вы нажимаете вверх / вниз, вы хотите прокручивать список вместо выбора следующего / предыдущего элемента?

Ответ №1:

Добавьте обработчик в событие Form1.KeyDown:

 private Form1_KeyDown(object sender, KeyEventArgs e)
{
  this.listBox1.Focus();
  this.listBox1.Select();

  if (e.Key == Keys.Up)
  {
    this.listBox1.SelectedIndex--;  
  }
  else if (e.Key == Keys.Down)
  {
    this.listBox1.SelectedIndex  ;
  }
}
  

Ответ №2:

Я думаю, вы можете сделать это с помощью API SendMessage. Что-то вроде этого:

 private const int WM_VSCROLL = 0x115;

[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, UIntPtr wParam, IntPtr lParam);

private void listBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Down)
    {
        SendMessage(this.listBox.Handle, (uint)WM_VSCROLL, (System.UIntPtr)ScrollEventType.SmallIncrement, (System.IntPtr)0);
        e.Handled = true;
    }

    if (e.KeyCode == Keys.Up)
    {
        SendMessage(this.listBox.Handle, (uint)WM_VSCROLL, (System.UIntPtr)ScrollEventType.SmallDecrement, (System.IntPtr)0);
        e.Handled = true;
    }
}
  

Ответ №3:

Я написал этот код

      private void listBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Up)
        {
            int indicee = listBox1.SelectedIndex;
            label2.Text = indicee.ToString();
        }
        if (e.KeyCode == Keys.Down)
        {
            int indicee = listBox1.SelectedIndex;
            label2.Text = indicee.ToString();
        }
  

но при нажатии вниз индекс не меняется, я думаю, что код должен быть в другом событии.

Ответ №4:

Это лучший способ, для меня он работает нормально

          private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {   
        int indicee = listBox1.SelectedIndex  1;
        label6.Text = indicee.ToString();
        ni = indicee-1;
        if (ni >= 0)
        { loadender(ni); }
  

Когда вы перемещаетесь с помощью клавиш со стрелками, индекс списка тоже меняется, тогда вы пишете свой код в этом событии.