2

我有一个简单的表单,有两个 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 事件?
4

5 回答 5

2

我发现自己有时会遇到这个问题,我使用了一种有点丑陋的技术。我没有直接绑定到属性,而是在模型上创建了两个附加属性。

//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属性将始终正确反映两个控件的相应日期和时间,同时仅使用我们关心的每个控件的信息更新值。

于 2010-04-27T18:35:15.733 回答
1

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

于 2010-04-27T18:14:50.047 回答
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);
于 2010-06-17T20:39:38.590 回答
1

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

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

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

于 2012-01-23T10:54:42.450 回答
0

我的 WinForm 中有一个名为 EpDayOnly 的公共DateTime属性。然后我通过编写将 datetimepicker 的日期与属性绑定:

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

当我打开表单时,我通过编写例如设置 datetime 属性

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

这反映在 datetimepicker 控件上。

于 2012-06-22T10:32:51.280 回答