Как сделать, чтобы при нажатии клавиши 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)
, активная строка изменится, но следующая ячейка не будет в режиме редактирования.