如何防止XtraGrid TextEdit在将光标移动到内容之外时失去焦点

时间:2011-10-27 21:30:55

标签: c# .net devexpress xtragrid textedit

我使用来自XtraGrid的{​​{1}},其中一列包含字符串,通过TextEdit控件进行编辑。

当用户进入编辑模式(显示编辑器)时,文本会自动选择,就像在Windows资源管理器中点击 F2 选择了某些内容一样。

现在,如果用户按左/右,则焦点从当前单元格立即向左/右移动(也可以是上/下的单元格,具体取决于列布局)。

同样的事情发生在用户取消选择编辑器的内容,例如按home / end,然后将插入符号一直移动到单元格中的左/右(到第一个/最后一个字符),然后移动它是另一个步骤,“超越”内容。

在Windows资源管理器中,做同样的事情只是将插入符号保持在左/右位置,它永远不会离开编辑模式,除非通过例如点击 Escape 终止。 即使在Excel中,在编辑单元格内容时按下左/右单元格边界也不会终止编辑模式。

在编辑模式下,我想在我的XtraGrid中使用相同的行为,但我找不到任何设置或方法。

有没有人遇到这个问题并找到了克服它的方法? 我也许在这里思考? 我真的希望让我的应用程序尽可能以一致的“标准Windows”方式运行,我觉得情况并非如此。

2 个答案:

答案 0 :(得分:2)

我认为这就是你想要的......

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

答案 1 :(得分: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;
}