.net 如何在DataGridView中显示日期时间选择器?
有没有办法在DataGridView中放置DateTimePicker控件.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
我检查了所有可能的属性,但它提供了复选框、组合框等选项,但没有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的文章更详细地解释了这个过程,甚至包括一些示例代码:您还可以在代码项目中找到完整的示例:一种策略是:
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中,您如何将选择器与基础单元格对齐呢?