2

2 つの DateTimePicker-controls を持つ単純なフォームがあります。1 つは日付用、もう 1 つは時刻用です。問題は、これら 2 つのコントロールが単一の時点を表すことになっていることです。したがって、フォームの単一の DateTime プロパティにそれらを「バインド」したいと思います(簡単にするため)。私は次のことをしました:

// Start is a DateTime property on the form
_StartDate.DataBindings.Add("Value", this, "Start"); 
_StartTime.DataBindings.Add("Value", this, "Start");

しかし、「ValueChanged」イベントにフックすると、さまざまな結果が得られます...必要なものが正確に得られることもあれば、プロパティの更新が「遅い」こともあります。2 つの DateTimePicker に分割するこの方法はかなり一般的であると考えました。では、どうやってそれを行うのですか?

更新:そこには複数の質問がある可能性があります:

  1. DateTimePicker (形式: Date) をフォームの DateTime プロパティにバインドするにはどうすればよいですか?
  2. 次に、さらに別の DateTimePicker (Format: Time) を同じプロパティにバインドするにはどうすればよいでしょうか?
  3. Visual Studio Express 2008 (.NET 3.5) を使用していますが、値が変更される前に DateTimePickers から ValueChanged イベントを取得しているように見えますか?
4

5 に答える 5

2

私は時々この問題を抱えていることに気づき、やや醜いテクニックを使用しています。プロパティに直接バインドする代わりに、モデルに 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プロパティは 2 つのコントロールの対応する日付と時刻を常に適切に反映し、それぞれの重要な情報で値を更新するだけになります。

于 2010-04-27T18:35:15.733 に答える
1

DateTime構造体メンバーをBindingクラスに直接バインドすることはできません。そのためには、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

残念ながら、データ バインドできる両方を含むカスタム コントロールを作成していることに気が付くかもしれません。それが私たちが同じ問題を解決した方法です。

于 2010-04-27T18:14:50.047 に答える
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

DateTimeWinForm に EpDayOnly という名前のパブリックプロパティがあります。次に、次のように記述して、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 に答える