Domanda

Come si esegue l'associazione dati contro la proprietà MonthCalendar.SelectionRange? Data la proprietà è di tipo 'SelectionRange', che è una classe non sono sicuro di come andare a questo proposito. Eventuali esempi sarebbe molto apprezzato.

È stato utile?

Soluzione

Beh, non sembrano essere eventi ovvie per questo sia sul MonthCalendar o SelectionRange, e né attua INotifyPropertyChanged, in modo che guarda come associazione dati potrebbe non essere possibile qui.

Aggiornamento: Esso, tuttavia, aumentare il DateChanged, quindi si può collegare alcune cose insieme manualmente, o (più utilmente) derivandola da controllo per esporre i valori ed eventi in un modo adatto per il legame. Si noti la Actual(...) sono utili perché la fine (non) è poco prima di mezzanotte, piuttosto che a mezzanotte si ...

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

Altri suggerimenti

Per me sembra essere molto semplice. Ho appena legato SelectionStart e SelectionEnd proprietà del componente MonthCalendar.

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));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top