Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGridView显示来自DateTimePicker的错误时间_C#_Winforms_Datagridview_Datetimepicker_Datetime Format - Fatal编程技术网

C# DataGridView显示来自DateTimePicker的错误时间

C# DataGridView显示来自DateTimePicker的错误时间,c#,winforms,datagridview,datetimepicker,datetime-format,C#,Winforms,Datagridview,Datetimepicker,Datetime Format,我试图从一个DateTimePicker获取一个日期,从另一个DateTimePicker获取一个时间,并在绑定到列表的DataGridView中显示它们。我很好地得到了日期,而且两个数据都输入得很好(我显示了一个消息框,它似乎很好地得到了日期和时间)。但是,由于某些原因,DataGridView中的时间始终显示为00:00(从拾取的日期算起的第一分钟)。这是我的密码: public partial class MainWindow : Form { private List<D

我试图从一个DateTimePicker获取一个日期,从另一个DateTimePicker获取一个时间,并在绑定到列表的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";
    }

}
公共部分类主窗口:表单
{
私人名单日期;
私有绑定列表bdate;
私有绑定源数据源;
公共主窗口()
{
初始化组件();
日期=新列表();
dtpDate.Format=DateTimePickerFormat.Custom;
dtpDate.CustomFormat=“dd/MM/yyyy”;
dtpTime.Format=DateTimePickerFormat.Custom;
dtpTime.CustomFormat=“hh:mm”;
dtpTime.ShowUpDown=true;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
DateTime输入=dtpDate.Value.Date+dtpTime.Value.TimeOfDay;
MessageBox.Show(input.toString());//这会正确显示日期
日期。添加(输入);
b日期=新绑定列表(日期);
dSource=newbindingsource(bDates,null);
grid.DataSource=dSource;
grid.Columns[0].DefaultCellStyle.Format=“dd/MM/yyyy HH:MM”;
}
}
DataGridView中的DateTime类型显示了另外12列,我选择隐藏它们;有些可能是有用的,因为有一个是几分钟的,另一个是几个小时的,但我更喜欢自己做一个并展示出来如何正确显示时间,而不是始终显示00:00?


编辑:代码片段已更新

一个简单的解决方案是在网格中为此使用字符串

我确信问题来自
列表
…当您将
列表
用作网格(顶部网格)的
数据源时,网格将使用
T
中的每个(非集合)“属性”作为网格中的一列。这可以在顶部网格中看到。使用
DateTime
作为
T
,将“Date”作为第0列,“Day”作为第1列,“DayOfWeek”作为第2列…等等。将有一列表示“小时”、“分钟”和秒。(见图)

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

话虽如此,我建议您尝试使用带有
DateTime
列的
DataTable
,而不是
列表(底部网格)这不仅可以解决当前的问题,还可以让事情变得简单一些。首先,在代码中添加一个全局
DataTable
变量
DataTable
,然后在表单中添加第二个网格以使用新的数据表。此表的
DateTime
列添加到
Form1\u Load
事件中按钮单击事件将用于
列表的相同“输入”变量添加到
数据表
行中。第二个网格数据源设置为
数据表
,最后设置网格第一列格式。我希望这有意义

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";
}
私人列表日期;
私有绑定列表bdate;
私有绑定源数据源;
私有数据表=新数据表();
公共表格1(){
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e){
日期=新列表();
dtpDate.Format=DateTimePickerFormat.Custom;
dtpDate.CustomFormat=“dd/MM/yyyy”;
dtpTime.Format=DateTimePickerFormat.Custom;
dtpTime.CustomFormat=“hh:mm”;
dtpTime.ShowUpDown=true;
dataTable.Columns.Add(“日期”,typeof(DateTime));
}
私有无效按钮1\u单击(对象发送者,事件参数e){
DateTime输入=dtpDate.Value.Date+dtpTime.Value.TimeOfDay;
MessageBox.Show(input.ToString());//这会正确显示日期
日期。添加(输入);
b日期=新绑定列表(日期);
dSource=newbindingsource(bDates,null);
grid.DataSource=dSource;
grid.Columns[0].DefaultCellStyle.Format=“dd/MM/yyyy HH:MM”;
//在第二个网格上使用datatable
dataTable.Rows.Add(输入);
grid2.DataSource=dataTable;
grid2.Columns[0].DefaultCellStyle.Format=“dd/MM/yyyy hh:MM:ss tt”;
}

这是不够的代码。如果这些是您在构造函数中的声明,那么这些变量将仅对该块是局部的,并且它们在单击事件中不可用。发布所有复制问题的代码。我得不到00:00。哦,好吧,那么,我尝试简化代码,因为它有很多验证,但我将现在更新它。00:00是指在DataGridView上显示的时间,比如它指的是所选日期的初始时间;或者你的意思是你运行它时没有得到“00:00”作为时间?我没有得到“00:00”“随着时间的推移。因为我刚刚运行了它,所以我得到了
11:23:36.8013427
。哦,我以为我们在看TimeOfDay列。不!我想得到一个列,显示我放在列表中的“输入”,这样我就可以查看我放在DataGridView中的所有日期和时间;每行应该是dd/MM/yyyy hh:MM,但是所有的“hh:MM”看起来像“00:00”