-1

我有一个带有 DataGridView 的表单。在 Datagridview 我有一些 DataGridViewComboBoxColumn 和一些 DataGridViewTextBoxColumn。问题是我想使用Enter而不是 Tab 从一个单元格切换到另一个单元格,即使我在单元格中处于编辑模式。

要自定义的 datagridview 的屏幕截图

要自定义的组合框的屏幕截图

我成功地为文本框列实现了此答案 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 时会转到下一个单元格。还有什么可做的?

4

2 回答 2

1

对 Bruno Pacifici 的回答和评论:

或者您只能覆盖 1 个方法“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);
    }

PS如果答案不是太大,为什么只发布链接作为答案?当这样的“有用”链接不再起作用时,我经历了很多案例。因此,复制一些带有原始源链接的代码将是更“404”安全的答案。

于 2015-11-12T21:05:07.907 回答
0

我的问题的解决方案非常简单。您必须创建一个自定义的 dataGridView,只覆盖 2 个方法。请参阅此处:http ://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/a44622c0-74e1-463b-97b9-27b87513747e#faq9 。

于 2012-12-30T10:49:08.773 回答