DataGridView показывает неправильное время из DateTimePicker - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь получить дату из 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";
    }

}

Тип DateTime в DataGridView показывает еще 12 столбцов, которые я решил скрыть;некоторые могли бы быть полезными, потому что один был в течение нескольких минут, а другой - в течение нескольких часов, но я предпочел просто сделать один и показать его. Как я могу правильно показывать время и не всегда 00:00?

РЕДАКТИРОВАТЬ: обновлен фрагмент кода

1 Ответ

0 голосов
/ 11 декабря 2018

Простым решением было бы использовать для этого столбец string в сетке.

Я уверен, что проблема исходит от List<DateTime> ... Когда вы используете List<T> в качестве DataSource к сетке (верхняя сетка), сетка будет использовать каждое (не относящееся к коллекции) «свойство» в T в качестве столбца в сетке.Это можно увидеть в верхней сетке.При использовании DateTime в качестве T будет отображаться «Дата» в качестве столбца 0, «День» в качестве столбца 1, «DayOfWeek» в качестве столбца 2… и т. Д. Будет столбец для «часов», «минут» и секунд.(См. Рисунок).

enter image description here

Я предполагаю, что проблема может быть связана с тем, что первое «свойство» в объекте DateTimeобъект DateTime с именем «Дата», однако для этого объекта «Дата» DateTime его «Время» установлено на 12:00. Следовательно, строка кода grid.Columns[0].DefaultCellStyle.Format = "dd/MM/yyyy HH:mm";… всегда будет отображать это значение времени 00:00.представляющие 12:00. Значения «времени», которые мы ищем, взяты из объекта «this» DateTime, которые хранятся в его свойствах Hours, Minutes и Seconds.Эти значения свойств находятся в других столбцах.

С учетом сказанного я предлагаю вам попробовать DataTable со столбцом DateTime вместо List<DateTime>.(нижняя сетка) Это должно не только решить текущую проблему, но и немного упростить ситуацию.Сначала в код добавляется глобальная DataTable переменная dataTable, а вторая форма добавляется в форму для использования новой таблицы данных.Столбец DateTime для этой таблицы добавляется в событие Form1_Load.В событии нажатия кнопки та же самая переменная «input», используемая для List, добавляется к строкам dataTable.Второй источник данных сеток установлен на dataTable, затем, наконец, устанавливается формат первого столбца сеток.Я надеюсь, что это имеет смысл.

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