Как сделать, чтобы при нажатии клавиши Enter фокус переместился в ячейку ниже, как в Excel по умолчанию?

Я использую Infragistics UltraWinGrid v9.1. Я хочу, чтобы пользователь мог вводить числовые данные в ячейку, нажмите Enter, а затем сфокусируйтесь на ячейке ниже, как вы видите в Excel. Похоже, что событие KeyUp может быть лучше, чем событие KeyPressed для этого, но я продолжаю выдавать исключение, что я вышел за пределы UltraWinGrid, даже если я начинаю с верхней части полной сетки. Вот код, который я пробовал:

    private void ugrid_KeyUp(object sender, KeyEventArgs e)
    {
        UltraGrid grid = (UltraGrid)sender;

        if (e.KeyCode == Keys.Enter)
        {
            // Go down one row
            UltraGridCell cell = grid.ActiveCell;
            int currentRow = grid.ActiveRow.Index;
            int col = cell.Column.Index;
            grid.Rows[currentRow + 1].Cells[grid.ActiveCell].Activate();
        }
    }

Я ожидал, что эта ячейка в том же столбце, но на одну строку ниже, станет активной ячейкой с вызовом grid.Rows[currentRow + 1].Cells[grid.ActiveCell].Activate();

Вместо этого выдается исключение:

Исключение типа "System.IndexOutOfRangeException" возникло в Infragistics2.Shared.v9.1.dll, но не было обработано в коде пользователя. Дополнительная информация: Индекс находился за пределами массива.

Так как я нахожусь в ряду 0, и существует ряд 1, это меня удивляет. Значения для currentRow и col равны 0 и 28 соответственно. Какой будет лучший подход? Кстати, я могу сделать это снова в ячейке ниже, где значения currentRow = 1 и col = 28. Выдается то же исключение.

4 ответа

Решение

Кто-то ответил на мой вопрос на форуме по инфраструктуре...

    private void ugrid_KeyUp(object sender, KeyEventArgs e)
    {
        var grid = (UltraGrid)sender;

        if (e.KeyCode == Keys.Enter)
        {
            // Go down one row
            grid.PerformAction(UltraGridAction.BelowCell);
        }
    }

Я не знаю, действительно ли то, что я говорю, действительно для v9.1, но вы также можете сделать что-то вроде этого:

yourGrid.KeyActionMappings.Add(new GridKeyActionMapping(Keys.Enter, UltraGridAction.BelowCell, 0, UltraGridState.Row, SpecialKeys.All, 0));
 private void ulGrvProducts_KeyUp(object sender, KeyEventArgs e)
        {

            UltraGrid grid =  (UltraGrid)sender;

            if (e.KeyCode == Keys.Enter)
            {
                 //Go down one row
                grid.PerformAction(UltraGridAction.BelowCell);
            }
        }

После использования grid.PerformAction(UltraGridAction.BelowCell), активная строка изменится, но следующая ячейка не будет в режиме редактирования.

Другие вопросы по тегам