我正在重新提出这个问题,因为我现在有一些代码可以解决我的问题(我删除了旧的问题)。
基本上在编辑文本框单元格时按下回车键时,我希望它像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];
}
}
这是将Above事件添加到Cell的文本框
的代码private void PreTranslateDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control;
tb.KeyDown += new KeyEventHandler (PreTranslateDGV_KeyPressEvent);
}
这大部分是我从StackOverflow中找到的代码,因为我一直试图让它工作一段时间。
如果有人知道如何从数据网格视图中正确获取“输入”键盘,请在编辑单元格时提供帮助。
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。
答案 0 :(得分:1)
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获取输入之前触发。使用这个和我修改过的datagridview,我可以在单元格内部获取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事件
所拥有的希望这有助于其他人。我不确定有多少其他方法可以做到这一点,但这种方法对我有用。
答案 1 :(得分:0)
我重用了DataGridView
中的idea of inheriting,但是尝试直接解决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);
}
}