2

テキストエディットコントロールで編集された、文字列を保持する列を持つXtraGridfromを使用しています。DeveloperExpress

ユーザーが編集モードに入ると(エディターが表示されます)、テキストは自動的に選択されます。たとえば、WindowsエクスプローラーでF2キーを押して何かを選択した場合と同じです。

ここで、ユーザーが左/右を押すと、フォーカスが現在のセルからすぐに左/右のセルに移動します(列のレイアウトによっては上/下のセルの場合もあります)。

同じことが、ユーザーがエディタのコンテンツの選択を解除する場合にも発生します。たとえば、ホーム/終了を押してから、セル内の左/右(最初/最後の文字)までカレットを移動してから、別のステップに移動します。 、内容を「超えて」。

Windowsエクスプローラーでは、同じことを行うと、カレットが左/右端の位置に保持され、たとえばEscapeキーを押して終了しない限り、編集モードを終了することはありません。Excelでも、セルの内容を編集しているときに左右のセル境界にぶつかっても編集モードは終了しません。

編集モードのときにXtraGridで同じ動作をしたいのですが、設定や方法が見つかりません。

誰かがこの問題に遭遇し、それを克服する方法を見つけましたか?私はおそらくここで後ろ向きに考えていますか?私は、アプリケーションが可能な限り一貫性のある「標準のWindows」の方法で動作するようにしたいのですが、そうではないと思います。

4

2 に答える 2

2

私の完全な解決策:

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;
}
于 2011-11-03T13:23:19.813 に答える