0

DataGridViewにDateTimePickerセルがあります。編集モードに入り、ボタンがクリックされたときにカレンダーをドロップできるようにしたいと思います。最初の部分は問題なく実行できますが、2番目の部分は機能しません。スタンドアロンの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に送信されていることだと思います。私が思う理由は、グリッドのKeyPressイベントとKeyDownイベントによって受信されたキーをログに記録するためのコードを配置したためです。それらは、グリッドの周りの矢印とSendKeysによって送信されたキーをログに記録しますが、セルを入力してセルを編集しているときの矢印はログに記録しません。

4

2 に答える 2

1

C#Winforms DataGridViewTimeColumnに関する私の回答を参照してください。私はそれがあなたのニーズに完全に合うと信じています。ComboBoxがある列にも使用できます。

于 2010-09-02T23:51:51.217 に答える
0

0A0Dによって提供される実装は、グリッドのキーボードナビゲーション(矢印/タブ)で常にうまく機能するとは限らなかったため、最近この問題を再検討しました。をバイパスしてDateTimePicker、にテキストを入力することが可能な場合がありましたDataGridViewTextBoxCell。これにより、検証ロジックがおかしくなりました。スリップアラウンドが発生しないようにする方法を見つけられなかった後、カスタム列を再度機能させることにしました。

修正は非常に簡単であることが判明しました。DateTimePickerカレンダーの表示に必要なキーストロークを送信するメソッドを使用して拡張機能を作成しました。

/// <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列の例を変更して、CalendarEditingControlから継承しDateTimePickerExます。

次に、ホスティングのフォームでDataGridView、プロパティを使用しEditingControlてメソッドを呼び出しましたShowCalendar()

DateTimePickerEx dtp = myDataGridView.EditingControl as DateTimePickerEx;
if (dtp != null)
    dtp.ShowCalendar();
于 2012-11-02T19:48:05.157 に答える