Как привязать данные двойным DateTimePicker к одному объекту DateTime - PullRequest
2 голосов
/ 27 апреля 2010

У меня есть простая форма с двумя элементами управления DateTimePicker: один для даты и один для времени. Дело в том, что эти два элемента управления должны представлять один момент времени. Поэтому я хотел бы привязать их к одному свойству DateTime в моей форме (для простоты). Я сделал следующее:

// Start is a DateTime property on the form
_StartDate.DataBindings.Add("Value", this, "Start"); 
_StartTime.DataBindings.Add("Value", this, "Start");

Но подключение к событию "ValueChanged" дает смешанные результаты ... Иногда я получаю именно то, что хочу, иногда обновления свойства "вялые". Я полагал, что этот способ разделения на два DateTimePicker был довольно распространенным. Так как это сделать?

Обновление: Возможно, там несколько вопросов:

  1. Как связать DateTimePicker (Format: Date) со свойством DateTime в форме?
  2. Тогда, как мне связать еще один DateTimePicker (Format: Time) с тем же свойством?
  3. Я использую Visual Studio Express 2008 (.NET 3.5) и, похоже, получаю события ValueChanged из DateTimePickers до , когда значение изменяется?

Ответы [ 5 ]

2 голосов
/ 27 апреля 2010

У меня иногда возникает эта проблема, и я использую несколько уродливую технику. Вместо привязки непосредственно к свойству я создаю два дополнительных свойства в модели.

//The data I want to bind to
public DateTime Something { get; set; }
//Two new properties
public DateTime SomethingDate { /*...*/ }
public DateTime SomethingTime { /*...*/ }

Секции get каждого должны просто возвращать Something. В разделах set вы реализуете небольшую часть логики, чтобы гарантировать, что Something всегда отражается точно.

public DateTime SomethingDate
{
    get
    {
        return this.Something;
    }
    set
    {
        this.Something = value.Date.Add(this.Something.TimeOfDay);
    }
}
public DateTime SomethingTime
{
    get
    {
        return this.Something;
    }
    set
    {
        this.Something = this.Something.Date.Add(value.TimeOfDay);
    }
}

Теперь ваше свойство Something всегда будет правильно отражать соответствующую дату и время двух элементов управления, при этом обновляя значение только частью информации от каждого из нас, который нам небезразличен.

1 голос
/ 23 января 2012

Я знаю, что это немного устарело, но я использовал найденное здесь решение:

http://office.microsoft.com/en-us/infopath-help/display-the-date-and-time-in-separate-controls-HA010082330.aspx

Это прекрасно работает и не является решением кода

1 голос
/ 18 июня 2010

Вы не можете напрямую связать член структуры DateTime с классом привязки, для этого вам нужно обернуть структуру DateTime и реализовать событие PropertyChanged интерфейса INotifyPropertyChanged, например:

public class DateTimeWrapper : INotifyPropertyChanged
{
    private DateTime _dateTime;
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged()
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs("Value"));
    }

    public DateTime Value
    {
        get { return _dateTime; }
        set
        {
            _dateTime = value;
            OnPropertyChanged();
        }
    }
}

и после этого вы можете использовать объект Bindig следующим образом:

var binding = new Binding("Value", _time, "Value", true);
binding.ControlUpdateMode = ControlUpdateMode.OnPropertyChanged;
dateTimePicker1.DataBindings.Add(binding);
1 голос
/ 27 апреля 2010

К сожалению, я думаю, что вы, возможно, обнаружите, что пишете пользовательский элемент управления, который включает в себя оба элемента, к которым вы можете привязать данные. Вот так мы решили ту же проблему.

0 голосов
/ 22 июня 2012

У меня есть публичное DateTime свойство в моей WinForm с именем EpDayOnly. Затем я связываю дату datetimepicker со свойством, написав:

myDateTimePicker.DataBindings.Add("Value", this, "EpDayOnly", false, DataSourceUpdateMode.OnPropertyChanged);

Когда я открываю форму, я устанавливаю свойство datetime, например,

myNewForm.EpDayOnly=DateTime.Parse("5/5/2012");

и это отражается на элементе управления datetimepicker.

...