给自定义控件添加时间步骤。
1.实现继承自EventArgs类或其子类的自定义事件数据类。
public class ValidatingCreditCardEventArgs : EventArgs
{
private PaymentMethod paymentMethod;
public PaymentMethod PaymentMethod
{
get { return paymentMethod; }
}
private string creditCardNo;
public string CreditCardNo
{
get { return creditCardNo; }
}
private string cardholderName;
public string CardholderName
{
get { return cardholderName; }
}
private DateTime expirationDate;
public DateTime ExpirationDate
{
get { return expirationDate; }
}
public ValidatingCreditCardEventArgs(PaymentMethod paymentMethod,
string creditCardNo,
string cardholderName,
DateTime expirationDate)
{
this.paymentMethod = paymentMethod;
this.creditCardNo = creditCardNo;
this.cardholderName = cardholderName;
this.expirationDate = expirationDate;
}
}
2.声明自定义委托
public delegate void ValidatingCreditCardEventHandler (object sender, ValidatingCreditCardEventArgs e);
3.使用委托实例和关键字event来定义事件(用EventHandleList解决性能)
private static readonly object ValidatingCreditCardEventKey = new object();
public event ValidatingCreditCardEventHandler ValidatingCreditCard
{
add { Events.AddHandler(ValidatingCreditCardEventKey, value); }
remove { Events.RemoveHandler(ValidatingCreditCardEventKey, value); }
}
4.实现受保护的虚方法,可调用事件委托将通知发送给客户端(方法名包括On和事件名称)
protected virtual void OnValidatingCreditCard(ValidatingCreditCardEventArgs e)
{
ValidatingCreditCardEventHandler handler = Events[ValidatingCreditCardEventKey] as ValidatingCreditCardEventHandler;
if (handler != null)
handler(this, e);
}
5.修改导致回传的HTML元素Name值为服务器控件的UniqueId
protected override string SubmitInputName
{
get { return this.UniqueID; }
}
6.实现IpostBackEventHandler接口的.RaisePostBackEvent方法
void IPostBackEventHandler.RaisePostBackEvent(string args)
{
RaisePostBackEvent(args);
}
protected virtual void RaisePostBackEvent(string args)
{
ValidatingCreditCardEventArgs ve = new ValidatingCreditCardEventArgs(PaymentMethod, CreditCardNo, CardholderName, ExpirationDate);
OnValidatingCreditCard(ve);
}
7.实现IpostBackDataHandler接口的.LoadPostData方法
bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection values)
{
return LoadPostData(postDataKey, values);
}
protected virtual bool LoadPostData(string postDataKey, NameValueCollection values)
{
PaymentMethod paymentMethod = values[PaymentMethodSelectName] == "0" ? PaymentMethod.Visa : PaymentMethod.MasterCard;
if (paymentMethod != PaymentMethod)
{
PaymentMethod = paymentMethod;
hasPaymentMethodChanged = true;
}
string creditCardNo = values[CreditCardNoTextInputName];
if (creditCardNo != CreditCardNo)
{
CreditCardNo = creditCardNo;
hasCreditCardNoChanged = true;
}
string cardholderName = values[CardholderNameTextInputName];
if (cardholderName != CardholderName)
{
CardholderName = cardholderName;
hasCardholderNameChanged = true;
}
int month = int.Parse(values[MonthSelectName]);
int year = int.Parse(values[YearSelectName]);
DateTime expirationDate = new DateTime(year, month, 25);
if (expirationDate != ExpirationDate)
{
ExpirationDate = expirationDate;
hasExpirationDateChanged = true;
}
if (!string.IsNullOrEmpty(values[SubmitInputName]))
Page.RegisterRequiresRaiseEvent(this);
return hasPaymentMethodChanged ||
hasCreditCardNoChanged ||
hasCardholderNameChanged ||
hasExpirationDateChanged;
}
8.实现IpostBackDataHandler接口的.RaisePostDataChangeEvent方法
void IPostBackDataHandler.RaisePostDataChangedEvent()
{
RaisePostDataChangedEvent();
}
protected virtual void RaisePostDataChangedEvent()
{
if (hasPaymentMethodChanged)
OnPaymentMethodChanged(EventArgs.Empty);
if (hasCreditCardNoChanged)
OnCreditCardNoChanged(EventArgs.Empty);
if (hasCardholderNameChanged)
OnCardholderNameChanged(EventArgs.Empty);
if (hasExpirationDateChanged)
OnExpirationDateChanged(EventArgs.Empty);
}
整个实例下载地址