与科技一同成长:.NET 2.0 服务器控件与组件开发 (参考:WROX.com)

代码片断: 

#region Credit Card Info Fields
        /// <summary>
        /// 在页面回传过程中,为了保持值的一致性,ViewState集合作为内部存储
        /// </summary>
        public PaymentMethod PaymentMethod
        {
            get { return ViewState["PaymentMethod"] != null ? (PaymentMethod)ViewState["PaymentMethod"] : PaymentMethod.VISA; }
            set { ViewState["PaymentMethod"] = value; }
        }
        public string CreditCardNo
        {
            get { return ViewState["CreditCardNo"] != null ? (string)ViewState["CreditCardNo"] : string.Empty; }
            set { ViewState["CreditCardNo"] = value; }
        }
        public string CardholderName
        {
            get { return ViewState["CardholderName"] != null ? (string)ViewState["CardholderName"] : string.Empty; }
            set { ViewState["CardholderName"] = value; }
        }
        public DateTime ExpirationDate
        {
            get { return ViewState["ExpirationDate"] != null ? (DateTime)ViewState["ExpirationDate"] : DateTime.Now; }
            set { ViewState["ExpirationDate"] = value; }
        }

        private bool hasPaymentMethodChanged;
        private bool hasCreditCardNoChanged;
        private bool hasCardholderNameChanged;
        private bool hasExpirationDateChanged;

        #endregion
        #region 事件回传
        /// <summary>
        /// 调用签名方法 提供了继承类和自己的实现
        /// </summary>
        /// <param name="args"></param>
        void IPostBackEventHandler.RaisePostBackEvent(string args)
        {
            RaisePostBackEvent(args);
        }
        /// <summary>
        /// 作为回发事件和回发数据之间的桥梁
        /// </summary>
        /// <param name="args"></param>
        protected virtual void RaisePostBackEvent(string args)
        {
            //使用事件数据或者信用卡信息创建一个ValidatingCreditCardEventArgs对象
            // 注意此刻数据已经用了 来自 ValidatingCreditCardEventArgs类的私有字段
            // 
            ValidateCreditCardEventArgs ve = new ValidateCreditCardEventArgs(PaymentMethod, CreditCardNo, CardholderName, ExpirationDate);
            //触发事件
            OnValidatingCreditCard(ve);
        }
        #endregion
        #region 数据回传
        //----------------------------------------------------------------------
        // 当点击submit 按扭,表单数据被回传到服务器 ,控件6必须访问回传的表单数据,
        // 已获取选中的值和过期的时间和文本  等输入的HTML元素, 然后使这些值生成
        // ValidatingCreditCardEventArgs对象 ,如事例  #region Events 例子
        // 实现 IPostBackDataHandler接口 以便访问回传表单的数据
        //----------------------------------------------------------------------
        /// <summary>
        ///当点击submit 按扭,表单数据被回传到服务器时,页面将调用LoadPostData()方法,
        /// 并将回传表单数据的NameValueCollection类型的集合传递给该方法
        /// </summary>
        /// <param name="postDataKey"></param>
        /// <param name="values"></param>
        /// <returns></returns>
        bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection values)
        {
            return LoadPostData(postDataKey, values);
        }
        /// <summary>
        /// 从客户端得到值,
        /// 1)复制给如果值跟原来的不同就跟新以前的属性值,
        /// 2)设置带有BOOLEAN的私有字段,
        /// </summary>
        /// <param name="postDataKey"></param>
        /// <param name="values">元素NAME属性值(回传服务器的值)属性名
        /// 做为NameValueCollection的索引,从而实现对相关元素值的访问</param>
        /// <returns>***任何一个改变就返回TURE</returns>
        protected virtual bool LoadPostData(string postDataKey, NameValueCollection values)
        {
            PaymentMethod paymentMethod = values[PaymentSeleteMethod] == "0" ? PaymentMethod.VISA : PaymentMethod.MASTERCARD;
            if (paymentMethod != PaymentMethod)
            { // ^^赋值给 ValidateCreditCardEventArgs.cs 的属性 
                PaymentMethod = paymentMethod;
                hasPaymentMethodChanged = true;
            }

            string creditCardNo = values[CreditCardNoText];
            if (creditCardNo != CreditCardNo)
            {
                CreditCardNo = creditCardNo;
                hasCreditCardNoChanged = true;
            }

            string cardholderName = values[CreditHolderText];
            if (cardholderName != CardholderName)
            {

                CardholderName = cardholderName;
                hasCardholderNameChanged = true;
            }

            int month = int.Parse(values[ExpirationMonthSelect]);
            int year = int.Parse(values[ExpirationYearSelect]);
            DateTime expirationDate = new DateTime(year, month, 25);
            if (expirationDate != ExpirationDate)
            {
                ExpirationDate = expirationDate;
                hasExpirationDateChanged = true;
            }

            if (!string.IsNullOrEmpty(values[SubmitText]))
                Page.RegisterRequiresRaiseEvent(this);

            return hasPaymentMethodChanged ||
                   hasCreditCardNoChanged ||
                   hasCardholderNameChanged ||
                   hasExpirationDateChanged;
        }

        /// <summary>
        /// 显示转换接口类型
        /// </summary>
        void IPostBackDataHandler.RaisePostDataChangedEvent()
        {
            RaisePostDataChangedEvent();
        }

        /// <summary>
        ///检查BOOLEAN的私有字段的某个值
        /// 根据已经设置的私有变量的值看属性是否更改
        /// TRUE就触发相关的事件
        /// </summary>
        protected virtual void RaisePostDataChangedEvent()
        {
            if (hasPaymentMethodChanged)
                OnPaymentMethodChanged(EventArgs.Empty);

            if (hasCreditCardNoChanged)
                OnCreditCardNoChanged(EventArgs.Empty);

            if (hasCardholderNameChanged)
                OnCardholderNameChanged(EventArgs.Empty);

            if (hasExpirationDateChanged)
                OnExpirationDateChanged(EventArgs.Empty);
        }

        #region 事件定义(事件设计模式)

        private static readonly object ValidatingCreditCardEventKey = new object();
        /// <summary>
        /// ValidatingCreditCardEventHandler  类型
        /// 事件的实现,
        /// 必须使用ValidatingCreditCardEventKey事件键作为EVENTS集合的索引
        /// 以便访问事件委托
        /// </summary>
        public event ValidateCreditCardEventHandler ValidatingCreditCard
        {
            add { Events.AddHandler(ValidatingCreditCardEventKey, value); }
            remove { Events.RemoveHandler(ValidatingCreditCardEventKey, value); }
        }
        /// <summary>
        /// 实现一个引发事件的方法
        /// </summary>
        /// <param name="e"></param>
        protected virtual void OnValidatingCreditCard(ValidateCreditCardEventArgs e)
        {
            ValidateCreditCardEventHandler handler = Events[ValidatingCreditCardEventKey] as ValidateCreditCardEventHandler;

            if (handler != null)
                handler(this, e);
        }

        private static readonly object PaymentMethodChangedEventKey = new object();
        public event EventHandler PaymentMethodChanged
        {
            add { Events.AddHandler(PaymentMethodChangedEventKey, value); }
            remove { Events.RemoveHandler(PaymentMethodChangedEventKey, value); }
        }

        protected virtual void OnPaymentMethodChanged(EventArgs e)
        {
            EventHandler handler = Events[PaymentMethodChangedEventKey] as EventHandler;

            if (handler != null)
                handler(this, e);
        }

        private static readonly object CreditCardNoChangedEventKey = new object();
        public event EventHandler CreditCardNoChanged
        {
            add { Events.AddHandler(CreditCardNoChangedEventKey, value); }
            remove { Events.RemoveHandler(CreditCardNoChangedEventKey, value); }
        }

        protected virtual void OnCreditCardNoChanged(EventArgs e)
        {
            EventHandler handler = Events[CreditCardNoChangedEventKey] as EventHandler;

            if (handler != null)
                handler(this, e);
        }

        private static readonly object CardholderNameChangedEventKey = new object();
        public event EventHandler CardholderNameChanged
        {
            add { Events.AddHandler(CardholderNameChangedEventKey, value); }
            remove { Events.RemoveHandler(CardholderNameChangedEventKey, value); }
        }

        protected virtual void OnCardholderNameChanged(EventArgs e)
        {
            EventHandler handler = Events[CardholderNameChangedEventKey] as EventHandler;

            if (handler != null)
                handler(this, e);
        }

        private static readonly object ExpirationDateChangedEventKey = new object();
        public event EventHandler ExpirationDateChanged
        {
            add { Events.AddHandler(ExpirationDateChangedEventKey, value); }
            remove { Events.RemoveHandler(ExpirationDateChangedEventKey, value); }
        }

        protected virtual void OnExpirationDateChanged(EventArgs e)
        {
            EventHandler handler = Events[ExpirationDateChangedEventKey] as EventHandler;

            if (handler != null)
                handler(this, e);
        }
        #endregion
        #endregion

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值