我使用来自XtraGrid
的{{1}},其中一列包含字符串,通过TextEdit控件进行编辑。
当用户进入编辑模式(显示编辑器)时,文本会自动选择,就像在Windows资源管理器中点击 F2 选择了某些内容一样。
现在,如果用户按左/右,则焦点从当前单元格立即向左/右移动(也可以是上/下的单元格,具体取决于列布局)。
同样的事情发生在用户取消选择编辑器的内容,例如按home / end,然后将插入符号一直移动到单元格中的左/右(到第一个/最后一个字符),然后移动它是另一个步骤,“超越”内容。
在Windows资源管理器中,做同样的事情只是将插入符号保持在左/右位置,它永远不会离开编辑模式,除非通过例如点击 Escape 终止。 即使在Excel中,在编辑单元格内容时按下左/右单元格边界也不会终止编辑模式。
在编辑模式下,我想在我的XtraGrid中使用相同的行为,但我找不到任何设置或方法。
有没有人遇到这个问题并找到了克服它的方法? 我也许在这里思考? 我真的希望让我的应用程序尽可能以一致的“标准Windows”方式运行,我觉得情况并非如此。
答案 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;
}