【问题标题】:MonthCalendar.SelectionRange databinding exampleMonthCalendar.SelectionRange 数据绑定示例
【发布时间】:2008-12-18 08:04:36
【问题描述】:

如何对 MonthCalendar.SelectionRange 属性执行数据绑定?鉴于该属性的类型为“SelectionRange”,这是一个类,我不知道该怎么做。任何示例将不胜感激。

【问题讨论】:

    标签: c# data-binding monthcalendar


    【解决方案1】:

    好吧,MonthCalendarSelectionRange 上似乎没有任何明显的事件,也没有实现 INotifyPropertyChanged,所以它看起来 像数据绑定在这里可能不行。

    更新:但是,它确实会引发 DateChanged,因此您可以手动将一些东西连接在一起,或者(更有用)通过子类化控件来以适合绑定的方式公开值和事件。请注意Actual(...) 很有用,因为结束(否则)就在午夜之前,而不是午夜本身......

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Windows.Forms;
    class Foo : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
            Debug.WriteLine(ToString());
        }
        private void SetField<T>(ref T field, T value, string propertyName)
        {
            if (!EqualityComparer<T>.Default.Equals(field, value))
            {
                field = value;
                OnPropertyChanged(propertyName);            
            }
        }
        private DateTime start, end;
        public DateTime Start { get { return start; } set { SetField(ref start, value, "Start"); } }
        public DateTime End { get { return end; } set { SetField(ref end, value, "End"); } }
    }
    
    class BindableCalendar : MonthCalendar
    {
        public DateTime ActualSelectionStart
        {
            get { return SelectionRange.Start; }
            set { if (ActualSelectionStart != value) { SetSelectionRange(value, ActualSelectionEnd); } }
        }
        public DateTime ActualSelectionEnd
        {
            get { return SelectionRange.End; }
            set { if (ActualSelectionEnd != value) { SetSelectionRange(ActualSelectionStart, value); } }
        }
        // should really use EventHandlerList here...
        public event EventHandler ActualSelectionStartChanged, ActualSelectionEndChanged;
    
        DateTime lastKnownStart, lastKnownEnd;
        protected override void OnDateChanged(DateRangeEventArgs drevent)
        {
            base.OnDateChanged(drevent);
            if (lastKnownStart != drevent.Start)
            {
                if (ActualSelectionStartChanged != null) ActualSelectionStartChanged(this, EventArgs.Empty);
                lastKnownStart = drevent.Start;
            }
            if (lastKnownEnd != drevent.End)
            {
                if (ActualSelectionEndChanged != null) ActualSelectionEndChanged(this, EventArgs.Empty);
                lastKnownEnd = drevent.End;
            }
        }
    
    }
    
    static class Program
    {
        [STAThread]
        static void Main()
        {
    
            Application.EnableVisualStyles();
            MonthCalendar cal;
            Button btn;
            using (Form form = new Form
            {
                Controls = {
                    (cal = new BindableCalendar { Dock = DockStyle.Fill, MaxSelectionCount = 10 }),
                    (btn = new Button { Dock = DockStyle.Bottom, Text = "thwack"})
                }
            })
            {
                Foo foo = new Foo { Start = DateTime.Today, End = DateTime.Today.AddDays(1) };
                cal.DataBindings.Add("ActualSelectionStart", foo, "Start").DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
                cal.DataBindings.Add("ActualSelectionEnd", foo, "End").DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
                btn.Click += delegate
                {
                    foo.Start = foo.Start.AddDays(1);
                    foo.End = foo.End.AddDays(1);
                };
                Application.Run(form);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      对我来说,这似乎很简单。我只是绑定了 MonthCalendar 组件的 SelectionStart 和 SelectionEnd 属性。

      this.Calendar1.DataBindings.Add(new System.Windows.Forms.Binding("SelectionStart",
      bindingSource, "DateField", true));
      this.Calendar1.DataBindings.Add(new System.Windows.Forms.Binding("SelectionEnd",
      bindingSource, "DateField", true));
      

      【讨论】:

        猜你喜欢
        • 2011-07-01
        • 2022-09-30
        • 1970-01-01
        • 2012-10-19
        • 2019-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多