DataGridView显示来自DateTimePicker

时间:2018-12-10 16:00:29

标签: c# winforms datagridview datetimepicker datetime-format

我试图从DateTimePicker获取日期,并从另一个DateTimePicker获取时间,并在绑定到List的DataGridView上显示它们。我得到的日期很好,而且两个数据的输入都很好(我显示了一个messageBox,看来日期和时间都很好)。但是,由于某种原因,事实是,DataGridView中的时间始终显示为00:00(从选择日期开始的第一分钟)。这是我的代码:

public partial class MainWindow : Form
{

    private List<DateTime> dates;
    private BindingList<DateTime> bDates;
    private BindingSource dSource;

    public MainWindow()
    {

        InitializeComponent();
        dates = new List<DateTime>();
        dtpDate.Format = DateTimePickerFormat.Custom;
        dtpDate.CustomFormat = "dd/MM/yyyy";
        dtpTime.Format = DateTimePickerFormat.Custom;
        dtpTime.CustomFormat = "hh:mm";
        dtpTime.ShowUpDown = true;

    }

    private void button1_Click(object sender, EventArgs e)
    {

        DateTime input = dtpDate.Value.Date + dtpTime.Value.TimeOfDay;
        MessageBox.Show(input.toString()); //This shows the date correctly
        dates.Add(input);
        bDates = new BindingList<DateTime>(dates);
        dSource = new BindingSource(bDates, null);
        grid.DataSource = dSource;
        grid.Columns[0].DefaultCellStyle.Format = "dd/MM/yyyy HH:mm";
    }

}

DataGridView的DateTime类型显示另外12列,我选择将其隐藏。有些可能有用,因为一分钟要花几小时,而另一小时要花几小时,但是我宁愿只自己做一个就展示出来。 如何正确显示时间,而不是始终显示00:00?

编辑:代码段已更新

1 个答案:

答案 0 :(得分:0)

一个简单的解决方案是为此在网格中使用string列。

我相信问题来自List<DateTime>……当您将List<T>用作DataSource到网格(顶部网格)时,网格将使用每个(非- T中的“属性”作为网格中的一列。这可以在顶部网格中看到。将DateTime用作T,将“日期”作为第0列,将“日”作为第1列,将“ DayOfWeek”作为第2列…等等。将有一个用于“小时”,“分钟”的列”和秒。 (参见图片)。

enter image description here

我想这个问题可能是由于DateTime对象中的第一个“属性”是一个称为“ Date”的DateTime对象,但是,这个“ Date” {{1 }}对象的“时间”设置为12:00 AM因此,代码行DateTime…将始终显示该时间值00:00,表示上午12:00。我们正在寻找的“时间”值来自“此” grid.Columns[0].DefaultCellStyle.Format = "dd/MM/yyyy HH:mm";对象,该对象保存在其“小时,分钟和秒”属性中。这些属性值在其他列中。

话虽如此,我建议您尝试使用带有DateTime列的DataTable而不是DateTime的列。 (底部网格)这不仅应该解决当前问题,而且应该使事情变得容易一些。首先,将全局List<DateTime>变量DataTable添加到代码中,然后将第二个网格添加到表单中以使用新数据表。该表的dataTable列已添加到DateTime事件中。在按钮单击事件中,用于Form1_Load的相同“输入”变量被添加到List行中。将第二个网格数据源设置为dataTable,然后最后设置网格的第一列格式。我希望这是有道理的。

dataTable