One such requirement with the Arrow Keys is such that :
- When the cursor reaches the Left most Edge of a Cell then the focus shifts to the next cell on the left hand side.
- When the cursor reaches the Right most Edge of a Cell then the focus shifts to the next cell on the right hand side.
- When the cursor is not in any of the above described states and is positioned inside a cell, currently in Edit Mode, then it should navigate within the cell text with the help of Arrow Keys.
Implementation Technique
Following is a summary of the implementation steps followed: 1. Handle the KeyDownEdit event of the C1FlexGrid. 2. Assign TextBox as an Editor to the currently selected cell in the grid. 3. Check if the right most edge or the left most edge of the cell is reached (that is, if the cursor is placed at the end of the textbox's text or at the start). 4. Accordingly, shift the focus of the cursor or navigate inside the cell. The implementation is rather plain and simple as compared to the requirement though ;) Here you go:
private void c1FlexGrid1_KeyDownEdit(object sender, C1.Win.C1FlexGrid.KeyEditEventArgs e)
{
//Get the current cell's Editor As a TextBox
TextBox tb = (TextBox)this.C1FlexGrid1.Editor;
if (tb.SelectionLength == 0)
{
//If the Caret is at the end of the Text (right edge) in TextBox
if (tb.SelectionStart == tb.Text.Length)
{
//then on the press of Right arrow key
//the cursor should move to the next column in same row
if (e.KeyData == Keys.Right)
{
if (e.Col < C1FlexGrid1.Cols.Count-1)
{
C1FlexGrid1.Select(e.Row, e.Col + 1);
}
else
{
//if it is the last column in the grid then end editing
C1FlexGrid1.Select(e.Row, e.Col);
C1FlexGrid1.FinishEditing();
}
}
//If the Caret is at the start of the Text (left edge) in TextBox
}
else if (tb.SelectionStart == 0)
{
//then on the press of Left arrow key
//the cursor should move to the previous column in the same row
if (e.KeyData == Keys.Left)
{
if (e.Col > 1)
{
C1FlexGrid1.Select(e.Row, e.Col - 1);
}
else
{
//if it is the first column in the grid then end editing
C1FlexGrid1.Select(e.Row, e.Col);
C1FlexGrid1.FinishEditing();
}
}
}
}
}