如何防止在编辑DataGridViewComboBoxColumn并按下EnterKey后转到下一行
本文关键字:一行 EnterKey 何防止 编辑 DataGridViewComboBoxColumn | 更新日期: 2023-09-27 17:49:45
我有一个表单与DataGridView。在Datagridview我有一些DataGridViewComboBoxColumn和一些DataGridViewTextBoxColumn。问题是我想使用输入而不是Tab从一个单元格切换到另一个单元格,即使我在单元格中的编辑模式。
要自定义的datagridview的截图
自定义组合框的截图
我成功地为文本框列实现了这个答案https://stackoverflow.com/a/9917202/249120中提供的解决方案,但我不能为组合框列实现它。怎么做呢?
重要提示:对于文本框Columns, defaultCellStyle必须将属性"wrap"设置为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键进入下一个单元格时。还能做什么?
对Bruno Pacifici的回答和评论:
或你只能覆盖一个方法"ProcessCmdKey",它会做同样的事情:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
//Override behavior on Enter press
if (keyData == Keys.Enter)
{
if (CurrentCell != null)
{
if (CurrentCell.IsInEditMode)
{
//Do Stuff if cell is currently being edited
return ProcessTabKey(keyData);
}
else
{
//Do Stuff if cell is NOT yet currently edited
BeginEdit(true);
}
}
}
//Process all other keys as expected
return base.ProcessCmdKey(ref msg, keyData);
}
注:为什么只张贴链接作为一个答案,如果答案不是太大?我经历过很多这样的情况,当这种"有用的"链接不再起作用时。因此,复制一些带有原始源代码链接的代码将是更"404"安全的答案。
我的问题的解决方案非常简单。你必须创建一个自定义的dataGridView覆盖两个方法。请看这里:http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/a44622c0-74e1-463b-97b9-27b87513747e#faq9。