温故而知新

.net相关

导航

自定义控件一、基本简单的开发,局限于产生简单的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的我们提交的一个页面,虽然看起来是一样的,但是他们本质上已经不是同一个页面了。而是我们现在看见的页面获取了之前提交的那个页面的一些状态值。

 

posted on 2008-11-16 00:17  业余程序猿  阅读(438)  评论(0)    收藏  举报