Capture Keys.Down и Keys.Up для dataGridview_KeyDown - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть DataGridView, где каждый из индексов его строк соответствует индексу в List<SomeClass>, например, вторая строка DataGridView соответствует List[1] (считая от нуля) и т. д. Когда пользователь нажимает на столбец 0 dataGridView1, я отображаю List[e.RowIndex] на другом DataGridView, например:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 0)
    {
        dataGridView2.Rows.Clear();
        if (e.RowIndex >= 0 && !dataGridView1.Rows[e.RowIndex].IsNewRow)
        {
            for (int j = 0; j < Data[e.RowIndex].Values.Count; j++)
            {
                //add Data[e.RowIndex].Values to dataGridView2
            }
        }
    }
}

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

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Down && dataGridView1.CurrentCell.ColumnIndex == 0)            
    {
        if (dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex - 1].IsNewRow)
        {
            dataGridView2.Rows.Clear();
            e.Handled = true;
        }                
        if (!dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex + 1].IsNewRow) 
        {
            dataGridView2.Rows.Clear();
            for (int j = 0; j < Data[dataGridView1.CurrentCell.RowIndex + 1].Values.Count; j++)
            {
                //add Data[dataGridView1.CurrentCell.RowIndex + 1].Values to dataGridView2
            }
        }
    }
    else if (e.KeyCode == Keys.Up && dataGridView1.CurrentCell.ColumnIndex == 0)
    {
        if (dataGridView1.CurrentCell.RowIndex > 0)
        {
            dataGridView2.Rows.Clear();
            for (int j = 0; j < Data[dataGridView1.CurrentCell.RowIndex - 1].Values.Count; j++)
            {
                //add Data[dataGridView1.CurrentCell.RowIndex - 1].Values to dataGridView2
            }
        }
    }
}

Это работает, но выдает

Индекс был вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции. Имя параметра: индекс

ошибка, во 2-м if, в следующих двух случаях:

  • При использовании стрелки вверх до строки 0 и один раз там стрелка вниз
  • При прокрутке до строки * (новая строка всегда находится внизу dataGridView).

Кажется, я что-то упускаю здесь, кто-нибудь может мне помочь или указать мне правильное направление?

1 Ответ

1 голос
/ 24 июля 2013

У меня тоже была эта проблема, и в случае, если есть кто-то вроде меня, который обычно игнорирует комментарии и ищет только ответы, комментарий Ханса Пассанта

"Переопределение обработки клавиатуры в DGV очень проблематично. Вместо этого используйте событие RowEnter. - Ганс Пассант 15 февраля '12 в 2:47"

является одним правильным решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...