using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace CustomComponents
{
/// <summary>
/// Summary description for CreditCardForm
/// </summary>
public class CreditCardForm5 : WebControl
{
/// <summary>
/// 这上些都是设置控件的外表值,为了保存这些控件设置的值,
/// 用视图状态来保存这一些值
/// </summary>
#region Labels
public virtual string PaymentMethodText
{
get { return ViewState["PaymentMethodText"] != null ? (string)ViewState["PaymentMethodText"] : "PaymentMethod"; }
set { ViewState["PaymentMethodText"] = value; }
}
public virtual string CreditCardNoText
{
get { return ViewState["CreditCardNoText"] != null ? (string)ViewState["CreditCardNoText"] : "CreditCardNo"; }
set { ViewState["CreditCardNoText"] = value; }
}
public virtual string CardholderNameText
{
get { return ViewState["CardholderNameText"] != null ? (string)ViewState["CardholderNameText"] : "CardholderName"; }
set { ViewState["CardholderNameText"] = value; }
}
public virtual string ExpirationDateText
{
get { return ViewState["ExpirationDateText"] != null ? (string)ViewState["ExpirationDateText"] : "Expiration Date"; }
set { ViewState["ExpirationDateText"] = value; }
}
public virtual string SubmitButtonText
{
get { return ViewState["SubmitButtonText"] != null ? (string)ViewState["SubmitButtonText"] : "Submit"; }
set { ViewState["SubmitButtonText"] = value; }
}
#endregion
/// <summary>
/// 怎么样来设置样式?
/// CreateControlStyle 方法用于创建在内部用来实现所有与样式有关的属性的样式对象。
/// 派生类可以重写此方法以创建适合该类的样式。此方法主要由控件开发人员使用。
/// 因为WebControl不会自动保存ControlStyle的ViewState,所以如果要重写CreateControlStyle,那么最好按默认的策略,把ViewState作为Style保存数据的地方:
/// </summary>
/// <returns></returns>
///
/***********************************************************************************************************************************************
* 由于TableStyle类继承自Style类,所以该类包括Style类的所有属性,
* 例如,BackColor、BorderColor、BorderStyle、BorderWidth、CssClass、Font、Height、Width和ForeColor。
* TableStyle类还包括一些自身属性,包括GridLines、CellSpacing、CellPadding、HorizontalAlign和BackImageUrl。
* CreditCardForm5控件必须为每个TableStyle类的属性公开属性,其中的get访问器和set访问器必须分别将TableStyle类的属性委托给控件属性。如以下代码所示:
* TableStyle类 使用 Style 对象一次更改多个控件的样式属性。每次更改 Style 属性值中的一个值时,各个控件必须调用其 ApplyStyle 方法。
* 名称 说明
BackColor 获取或设置 Web 服务器控件的背景色。 (继承自 Style。)
BackImageUrl 获取或设置要在表控件的背景中显示的图像的 URL。
BorderColor 获取或设置 Web 服务器控件的边框颜色。 (继承自 Style。)
BorderStyle 获取或设置 Web 服务器控件的边框样式。 (继承自 Style。)
BorderWidth 获取或设置 Web 服务器控件的边框宽度。 (继承自 Style。)
CanRaiseEvents 获取一个指示组件是否可以引发事件的值。 (继承自 Component。)
CellPadding 获取或设置单元格内容和单元格边框之间的空间量。
CellSpacing 获取或设置表单元格之间的距离。
Container 获取 IContainer,它包含 Component。 (继承自 Component。)
CssClass 获取或设置由 Web 服务器控件在客户端呈现的级联样式表 (CSS) 类。 (继承自 Style。)
DesignMode 获取一个值,用以指示 Component 当前是否处于设计模式。 (继承自 Component。)
Events 获取附加到此 Component 的事件处理程序的列表。 (继承自 Component。)
Font 获取与 Web 服务器控件关联的字体属性。 (继承自 Style。)
ForeColor 获取或设置 Web 服务器控件的前景色(通常是文本颜色)。 (继承自 Style。)
GridLines 获取或设置一个值,该值指定是否显示表控件的单元格之间的边框。
Height 获取或设置 Web 服务器控件的高度。 (继承自 Style。)
HorizontalAlign 获取或设置表在其容器内的水平对齐方式。
IsEmpty 基础结构。保护属性。获取一个值,该值指示是否已在状态袋中定义任何样式元素。 (继承自 Style。)
IsTrackingViewState 返回一个值,该值指示状态袋中是否有任何已定义的样式元素。 (继承自 Style。)
RegisteredCssClass 获取已向控件注册的级联样式表 (CSS) 类。 (继承自 Style。)
Site 获取或设置 Component 的 ISite。 (继承自 Component。)
ViewState 基础结构。获取保存样式元素的状态袋。 (继承自 Style。)
Width 获取或设置 Web 服务器控件的宽度。 (继承自 Style。)
*
*
* 必须将这些属性声明为virtual,
**************************************************************************************************************************************************/
#region Control Style
protected override Style CreateControlStyle()
{
return new TableStyle(ViewState);
}
public virtual GridLines GridLines
{
get { return ((TableStyle)ControlStyle).GridLines; }
set { ((TableStyle)ControlStyle).GridLines = value; }
}
public virtual int CellSpacing
{
get { return ((TableStyle)ControlStyle).CellSpacing; }
set { ((TableStyle)ControlStyle).CellSpacing = value; }
}
public virtual int CellPadding
{
get { return ((TableStyle)ControlStyle).CellPadding; }
set { ((TableStyle)ControlStyle).CellPadding = value; }
}
public virtual HorizontalAlign HorizontalAlign
{
get { return ((TableStyle)ControlStyle).HorizontalAlign; }
set { ((TableStyle)ControlStyle).HorizontalAlign = value; }
}
public virtual string BackImageUrl
{
get { return ((TableStyle)ControlStyle).BackImageUrl; }
set { ((TableStyle)ControlStyle).BackImageUrl = value; }
}
#endregion
#region Names
protected virtual string PaymentMethodSelectName
{
get { return "PaymentMethod"; }
}
protected virtual string CreditCardNoTextInputName
{
get { return "CreditCardNo"; }
}
protected virtual string CardholderNameTextInputName
{
get { return "CardholderName"; }
}
protected virtual string MonthSelectName
{
get { return "Month"; }
}
protected virtual string YearSelectName
{
get { return "Year"; }
}
protected virtual string SubmitInputName
{
get { return "Submit"; }
}
#endregion
#region Ids
protected virtual string PaymentMethodSelectId
{
get { return "PaymentMethod"; }
}
protected virtual string CreditCardNoTextInputId
{
get { return "CreditCardNo"; }
}
protected virtual string CardholderNameTextInputId
{
get { return "CardholderName"; }
}
protected virtual string MonthSelectId
{
get { return "Month"; }
}
protected virtual string YearSelectId
{
get { return "Year"; }
}
protected virtual string SubmitInputId
{
get { return "Submit"; }
}
#endregion
/// <summary>
/// TagKey 属性
/// 使用 TagKey 属性确定与此 Web 服务器控件关联的 HtmlTextWriterTag 值。此属性主要由控件开发人员使用。
/// 经过我的实验,好象是用来设置开始和结束标志的
///
/// 重载TagKey属性, 使用<Table>替换掉默认的<Span>
///通过重载TagKey属性,把控件容器标记设置为<Table></Table
/// </summary>
protected override HtmlTextWriterTag TagKey
{
get { return HtmlTextWriterTag.Table; }
}
/*AddAttributesRender重载方法主要是为重载的TagKey增加一些属性,在实际应用时可以在本方法中任意设置TagKey支持的属性。在这里设置了几个<Table>标记支持的属性。
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Border, "0px");
writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0px");
writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0px");
base.AddAttributesToRender(writer);
}
* */
/// <summary>
/// 为什么要重写这一个方法?
/// 控件生命周期的Render阶段,主要将控件标记和字符文本输出到服务器控件输出流中。在这个阶段可以直接写HTML标记,也可以调用每个控件都有的RenderControl方法到输出流。
/// 在WebControl基类中,以Render开头的呈现方法有如下几个:
///RenderControl(HtmlTextWriter writer)
///Render(HtmlTextWriter writer)
///RenderBeginTag(HtmlTextWriter writer)
///RenderContents(HtmlTextWriter output)
///RenderEndTag(HtmlTextWriter writer)
///以上几个Render方法并不是毫无联系的,它们的执行顺序是从上往下,并且有嵌套的调用关系。
///其中在RenderControl方法内部会调用Render方法,在Render方法内部会依次调用RenderBeginTag, RenderContents和RenderEndTag。
///其中RenderControl和Render是Control基类中的方法,因为WebControl本身也是继承Control的。
///
/// 一般在开发基本控件时,我们只需重写RenderContents方法即可,在此方法中可以把控件HTML文本标记和其他内容写到输出流中。
///
///另外,还有两个可以重载的方法 RenderBeginTag和RenderEndTag。这两个方法执行时刻点是分别在Render控件内容之前和之后。
///可以重写这两个方法自己定义控件的起始和结束标记。默认情况下控件是以<Span></Span>作为起始和结束标记的,图3-1是没有重写标记的一个控件的默认显示。
///
/// 在实际开发中建议尽量使用HtmlTextWriterAttribute,HtmlTextWriterStyle和HtmlTextWriterTag枚举生成控件以及其属性标记,
/// 使用这些枚举输出最大的好处是我们不用关心浏览器的兼容性,让它在Render时自行处理,否则我们必须得保证当前浏览器要支持此标记。例如:
///
///
/// output.RenderEndTag可以省略,运行环境在运行时会自动检测到默认的尾签并自动追加。以上代码比较简单,事实上可以省略所有的RenderEndTag标记。
///
/// </summary>
/// <param name="writer"></param>
protected override void RenderContents(HtmlTextWriter writer)
{
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write(PaymentMethodText);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.AddAttribute(HtmlTextWriterAttribute.Name, PaymentMethodSelectName);
writer.AddAttribute(HtmlTextWriterAttribute.Id, PaymentMethodSelectId);
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%");
writer.RenderBeginTag(HtmlTextWriterTag.Select);
writer.AddAttribute(HtmlTextWriterAttribute.Value, "0");
writer.RenderBeginTag(HtmlTextWriterTag.Option);
writer.Write("Visa");
writer.RenderEndTag();
writer.AddAttribute(HtmlTextWriterAttribute.Value, "1");
writer.RenderBeginTag(HtmlTextWriterTag.Option);
writer.Write("MasterCard");
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write(CreditCardNoText);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.AddAttribute(HtmlTextWriterAttribute.Name, CreditCardNoTextInputName);
writer.AddAttribute(HtmlTextWriterAttribute.Id, CreditCardNoTextInputId);
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write(CardholderNameText);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.AddAttribute(HtmlTextWriterAttribute.Name, CardholderNameTextInputName);
writer.AddAttribute(HtmlTextWriterAttribute.Id, CardholderNameTextInputId);
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write(ExpirationDateText);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.AddAttribute(HtmlTextWriterAttribute.Name, MonthSelectName);
writer.AddAttribute(HtmlTextWriterAttribute.Id, MonthSelectId);
writer.RenderBeginTag(HtmlTextWriterTag.Select);
for (int day = 1; day < 13; day++)
{
writer.AddAttribute(HtmlTextWriterAttribute.Value, day.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Option);
if (day < 10)
writer.Write("0" + day.ToString());
else
writer.Write(day);
writer.RenderEndTag();
}
writer.RenderEndTag();
writer.Write(" ");
writer.AddAttribute(HtmlTextWriterAttribute.Name, YearSelectName);
writer.AddAttribute(HtmlTextWriterAttribute.Id, YearSelectId);
writer.RenderBeginTag(HtmlTextWriterTag.Select);
for (int year = 2005; year < 2015; year++)
{
writer.AddAttribute(HtmlTextWriterAttribute.Value, year.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Option);
writer.Write(year);
writer.RenderEndTag();
}
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
//writer.RenderBeginTag(HtmlTextWriterTag.Td);
//writer.RenderEndTag();
writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit");
writer.AddAttribute(HtmlTextWriterAttribute.Value, "Submit");
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
}
}
}