我试图从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?
编辑:代码段已更新
答案 0 :(得分:0)
一个简单的解决方案是为此在网格中使用string
列。
我相信问题来自List<DateTime>
……当您将List<T>
用作DataSource
到网格(顶部网格)时,网格将使用每个(非- T
中的“属性”作为网格中的一列。这可以在顶部网格中看到。将DateTime
用作T
,将“日期”作为第0列,将“日”作为第1列,将“ DayOfWeek”作为第2列…等等。将有一个用于“小时”,“分钟”的列”和秒。 (参见图片)。
我想这个问题可能是由于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