如何在DataGridView中显示DateTimePicker?

Fur*_*gal 21 .net vb.net datagridview datetimepicker winforms

有没有办法将DateTimePicker控件放在DataGridView中?

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

Cod*_*ray 28

您没有错过任何内置选项,但可以将类DataGridViewColumnDataGridViewCell类子类化为托管您选择的任何控件.

MSDN上的这篇文章更详细地解释了这个过程,甚至包括一些示例代码:
如何:Windows窗体DataGridView单元中的主机控件

您还可以在Code Project:Generic DataGridView V2.0上找到完整的示例


小智 6

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    // determine if click was on our date column
    if (dataGridView1.Columns[e.ColumnIndex].DataPropertyName == nameof(User.BirthDate))
    {
        // initialize DateTimePicker
        dtp = new DateTimePicker();
        dtp.Format = DateTimePickerFormat.Short;
        dtp.Visible = true;
        dtp.Value = DateTime.Parse(dataGridView1.CurrentCell.Value.ToString());

        // set size and location
        var rect = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
        dtp.Size = new Size(rect.Width, rect.Height);
        dtp.Location = new Point(rect.X, rect.Y);

        // attach events
        dtp.CloseUp += new EventHandler(dtp_CloseUp);
        dtp.TextChanged += new EventHandler(dtp_OnTextChange);

        dataGridView1.Controls.Add(dtp);
    }
}

// on text change of dtp, assign back to cell
private void dtp_OnTextChange(object sender, EventArgs e)
{
    dataGridView1.CurrentCell.Value = dtp.Text.ToString();
}

// on close of cell, hide dtp
void dtp_CloseUp(object sender, EventArgs e)
{
    dtp.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常大的代码块 - 您可以编辑它以包含一些解释它如何解决问题的解释吗? (3认同)

小智 6

也许这不合适,但简单的技巧和相同的结果......更少的代码......我只是在玩,虽然在盒子外面,只是设置

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

DateTimePicker1.Visible = False
Run Code Online (Sandbox Code Playgroud)

当您单击单元格时,运行此代码...

    DateTimePicker1.Visible = True
    ActiveControl = DateTimePicker1
Run Code Online (Sandbox Code Playgroud)

那么下面

 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
Run Code Online (Sandbox Code Playgroud)

Super Basic ,我把它直接放在盒子里,看起来并不格格不入

或者超级简单的模式.......我只是喜欢隐藏我的直到点击列

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
Run Code Online (Sandbox Code Playgroud)

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

  • 这非常有效,除了如果单元格位于 datagridview 中,如何将选择器与底层单元格对齐? (2认同)