2

イベントからフィードバックを得るにはどうすればよいですか?

状況:

Slaveオブジェクト( )がイベント(プロパティの変更要求)を生成できるとしましょう。他のオブジェクト(Master)は、これらのイベントをサブスクライブし、変化するプロパティ値を分析して、この変更を受け入れるか、または拒否します。次に、フィードバックがに返され、Slaveプロパティが変更されるかどうかが決まります。

例:

    public class DateChangingEventArgs : EventArgs {
        public DateTime oldDateTime, newDateTime;
        DateChangingEventArgs(DateTime oldDateTime, 
            DateTime newDateTime) {
            this.oldDateTime = oldDateTime;
            this.newDateTime = newDateTime;
        }
    }

    public class MyDateTextBox : TextBox {
        public event EventHandler<DateChangingEventArgs> DateChanging;
        public DateTime MyDate;
        private DateTime myTempDate;

        protected override void OnKeyDown(KeyEventArgs e) {
            base.OnKeyDown(e);

            if (e.KeyCode == Keys.Enter && 
                DateTime.TryParseExact(this.Text, "dd/mm/yyyy", 
                CultureInfo.InvariantCulture, DateTimeStyles.None, 
                out myTempDate)) {                    
                if (!DateChanging == null)
                    DateChanging(this, 
                        new DateChangingEventArgs(MyDate, myTempDate));

                if (feedbackOK) //  here ????????
                    MyDate = myTempDate;
            }
        }
    }

[編集]

Cancelあなたの提案で、コードのいくつかの変更はすでに更新されていると確信していますか?

public class DateChangingEventArgs : CancelEventArgs

..。

public class MyDateTextBox : TextBox
{
    public event EventHandler<DateChangingEventArgs> DateChanging;
    ...
    protected override void OnKeyDown(KeyEventArgs e) {
        if (...)
        {          
            DateChangingEventArgs myRequest;
            if (!DateChanging == null) {
                myRequest = new DateChangingEventArgs(MyDate, myTempDate);
                DateChanging(this,  myRequest);
            }

            // Sure that this value is already updated ??
            if (!myRequest.Cancel) 
                MyDate = myTempDate;
        }
    }
}
4

2 に答える 2

2

フィードバックを含むカスタムEventArgsタイプを使用します。

CancelEventArgsはそのような実装の例であり、サブスクライバーはCancelプロパティを設定できます。

于 2010-01-14T11:18:00.280 に答える
1

独自のクラスを宣言し、「EventArgs.Empty」の代わりにそのインスタンスを渡します。

イベントハンドラーは、イベントオブジェクトのプロパティを変更します(フィードバックを提供します)。

次に、event argsオブジェクトを確認し、提供されたフィードバックを確認します。

質問は?

例えば

class FeedbackEventArgs: EventArgs
{
   public bool IsOk {get; set;}
}
...
FeedbackEventArgs feedback = new FeedbackEventArgs();
feedback.IsOK = false;
if (!DateChanging == null) 
    DateChanging(this, feedback); 
if (feedback.IsOK) 
于 2010-01-14T11:18:23.730 に答える