我如何将双DateTimePicker数据绑定到单个DateTime对象

时间:2010-04-27 18:04:56

标签: c# winforms datetimepicker

我有一个简单的表单,有两个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(格式:日期)绑定到表单上的DateTime属性?
  2. 然后,如何将另一个DateTimePicker(格式:时间)绑定到同一属性?
  3. 我正在使用Visual Studio Express 2008(.NET 3.5),我似乎在更改值之前从DateTimePickers 获取ValueChanged事件

5 个答案:

答案 0 :(得分:2)

我发现自己偶尔遇到这个问题而且我使用了一种有点难看的技巧。我没有直接绑定到属性,而是在模型上创建了两个额外的属性。

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

每个get部分应仅返回Somethingset部分是您实现一点点逻辑的地方,以确保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 :(得分:1)

不幸的是,我认为您可能会发现自己正在编写一个包含两者的自定义控件,您可以将数据绑定到该控件。这就是我们解决同样问题的方法。

答案 2 :(得分:1)

您无法直接将DateTime结构成员绑定到绑定类, 要做到这一点,你必须包装一个DateTime结构并实现INotifyPropertyChanged接口的PropertyChanged事件,如下所示:

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);

答案 3 :(得分:1)

我知道这有点旧,但我使用了这里找到的解决方案:

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

工作正常,是无代码解决方案

答案 4 :(得分:0)

我的WinForm中有一个名为EpDayOnly的公共DateTime属性。 然后我通过写:

将datetimepicker的日期与属性绑定
myDateTimePicker.DataBindings.Add("Value", this, "EpDayOnly", false, DataSourceUpdateMode.OnPropertyChanged);

当我打开表单时,我通过编写例如

来设置datetime属性
myNewForm.EpDayOnly=DateTime.Parse("5/5/2012");

,这反映在datetimepicker控件上。