2 votes

Comment empêcher XtraGrid TextEdit de perdre le focus lorsqu'on déplace le curseur au-delà du contenu ?

J'utilise un XtraGrid de DeveloperExpress avec une colonne contenant des chaînes de caractères, éditées via un contrôle TextEdit.

Lorsqu'un utilisateur entre en mode édition (l'éditeur est affiché), le texte est automatiquement sélectionné, comme c'est le cas, par exemple, dans l'Explorateur Windows lorsque vous cliquez sur F2 avoir quelque chose de sélectionné.

Maintenant, si l'utilisateur appuie sur la touche gauche/droite, le focus se déplace de la cellule actuelle vers la cellule immédiatement à gauche/droite (qui peut aussi être la cellule au-dessus/en dessous en fonction de la disposition des colonnes).

La même chose se produit lorsque l'utilisateur désélectionne le contenu de l'éditeur, par exemple en appuyant sur home/end, puis en déplaçant le curseur vers la gauche/droite de la cellule (jusqu'au premier/dernier caractère) et en le déplaçant ensuite d'un cran, "au-delà" du contenu.

Dans l'explorateur Windows, la même chose permet de maintenir le curseur à la position la plus à gauche/la plus à droite, il ne quitte jamais le mode d'édition, sauf s'il est interrompu, par exemple, en frappant la touche S'évader . Même dans Excel, le mode d'édition n'est pas interrompu lorsque l'on touche la limite gauche/droite d'une cellule alors que l'on en modifie le contenu.

J'aimerais avoir le même comportement dans mon XtraGrid en mode édition, mais je ne trouve aucun réglage ou moyen de le faire.

Quelqu'un a-t-il rencontré ce problème et trouvé un moyen de le résoudre ? Ne suis-je pas en train de penser à l'envers ? Je souhaite vraiment que mon application se comporte le plus possible de manière cohérente et "standard Windows", ce qui ne me semble pas être le cas actuellement.

2voto

Scott Wylie Points 2393

Je pense que c'est ce que vous voulez...

    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);
        }
    }

2voto

Jakob Möllås Points 2229

Ma solution complète :

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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X