Я думаю, что важным фактором является уровень комфорта разработчика.
Вероятно, верно, что использование transform или for_each - правильное решение, но оно не является более эффективным, и рукописные циклы по своей природе не опасны. Если разработчику потребуется полчаса, чтобы написать простой цикл, а не полдня, чтобы получить правильный синтаксис для transform или for_each и переместить предоставленный код в функцию или объект функции. И тогда другие разработчики должны будут знать, что происходит.
Новому разработчику, вероятно, лучше всего научиться использовать transform и for_each, а не циклы ручной работы, так как он сможет использовать их последовательно без ошибок. Для остальных из нас, для которых написание циклов является второй натурой, вероятно, лучше придерживаться того, что мы знаем, и лучше познакомиться с алгоритмами в наше свободное время.
Скажем так: если бы я сказал своему боссу, что провел день, превращая петли ручной работы в for_each и преобразовывая вызовы, я сомневаюсь, что он был бы очень рад.
Мое уродливое решение этой проблемы состоит в том, чтобы активировать вкладку, на которой находится 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 имеет некоторые проблемы с сохранением и получением его значения. У меня возникли проблемы при привязке Value к DateTime, не допускающему значения NULL - время от времени я получал NullReferenceExeptions. Не знаю, почему и когда. Иногда это просто происходило и приводило к сбою приложения.
Я просто столкнулся с той же проблемой, используя два DateTimePickers. Я смог заставить их обоих показывать правильное значение, динамически генерируя их и добавляя в форму.
Я выяснил, в чем проблема.
Свойство 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);
Кажется, не имеет ничего общего с программным добавлением средства выбора.
Если вы не можете заставить его работать, вы всегда можете попробовать использовать другое средство выбора. Виджет календаря AJAX Datepicker / Timepicker Any + Time (TM) извлекает свое значение из связанного поля, поэтому, если вы инициализируете поле значением или измените поле, чтобы оно имело значение (например, в onload ), то это то, что вы получите, когда отобразится средство выбора. А если у вас возникнут проблемы, просто отправьте сообщение через страницу контактов, и оно будет рассмотрено как можно скорее.