我有一个带有 DataGridView 的表单。在 Datagridview 我有一些 DataGridViewComboBoxColumn 和一些 DataGridViewTextBoxColumn。问题是我想使用Enter而不是 Tab 从一个单元格切换到另一个单元格,即使我在单元格中处于编辑模式。
我成功地为文本框列实现了此答案 https://stackoverflow.com/a/9917202/249120中提供的解决方案,但我无法为组合框列实现它。怎么做?
重要提示:对于文本框列,defaultCellStyle 必须具有“换行”属性为 True。它起作用了(当你按下回车时,就像你在按下一个选项卡一样)所以我决定也用“CustomComboBoxColumn”来测试它,我尝试创建一个与 CustomTextBoxColumn 非常相似的代码,但它不起作用:
#region CustomComboBoxColumn
public class CustomComboBoxColumn : DataGridViewColumn
{
public CustomComboBoxColumn() : base(new CustomComboBoxCell()) { }
public override DataGridViewCell CellTemplate
{
get { return base.CellTemplate; }
set
{
if (value != null && !value.GetType().IsAssignableFrom(typeof(CustomComboBoxCell)))
{
throw new InvalidCastException("Must be a CustomComboBoxCell");
}
base.CellTemplate = value;
}
}
}
public class CustomComboBoxCell : DataGridViewComboBoxCell
{
public override Type EditType
{
get { return typeof(CustomComboBoxEditingControl); }
}
}
public class CustomComboBoxEditingControl : DataGridViewComboBoxEditingControl
{
protected override void WndProc(ref Message m)
{
//we need to handle the keydown event
if (m.Msg == Native.WM_KEYDOWN)
{
if ((ModifierKeys & Keys.Shift) == 0)//make sure that user isn't entering new line in case of warping is set to true
{
Keys key = (Keys)m.WParam;
if (key == Keys.Enter)
{
if (this.EditingControlDataGridView != null)
{
if (this.EditingControlDataGridView.IsHandleCreated)
{
//sent message to parent dvg
Native.PostMessage(this.EditingControlDataGridView.Handle, (uint)m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32());
m.Result = IntPtr.Zero;
}
return;
}
}
}
}
base.WndProc(ref m);
}
}
#endregion
这样做的最终结果是没有属性 DataSource、DisplayMember、Items、ValueMember 的 ComboBoxColumn,但是当按下 Enter 时会转到下一个单元格。还有什么可做的?