[英]DataGridView TextBox cell Editing, Change Enter Key to Act Like Tab
我正在重新提出这个问题,因为我现在有一些代码可以解决我的问题(我删除了旧问题)。
基本上,当在编辑文本框单元格时按下 Enter 键时,我希望它像按 Tab 键一样(当前行中的下一列而不是下一行同一列)。
我的问题是到目前为止我尝试过的大部分方法都不起作用,但是这是我目前尝试的解决方案。
此代码应该更改正在编辑/选择的单元格。
private void PreTranslateDGV_KeyPressEvent(object sender, KeyEventArgs e)
{
DataGridViewTextBoxEditingControl a = (DataGridViewTextBoxEditingControl) sender;
//a.PreviewKeyDown -= PreviewKeyDownEventHandler (dataGridView1_PreviewKeyDown)
MyDataGridView s = (MyDataGridView) a.EditingControlDataGridView;
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
int newRow;
int newColumn;
if (s.CurrentCell.ColumnIndex == s.ColumnCount - 1) // it's a last column, move to next row;
{
newRow = s.CurrentCell.RowIndex + 1;
newColumn = 0;
if (newRow == s.RowCount)
return; // ADD new row or RETURN (depends of your purposes..)
}
else // just change current column. row is same
{
newRow = s.CurrentCell.RowIndex;
newColumn = s.CurrentCell.ColumnIndex + 1;
}
s.CurrentCell = s.Rows[newRow].Cells[newColumn];
}
}
这是将上述事件添加到单元格文本框的代码
private void PreTranslateDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control;
tb.KeyDown += new KeyEventHandler (PreTranslateDGV_KeyPressEvent);
}
其中大部分是我从 StackOverflow 找到的代码,因为我一直试图让它工作一段时间。
如果有人知道如何从 datagridview 中正确获取“Enter”按键,请在编辑单元格时提供帮助。
PS:我在 MSDN 论坛上读到过(丢失的链接),在编辑文本框单元格时,按 Enter 键会停止编辑。 这将解释为什么我上面的代码不会在 Enter 时触发,但它会在其他所有内容上触发。
我现在试图通过覆盖 processcmdkey 来做到这一点
class MyDataGridView : KryptonDataGridView
{
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if ((keyData == Keys.Enter) && (this.EditingControl != null))
{
return false;
}
//for the rest of the keys, proceed as normal
return base.ProcessCmdKey(ref msg, keyData);
}
}
但是无论我似乎返回什么,Enter 键都不会传递给 KeyPressEvent。
经过一番,烦人的麻烦。 这是我目前使用的解决方案:
private void PreTranslateDGV_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
DataGridViewTextBoxEditingControl a = (DataGridViewTextBoxEditingControl) sender;
//a.PreviewKeyDown -= PreviewKeyDownEventHandler (dataGridView1_PreviewKeyDown)
MyDataGridView s = (MyDataGridView) a.EditingControlDataGridView;
if (e.KeyCode == Keys.Enter)
{
int newRow;
int newColumn;
if (s.CurrentCell.ColumnIndex == s.ColumnCount - 1) // it's a last column, move to next row;
{
newRow = s.CurrentCell.RowIndex + 1;
newColumn = 0;
if (newRow == s.RowCount)
s.Rows.Add(1); // ADD new row or RETURN (depends of your purposes..)
}
else // just change current column. row is same
{
newRow = s.CurrentCell.RowIndex;
newColumn = s.CurrentCell.ColumnIndex + 1;
}
s.CurrentCell = s.Rows[newRow].Cells[newColumn];
}
}
private void PreTranslateDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control;
tb.PreviewKeyDown -= PreTranslateDGV_PreviewKeyDown;
tb.PreviewKeyDown += PreTranslateDGV_PreviewKeyDown;
//e.Control.KeyDown += new KeyEventHandler(PreTranslateDGV_KeyPressEvent);
}
我将 KeyPressEvent 更改为 PreviewKeyDown 事件。 在 ProcessCmdKey 获取输入之前触发。 使用这个和我修改过的数据网格视图,我能够在单元格内获取 Enter 键来像 Tab 一样操作。
class MyDataGridView : KryptonDataGridView
{
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if ((keyData == Keys.Enter) && (this.EditingControl != null))
{
return true;
}
//for the rest of the keys, proceed as normal
return base.ProcessCmdKey(ref msg, keyData);
}
}
当 ProcessCmdKey 被赋予回车键时,它立即返回“true”以表明它已被处理。 它具有 PreviewkeyDown 事件
希望这可以帮助其他人。 我不确定还有多少其他方法可以做到这一点,但这种方法对我有用。
我重用了从DataGridView
继承的想法,但尝试直接解决ProcessCmdKey
覆盖中的任务。
class PerfectDataGridView : DataGridView {
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if ((keyData == Keys.Enter) &&
(EditingControl != null) &&
(CurrentCell.RowIndex == RowCount - 1)) {
SendKeys.Send("{TAB}");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.