Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net DateTimePicker控件在焦点时添加功能_Vb.net_Winforms_Datetimepicker - Fatal编程技术网

Vb.net DateTimePicker控件在焦点时添加功能

Vb.net DateTimePicker控件在焦点时添加功能,vb.net,winforms,datetimepicker,Vb.net,Winforms,Datetimepicker,我只是想看看我想添加到DateTimePicker控件的功能是否切实可行 我想做的是,当用户切换到DateTimePicker时,显示日期选择器下拉列表,这样他们就可以开始输入日期,而不必单击箭头来显示日期选择器 我没有从MSDN上看到这方面的任何内容,但我可能错过了,这可能吗?从,您可以尝试以下内容: Private Sub DateTimePicker1_Enter(ByVal sender As Object, ByVal e As EventArgs) _

我只是想看看我想添加到
DateTimePicker
控件的功能是否切实可行

我想做的是,当用户切换到
DateTimePicker
时,显示日期选择器下拉列表,这样他们就可以开始输入日期,而不必单击箭头来显示日期选择器

我没有从MSDN上看到这方面的任何内容,但我可能错过了,这可能吗?

从,您可以尝试以下内容:

Private Sub DateTimePicker1_Enter(ByVal sender As Object, ByVal e As EventArgs) _
                                  Handles DateTimePicker1.Enter
  SendKeys.Send("%{DOWN}")
End Sub
要在下拉列表中使用tab键,请尝试以下操作:

Private Sub DateTimePicker1_KeyDown(ByVal sender As Object, _
                                    ByVal e As KeyEventArgs) _
                                    Handles DateTimePicker1.KeyDown
  If e.KeyCode = Keys.Tab Then
    SendKeys.Send("%{F4}")
    Me.SelectNextControl(DateTimePicker1, True, True, True, True)        
  End If
End Sub
在C#中,您可以创建一个扩展来下拉DateTimePicker,很抱歉是谁创建了它,因为我完全忘记了:D

public static void OpenDateTime(this DateTimePicker obj)
        {
            const int WM_LBUTTONDOWN = 0x0201;
            int width = obj.Width - 10;
            int height = obj.Height / 2;
            int lParam = width + height * 0x00010000; // VooDoo to shift height
            PostMessage(obj.Handle, WM_LBUTTONDOWN, 1, lParam);
        }
用法:

private void dateTimePicker1_Enter(object sender, EventArgs e)
{
    dateTimePicker1.OpenDateTime();
}
下面是VB.NET,首先需要创建一个模块并粘贴此代码

Imports System.Runtime.CompilerServices
Imports System.Runtime.InteropServices

Module Module1
    <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
    Private Function PostMessage(hwnd As IntPtr, wMsg As Int32, wParam As Int32, lParam As Int32) As Integer
    End Function
    <Extension()>
    Public Sub OpenDateTime(obj As DateTimePicker)
        Const WM_LBUTTONDOWN As Integer = &H201
        Dim width As Integer = obj.Width - 10
        Dim height As Integer = obj.Height / 2
        Dim lParam As Integer = width + height * &H10000
        PostMessage(obj.Handle, WM_LBUTTONDOWN, 1, lParam)
    End Sub
End Module

就是这样:)

打开日期选择器效果很好,如果用户决定通过控件进行制表,是否有办法关闭它?目前,它可以正常打开,但除非选择了日期,否则不会让我通过标签查看它。我已经尝试通过代码发送Esc键来取消日期选择器和提前制表符,但似乎无法使其正常工作。是否还有另一个SendKey来关闭日期选择器?我在进行选项卡切换时遇到问题,日期选择器日历仍处于活动状态。也许,如果我能理解我发送的键在datepicker控件中的作用,我就能更好地理解发生了什么。(“%$DOWN}”)和(“%$F4}”)对控件到底做了什么?是否有我可以研究的链接?@Criel Down是向下箭头键,如果你在DateTimePicker控件上按下它,它将下拉日历。F4是F4,如果日历打开,它会关闭日历。这段代码对我很有用,因为我在表单上也有可选项卡控件。
Private Sub DateTimePicker1_Enter(sender As System.Object, e As System.EventArgs) Handles DateTimePicker1.Enter
    DateTimePicker1.OpenDateTime()
End Sub