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), то это то, что вы получите, когда появится средство выбора. И если у вас есть проблемы с ним, просто отправьте сообщение через контактную страницу, и оно будет адресовано как можно скорее.