c# - 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?
编辑:代码片段已更新
解决方案
一个简单的解决方案是为此使用string
网格中的列。
我确信问题出在List<DateTime>
......当您使用 aList<T>
作为DataSource
网格(顶部网格)时,网格将使用每个(非集合)“属性”T
作为网格中的列。这可以在顶部网格中看到。使用DateTime
as 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";
}