自定义控件一、基本简单的开发,局限于产生简单的Html控件和可让用户自定义一些属性
1、一般自定义控件都继承某一个基类,其实我们平时用 的所有的控件都继承了一个基类Control类,我们开发可以继承任何服务器控件,但我们一般继承三个基类Control WebControl CompositeControl,因为这些类可以让我们更灵活的操作
下面是继承Control的控件,主要是重写Render方法
先在项目中新建一个类库
然后在cs文件中写入
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace CreditForm
{
public class CustomControl_1:Control
{
protected override void Render(HtmlTextWriter writer)
{
writer.Write ("<table style='width:287px;height:128px;border-width:0'>");
writer.Write("<tr>");
writer.Write("<td>内容</td>");
writer.Write("<td>"); //下面这一段可以看到循环,我们在循环的时候不要用writer
writer.Write("<select name='Month' id='Month'>");
for (int month = 1; month < 13; month++)
{
writer.Write("<option value=" + month.ToString() + ">" + month.ToString() + "</option>");
}
writer.Write("</select>");
writer.Write("<tr>");
writer.Write("<td align='center' colspan='2'>");
writer.Write("<input type='submit' value='提交'/>");
writer.Write("</td></tr>");
}
}
}
编译后在bin文件里面找到dll文件,就可以在网页中添加选项里面添加这个dll,可以像服务器控件一样使用了
2、我们想让用户自己设定上面的”内容”里面的字
下面这段代码放在Render函数的上面
private string neirong=”内容”;
public virtual string NeiRong {
get
{
return neirong;
}
set
{
neirong = value;
}
}
然后我们在内容的那句写上
writer.Write("<td>”+neirong+”</td>");
三、我们正常情况下,用到控件时,改变控件的属性是在控件的属性框里面,那我们如何将自定义的控件的可变属性,能在属性框中出现
我们需要在类库项目中添加一些属性(Attribute)标记
[Browsable (true )]//在属性窗口中是否可见
[Category ("Appearance")]//属性的分类,如,行为,外观,大家可以在属性窗口看见这样的分类
[DefaultValue ("内容")]
[Description ("写入内容")]//这些是显示在属性窗口底下的
public virtual string NeiRong
{
get
{
return neirong;
}
set
{
neirong = value;
}
}
四、当我们用服务器控件时,添加一个服务器控件后会在源码中自动添加一些代码,
[ToolboxData("<{0}:CustomControl_1 runat='server' PaymentMethodText='支付方式'></{0}:CreditCardForm2>")]
public class CreditCardForm2:Control //在这句上面加上,其中runat='server' 必//须要,还有{0}:后面是类名,不能写错
五、上面的代码我们可以试试,如果我们将table写成tbale那么在编译时,计算机不能识别这个错误,可我们在用这个dll是,出现控件的呈现错误,
要避免这样的错误,除了我们写的时候需要很小心的检查,还有一个更有效的方法是
,比如writer.Write("<table style='width:287px;height:128px;border-width:0'>");
我们可以用.net里面的专门生成这些html标记的方法和属性
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "287px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "128px");
writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, "0");
writer.AddAttribute(HtmlTextWriterAttribute.Id, "mytable");
writer.RenderBeginTag(HtmlTextWriterTag.Table);
我们可以发现这些代码都是“反的”:先定义样式,属性,最后才定义我们要写的
个table标记。就是说,想给某个标记加属性,要先写属性,样式的语句,在写这个标记。最后我们需要用用RenderBeginTag来添加开始的标记。用writer.RenderEndTag();结束
如下面:
writer.AddAttribute(HtmlTextWriterAttribute.Value, "0");
writer.RenderBeginTag(HtmlTextWriterTag.Option);
writer.Write("Master");
writer.RenderEndTag();
六、下面我们看看状态的管理,即ViewState;
public override string NeiRong
{
get
{
return ViewState["neirong"] != null ? (string)ViewState["neirong"] : "支付方式";
}
set
{
ViewState["neirong"] = value;
}
}
我们就要用个ViewState来保存页面回传的值。因为现在的ASP.NET网站是基于http这种无状态协议的。在ASP.NET的我们提交的一个页面,虽然看起来是一样的,但是他们本质上已经不是同一个页面了。而是我们现在看见的页面获取了之前提交的那个页面的一些状态值。
浙公网安备 33010602011771号