Como faço para fazer pressionar a tecla Enter, porque o foco se move para a célula abaixo, como o comportamento padrão do Excel?
-
20-09-2019 - |
Pergunta
Estou usando uma infragística Ultrawingrid v9.1. Quero permitir que o usuário insira dados numéricos em uma célula, pressione Digitar E então tenha o foco na célula abaixo, como você vê no Excel. Parece que o evento KeyUp pode ser melhor do que o evento teclado para isso, mas continuo lançando uma exceção de que fui além dos limites do Ultrawingrid, mesmo que eu comece no topo de uma grade completa. Aqui está o código que eu tentei:
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();
}
}
Eu esperava que isso fizesse a célula na mesma coluna, mas uma linha abaixo para se tornar a célula ativa com a chamada, grid.rows [currentrow + 1] .Cells [grid.activeCell] .Activate ();
Em vez disso, uma exceção é lançada:
Uma exceção do tipo 'System.IndexoutOfRangeException' ocorreu em infragística2.shared.v9.1.dll, mas não foi tratado no código do usuário informações adicionais: o índice estava fora dos limites da matriz.
Como estou na linha 0 e existe uma linha 1, isso é uma surpresa para mim. Os valores para CurrentRow e Col são 0 e 28, respectivamente. Qual seria uma abordagem melhor? BTW, posso fazer isso novamente a célula abaixo, onde os valores são CurrentRow = 1 e Col = 28. A mesma exceção é lançada.
Solução
Alguém respondeu minha pergunta nos fóruns infragísticos ...
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);
}
}
Outras dicas
Não sei se o que estou dizendo é válido também para a v9.1, mas você também pode fazer algo assim:
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);
}
}
Depois de usar grid.PerformAction(UltraGridAction.BelowCell)
, a linha ativa mudará, mas a próxima célula não está no modo de edição.