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
.net 如何在DataGridView中显示日期时间选择器?_.net_Vb.net_Winforms_Datagridview_Datetimepicker - Fatal编程技术网

.net 如何在DataGridView中显示日期时间选择器?

.net 如何在DataGridView中显示日期时间选择器?,.net,vb.net,winforms,datagridview,datetimepicker,.net,Vb.net,Winforms,Datagridview,Datetimepicker,有没有办法在DataGridView中放置DateTimePicker控件 我检查了所有可能的属性,但它提供了复选框、组合框等选项,但没有DateTimePicker。您没有遗漏任何内置选项,但可以将DataGridViewColumn和DataGridViewCell类都划分为子类,以承载您选择的任何控件 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { switch

有没有办法在DataGridView中放置DateTimePicker控件


我检查了所有可能的属性,但它提供了复选框、组合框等选项,但没有DateTimePicker。

您没有遗漏任何内置选项,但可以将
DataGridViewColumn
DataGridViewCell
类都划分为子类,以承载您选择的任何控件

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {

        switch (keyData & Keys.KeyCode)
        {
            case Keys.Enter:
            case Keys.Tab:
                this.dataGridView.Focus();
                break; 
        }

        return base.ProcessCmdKey(ref msg, keyData);

    }
这篇关于MSDN的文章更详细地解释了这个过程,甚至包括一些示例代码:

您还可以在代码项目中找到完整的示例:

一种策略是:

  • 在所选单元格接收焦点时,在其顶部绘制日期时间选择器
  • 将dtp与单元格的值混合
  • 当dtp的值更改时,将其镜像回单元格的值
  • 并在单元格失去焦点时隐藏dtp
  • 以下是一种使用部署策略处理网格事件的方法:

    private void dataGridView1\u CellClick(对象发送者,DataGridViewCellEventArgs e)
    {
    //确定是否单击了我们的日期列
    if(dataGridView1.Columns[e.ColumnIndex].DataPropertyName==nameof(User.BirthDate))
    {
    //初始化日期时间选择器
    dtp=新的日期时间选择器();
    dtp.Format=DateTimePickerFormat.Short;
    dtp.Visible=true;
    dtp.Value=DateTime.Parse(dataGridView1.CurrentCell.Value.ToString());
    //设置大小和位置
    var rect=dataGridView1.GetCellDisplayRectangle(e.ColumnIndex,e.RowIndex,true);
    dtp.Size=新尺寸(矩形宽度、矩形高度);
    dtp.位置=新点(矩形X,矩形Y);
    //附加事件
    dtp.CloseUp+=新事件处理程序(dtp_CloseUp);
    dtp.TextChanged+=新事件处理程序(dtp_OnTextChange);
    dataGridView1.Controls.Add(dtp);
    }
    }
    //更改dtp的文本时,将其分配回单元格
    私有void dtp_OnTextChange(对象发送方,事件参数e)
    {
    dataGridView1.CurrentCell.Value=dtp.Text.ToString();
    }
    //关闭单元格时,隐藏dtp
    无效dtp_特写(对象发送方,事件参数e)
    {
    dtp.Visible=false;
    }
    

    下面是添加了DataGridView的表单的基本设置

    private void Form1\u加载(对象发送方,事件参数e)
    {
    //添加列
    var nameCol=new DataGridViewTextBoxColumn(){DataPropertyName=nameof(User.Name),HeaderText=“Name”};
    var dateCol=new DataGridViewTextBoxColumn(){DataPropertyName=nameof(User.BirthDate),HeaderText=“Birthday”};
    dataGridView1.Columns.AddRange(nameCol,dateCol);
    //添加数据源
    var users=新列表()
    {
    新用户(){Name=“Briana”,生日=新日期时间(2019,10,10)},
    新用户(){Name=“Grace”,生日=新日期时间(2018,1,18)}
    };
    dataGridView1.DataSource=用户;
    }
    专用日期时间选择器dtp{get;set;}
    私有类用户
    {
    公共字符串名称{get;set;}
    公共日期时间出生日期{get;set;}
    }
    
    注意:当dtp具有焦点时,此方法当前不处理键盘事件,并且在窗体移动时也不处理大小调整或重新绘制


    要解决在DataGridView中使用DateTimePicker时的一些输入问题,您需要将以下内容添加到上面引用的Microsoft示例中。花了相当长的时间才找出valuechanged事件未按预期触发的问题。修正来自这里()并在下面转换为C。在DataGridView和DateTimePicker上搜索时,我一直在寻找这篇论坛帖子,因此在这里添加这些信息似乎是合适的

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
    
            switch (keyData & Keys.KeyCode)
            {
                case Keys.Enter:
                case Keys.Tab:
                    this.dataGridView.Focus();
                    break; 
            }
    
            return base.ProcessCmdKey(ref msg, keyData);
    
        }
    

    也许这是不恰当的,但简单的技巧和相同的结果。。。。。。。。代码少了很多……我只是在玩游戏,虽然在盒子外面,但还是设定好了

    我隐藏我的,直到他们点击单元格,或者你可以显示 首先,我宣布:

    DateTimePicker1.Visible = False
    
    当您在单元格中单击时,运行此代码

        DateTimePicker1.Visible = True
        ActiveControl = DateTimePicker1
    
    然后下面

     Public Sub DateTimePicker1_ValueChanged(sender As System.Object, e As System.EventArgs) Handles DateTimePicker1.ValueChanged
    
    
    
        requestDGV.Rows(0).Cells("requestTimeOff").Value = (DateTimePicker1.Value)
        DateTimePicker1.Visible = False
        DateTimePicker1.Enabled = False
    
    End Sub
    
    超级基本,我把它直接放在盒子里,看起来不太合适

    或者超简单模式……我只是想隐藏我的,直到点击专栏

    Public Sub DateTimePicker1_ValueChanged(sender As System.Object, e As System.EventArgs) Handles DateTimePicker1.ValueChanged
    
    
        requestDGV.Rows(0).Cells("requestTimeOff").Value = (DateTimePicker1.Value)
    
    End Sub
    

    你真的只需要一行…数据将在网格中,只是代码少了很多…

    我认为DateTimePicker上的特写事件更合适,因为更改的值将在任何更改时触发,而特写仅在选择整个日期时触发。

    确定。。。使用@rajat和@Aaron的一些例子,我在DateTimePicker单元格中弹出了一个。谢谢大家

    Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    
        If e.ColumnIndex = 8 Then 'CHECK IF IT IS THE RIGHT COLUMN
    
            'SET SIZE AND LOCATION
            Dim rect = DataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True)
            DateTimePicker1.Size = New Size(rect.Width, rect.Height)
            DateTimePicker1.Location = New Point(rect.X + 10, rect.Y + 76) 'USE YOU OFFSET HERE
    
            DateTimePicker1.Visible = True
            ActiveControl = DateTimePicker1
    
        End If
    
    End Sub
    
    
    Private Sub DateTimePicker1_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker1.ValueChanged
    
        If DataGridView1.RowCount > 0 Then 'JUST TO AVOID FORM LOAD CRASH
    
            DataGridView1.CurrentCell.Value = DateTimePicker1.Value.ToShortDateString
            DateTimePicker1.Visible = False
    
        End If
    

    这是一个相当大的代码块——您能对其进行编辑,以包含一些关于它如何解决问题的解释吗?这非常有效,但如果单元格位于datagridview中,您如何将选择器与基础单元格对齐呢?