Как предотвратить потерю фокуса XtraGrid TextEdit при перемещении курсора за пределы содержимого - PullRequest
2 голосов
/ 28 октября 2011

Я использую XtraGrid из DeveloperExpress со столбцом, содержащим строки, отредактированные с помощью элемента управления TextEdit.

Когда пользователь входит в режим редактирования (отображается редактор), текст выбирается автоматически, как, например, в проводнике Windows, когда вы нажимаете F2 , когда что-то выбрано.

Теперь, если пользователь нажимает влево / вправо, фокус перемещается от текущей ячейки в ячейку сразу влево / вправо (также может быть ячейка выше / ниже в зависимости от расположения столбца).

То же самое происходит, когда пользователь отменяет выбор содержимого редактора, например, нажимая home / end, а затем перемещает каретку влево / вправо в ячейке (к первому / последнему символу), а затем перемещает это еще один шаг, «за пределы» содержания.

В Windows Explorer, делая то же самое, просто удерживая курсор в левом / крайнем правом положении, он никогда не покидает режим редактирования, если не завершен, например, нажатием Escape . Даже в Excel режим редактирования не прерывается при попадании на левую / правую границу ячейки при редактировании содержимого ячейки.

Мне бы хотелось, чтобы такое же поведение было в моей XtraGrid в режиме редактирования, но я не могу найти какой-либо параметр или способ сделать это.

Кто-нибудь сталкивался с этой проблемой и нашел способ ее преодолеть? Может быть, я думаю, что здесь назад? Я действительно хочу, чтобы мое приложение работало в максимально согласованной и «стандартной» среде Windows, насколько это возможно, что я не чувствую в этом случае.

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Мое полное решение:

private void UiGridControlEditorKeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData != Keys.Left && e.KeyData != Keys.Right)
        return;

    var gridControl = sender as GridControl;
    if (gridControl == null) return;

    var view = gridControl.FocusedView as GridView;
    if (view == null) return;

    var textEdit = view.ActiveEditor as TextEdit;
    if (textEdit == null) return;

    var left = e.KeyData == Keys.Left;
    var right = e.KeyData == Keys.Right;

    // Handle initial case - everything selected in control
    if ((left || right) && 
        textEdit.SelectionLength == textEdit.Text.Length && 
        textEdit.SelectionStart == 0)
    {
        var leftPosition = textEdit.Text.Length - 1 < 0 ? 
                           0 : textEdit.Text.Length - 1;
        var rightPosition = textEdit.Text.Length;

        textEdit.SelectionStart = left ? leftPosition : rightPosition;
        textEdit.SelectionLength = 0;
        e.Handled = true;

        return;
    }

    // Handle left & rightmost positions (prevent focus change)
    e.Handled = left && textEdit.SelectionStart == 0 ||
                right && textEdit.SelectionStart == textEdit.Text.Length;
}
2 голосов
/ 02 ноября 2011

Я думаю, это то, что вы хотите ...

    private void gridControl1_EditorKeyDown(object sender, KeyEventArgs e)
    {
        GridView view = (sender as GridControl).FocusedView as GridView;
        VisualStyleElement.TextBox.TextEdit edit = view.ActiveEditor as VisualStyleElement.TextBox.TextEdit;
        if (edit == null) return;
        if (view.FocusedColumn.FieldName == "FirstName" && view.FocusedRowHandle % 2 == 0)
        {
            e.Handled = (e.KeyData == Keys.Right && edit.SelectionStart == edit.Text.Length) ||
                (e.KeyData == Keys.Left && edit.SelectionStart == 0);
        }
    }
...