【问题标题】:How to obtain feedback from an event?如何从事件中获得反馈?
【发布时间】:2010-01-14 11:14:48
【问题描述】:

我想知道如何从活动中获得反馈?

情况:

假设一个对象 (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;
        }
    }
}

【问题讨论】:

  • 我不知道你所说的“我确定取消已经更新”是什么意思。在您的函数移至下一行(即移至 if(!myRequest.Cancel))之前,所有 DateChanging 事件处理程序都会触发。您必须竭尽全力让处​​理程序异步运行。

标签: .net oop events feedback


【解决方案1】:

使用包含反馈的自定义 EventArgs 类型。

CancelEventArgs 是此类实现的一个示例,其中订阅者可以设置Cancel 属性。

【讨论】:

    【解决方案2】:

    您声明自己的类并传递它的实例而不是“EventArgs.Empty”。

    事件处理程序更改事件对象的属性(提供反馈)。

    然后您检查事件 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) 
    

    【讨论】:

    • 代码仅作为示例提供,尚未编译。
    • 还有流行的编码标准说“EventFeedback”应该命名为“FeedbackEventArgs”。
    • @Binary:这里的 EventFeedback 类不是(不继承)EventArgs,因此,任何准则都适用于此。
    • @serhio:更改名称以反映指南,并继承自 EventArgs。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2020-05-06
    相关资源
    最近更新 更多