首页 > 解决方案 > DataGridView 从 DateTimePicker 显示错误的时间

问题描述

我正在尝试从 DateTimePicker 获取日期,从另一个 DateTimePicker 获取时间,并在绑定到 List 的 DataGridView 上显示它们。我得到了很好的日期,并且两个数据都输入得很好(我显示了一个消息框,它似乎很好地得到了日期和时间)。但是,由于某种原因,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?

编辑:代码片段已更新

标签: c#winformsdatagridviewdatetimepickerdatetime-format

解决方案


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

我确信问题出在List<DateTime>......当您使用 aList<T>作为DataSource网格(顶部网格)时,网格将使用每个(非集合)“属性”T作为网格中的列。这可以在顶部网格中看到。使用DateTimeas T,会将“日期”作为第 0 列,将“日”作为第 1 列,将“DayOfWeek”作为第 2 列……等等。会有“小时”、“分钟”和秒的列。(见图)。

在此处输入图像描述

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

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

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

private DataTable dataTable = new DataTable();

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  dates = new List<DateTime>();
  dtpDate.Format = DateTimePickerFormat.Custom;
  dtpDate.CustomFormat = "dd/MM/yyyy";
  dtpTime.Format = DateTimePickerFormat.Custom;
  dtpTime.CustomFormat = "hh:mm";
  dtpTime.ShowUpDown = true;

  dataTable.Columns.Add("Date", typeof(DateTime));
}

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";

  // using datatable on second grid
  dataTable.Rows.Add(input);
  grid2.DataSource = dataTable;
  grid2.Columns[0].DefaultCellStyle.Format = "dd/MM/yyyy hh:mm:ss tt";
}

推荐阅读