DateTimePicker значение по умолчанию: как избежать этого?
факты:
- У меня есть TabControl с 2 вкладками, каждая вкладка имеет 2 DateTimePicker.
- в событии Load я устанавливаю значение всех DTPs.
- все DTPs имеют ShowCheckBoxes, установленные на true и проверенные на false.
- когда я выполняю программу, DTPs в первой вкладке в порядке, но когда я проверяю DTPs на второй вкладке, они показывают текущее время, а не время, которое я установил на событии загрузки.
Почему это произошло? Как я могу избежать это?
6 ответов
я узнал, в чем проблема.
на Value
свойство устанавливает только новое значение, если DateTimePicker
управление видно. В противном случае команда игнорируется.
тест:
не работает:
this.picker = new DateTimePicker
{
Checked = false,
Font = new System.Drawing.Font("Verdana", 9.75F),
Format = System.Windows.Forms.DateTimePickerFormat.Time,
Location = new System.Drawing.Point(5, 5),
Name = "picker",
ShowUpDown = true,
Size = new System.Drawing.Size(120, 23),
Visible = false
};
this.Controls.Add(this.picker);
this.picker.Value = this.picker.Value.Date.AddHours(1);
this.picker.Visible = true;
работает:
this.picker = new DateTimePicker
{
Checked = false,
Font = new System.Drawing.Font("Verdana", 9.75F),
Format = System.Windows.Forms.DateTimePickerFormat.Time,
Location = new System.Drawing.Point(5, 5),
Name = "picker",
ShowUpDown = true,
Size = new System.Drawing.Size(120, 23),
Visible = false
};
this.Controls.Add(this.picker);
this.picker.Visible = true;
this.picker.Value = this.picker.Value.Date.AddHours(1);
не похоже, что это имеет какое-либо отношение к программному добавлению выбора.
Это связано с проверенным свойством datetimepicker. Обычно устанавливается значение false. По крайней мере, это было проблемой для меня.
после установки datetimepicker.проверено на true, он получил значение из настроек.
мой уродливый обходной путь к этой проблеме состоит в том, чтобы установить активную вкладку, в которой находятся DTP перед изменением ее значений, что-то вроде этого:
DateTime dat1 = DateTime.Today;
DateTime dat2 = dat1.AddDays(1).AddSeconds(-1);
dtpCreatedStart.Value = dat1;
dtpCreatedEnd.Value = dat2;
tbc.SelectTab(1);
dtpModifiedStart.Value = dat1;
dtpModifiedEnd.Value = dat2;
tbc.SelectTab(0);
DateTimePicker имеет некоторые проблемы с хранением и извлечением его значения. У меня были проблемы при привязке значения к ненулеваемому DateTime - время от времени я получал NullReferenceExeptions. Не знаю почему и когда. Иногда это просто случалось и разбивало приложение.
Я просто столкнулся с той же проблемой, используя два DateTimePickers. Я смог заставить их обоих показать правильное значение, динамически генерируя их и добавляя их в форму.
Если вы не можете заставить его работать, вы всегда можете попробовать с помощью другого выбора. The Any + Time (TM) Datepicker/часы AJAX календарь виджет извлекает свое значение из связанного поля, поэтому, если вы инициализируете поле со значением или измените поле на значение (например, в onload), то это то, что вы получите, когда появится средство выбора. И если у вас есть проблемы с ним, просто отправьте сообщение через контактную страницу, и оно будет адресовано как можно скорее.