【问题标题】:How do I Data-Bind dual DateTimePicker to a single DateTime object如何将双 DateTimePicker 数据绑定到单个 DateTime 对象
【发布时间】:2011-02-13 00:03:46
【问题描述】:

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

【问题讨论】:

    标签: c# winforms datetimepicker


    【解决方案1】:

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

    【讨论】:

    • 真的吗?我认为这很常见,可以开箱即用。去图...
    • 我同意。它真的应该开箱即用。
    【解决方案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 属性将始终正确反映两个控件的相应日期和时间,同时仅使用我们关心的每个控件的信息更新值。

    【讨论】:

    • 我会试试这个,看看是否能解决我当前的问题。谢谢!
    • 您能具体解释一下您是如何进行绑定的吗?我尝试在绑定到“SomethingDate”的 DataPicker 的 ValueChangedEvent 上将“Something”写入控制台。但是当我选择一个新日期时,控制台会一遍又一遍地写入相同的日期。
    【解决方案3】:

    您不能直接将 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);
    

    【讨论】:

      【解决方案4】:

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

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

      效果很好,而且是无代码解决方案

      【讨论】:

      • 欢迎来到 Stack Overflow!虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
      • 我刚刚阅读了这篇文章,并没有找到我想要的答案。本文仅涉及配置,例如“DatePicker”仅显示日期。我已经知道该怎么做。问题是两个控件“双重绑定”到一个共享的 DateTime 对象。
      【解决方案5】:

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

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

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

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

      这会反映到 datetimepicker 控件中。

      【讨论】:

      • 我想你误解了这个问题:具体来说,我有 2 个 DateTimePicker 控件(一个用于时间,一个用于日期),并且基本上希望它们共享数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 2018-01-10
      • 1970-01-01
      相关资源
      最近更新 更多