2

我正在使用带有包含字符串的列的XtraGridfrom DeveloperExpress,通过 TextEdit 控件进行编辑。

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

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

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

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

在编辑模式下,我希望我的 XtraGrid 有相同的行为,但我找不到任何设置或方法来做到这一点。

有没有人遇到过这个问题并找到了克服它的方法?我可能在这里倒退吗?我真的希望我的应用程序尽可能地以一致和“标准 Windows”的方式运行,但我不认为是这种情况。

4

2 回答 2

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);
        }
    }
于 2011-11-02T00:12:04.943 回答
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 回答