代码之家  ›  专栏  ›  技术社区  ›  Dan Is Fiddling By Firelight Leniency

C将击键发送到DataGridViewCell

  •  0
  • Dan Is Fiddling By Firelight Leniency  · 技术社区  · 15 年前

    我有一个 DateTimePicker 数据报视图中的单元格。我希望能够进入编辑模式,并在单击按钮时放下日历。我可以毫不费力地完成第一部分,但第二部分不行。如果我有一个独立的DateTimePicker,sendKeys调用将按预期工作。

    //Select the cell and enter edit mode -  works
    myDGV.CurrentCell = myDGV[calColumn.Index, e.RowIndex];
    myDGV.BeginEdit(true);
    
    //Send an ALt-Down keystroke to drop the calendar  - doesn't work
    SendKeys.SendWait("%{DOWN}");
    

    通过调试,我相信问题在于击键被发送到了dgv,而不是我要编辑的特定单元格。我认为原因是我已经把代码放到了记录网格按键和按键事件接收到的按键上。它们记录了我在网格上的箭头和sendkeys发送的键,但不是我通过键入来编辑单元格时的那些键。

    2 回复  |  直到 12 年前
        1
  •  1
  •   Community CDub    8 年前

    请看我的回答 C# Winforms DataGridView Time Column . 我相信它完全符合你的需要。也可以将其用于具有组合框的列。

        2
  •  0
  •   Dan Is Fiddling By Firelight Leniency    12 年前

    我最近重新讨论了这个问题,因为0A0D提供的实现并不总是能够很好地使用网格的键盘导航(箭头/选项卡)。有时可以绕过 DateTimePicker 并将文本输入 DataGridViewTextBoxCell . 这导致了我的验证逻辑异常;在找不到一种方法来防止这种错误发生之后,我决定尝试让自定义列重新工作。

    结果发现修复非常简单。我创建了一个扩展 日期输入框 用一种方法发送显示日历所需的击键。

    /// <summary>
    /// Extended DateTimePicker with a method to programmatically display the calendar.
    /// </summary>
    class DateTimePickerEx : DateTimePicker
    {
        [DllImport("user32.dll")]
        private static extern bool PostMessage(
        IntPtr hWnd, // handle to destination window
        Int32 msg, // message
        Int32 wParam, // first message parameter
        Int32 lParam // second message parameter
        );
    
        const Int32 WM_LBUTTONDOWN = 0x0201;
    
        /// <summary>
        /// Displays the calendar input control.
        /// </summary>
        public void ShowCalendar()
        {
            Int32 x = Width - 10;
            Int32 y = Height / 2;
            Int32 lParam = x + y * 0x00010000;
    
            PostMessage(Handle, WM_LBUTTONDOWN, 1, lParam);
        }
    }
    

    然后我修改了 MSDN DateTime column example 拥有 CalendarEditingControl 继承自 DateTimePickerEx .

    然后以托管的形式 DataGridView 我用过 EditingControl 属性调用 ShowCalendar() 方法。

    DateTimePickerEx dtp = myDataGridView.EditingControl as DateTimePickerEx;
    if (dtp != null)
        dtp.ShowCalendar();
    
    推荐文章