以编程方式创建用户控件(4)

 

正如可以编程方式创建普通的服务器控件一样,也可以这样创建用户控件。页的 LoadControl 方法用于加载用户控件,并传递用户控件源文件的虚拟路径:

 

<script language="JavaScript" type="text/javascript"> function doClick(index, numTabs, id) { document.all("tab" + id, index).className = "tab"; for (var i=1; i < numTabs; i++) { document.all("tab" + id, (index + i) % numTabs).className = "backtab"; } document.all("code" + id, index).style.display = ""; for (var j=1; j < numTabs; j++) { document.all("code" + id, (index + j) % numTabs).style.display = "none"; } } </script>

Control c1 = LoadControl("pagelet7.ascx");
((Pagelet7CS)c1).Category = "business";
Page.Controls.Add(c1);
C# VB JScript  

用户控件的类型由 Control 指令上的 ClassName 属性决定。例如,以文件名“pagelet7.ascx”保存的用户控件被分配强类型“Pagelet7CS”,如下所示:

<%@ Control ClassName="Pagelet7CS" %>

由于 LoadControl 方法返回 System.Web.UI.Control 类型,因此必须将其转换为适当的强类型以便设置控件的各属性。最后,用户控件被添加到基页的 ControlCollection

<% @ Register TagPrefix="Acme" TagName="BookList" Src="pagelet7.ascx"  %>

< html >
 

    
< script  language ="C#"  runat ="server" >

        
void Page_Load(Object sender, EventArgs E) {

            Page.Controls.Add(
new HtmlGenericControl("hr"));

            Control c1 
= LoadControl("pagelet7.ascx");
            ((Pagelet7CS)c1).Category 
= "business";
            Page.Controls.Add(c1);

            Page.Controls.Add(
new HtmlGenericControl("hr"));

            Control c2 
= LoadControl("pagelet7.ascx");
            ((Pagelet7CS)c2).Category 
= "trad_cook";
            Page.Controls.Add(c2);

            Page.Controls.Add(
new HtmlGenericControl("hr"));

            Control c3 
= LoadControl("pagelet7.ascx");
            ((Pagelet7CS)c3).Category 
= "mod_cook";
            Page.Controls.Add(c3);
        }


    
</ script >

< body  style ="font: 10.5pt 宋体" >

  
< h3 > 以编程方式创建用户控件 </ h3 >

</ body >
</ html >

 

自定义控件:

 

<% @ Control ClassName = " Pagelet7CS "   %>
<% @ Import Namespace = " System.Data "   %>
<% @ Import Namespace = " System.Data.SqlClient "   %>

< script language = " C# "  runat = " server " >

    
private  String _category  =   "" ;

    
public  String Category  {

      
get {
        
return _category;
      }

      
set {
          _category 
= value;
          SqlConnection myConnection 
= new SqlConnection("server=(local)/NetSDK;database=pubs;Trusted_Connection=yes");
          SqlDataAdapter myCommand 
= new SqlDataAdapter("select * from Titles where type='" + _category + "'", myConnection);

          DataSet ds 
= new DataSet();
          myCommand.Fill(ds, 
"Titles");

          MyDataList.DataSource 
= ds.Tables["Titles"].DefaultView;
          MyDataList.DataBind();
      }

    }


</ script >

< span style = " font: 12pt 宋体 " > 类别: <%= Category %></ span >

< ASP:DataList id = " MyDataList "  BorderWidth = " 0 "  RepeatColumns = " 2 "  runat = " server " >

    
< ItemTemplate >

      
< table cellpadding = 10  style = " font: 10.5pt 宋体 " >
        
< tr >
          
< td valign = " top " >
            
< img align = " top "  src = ' <%# DataBinder.Eval(Container.DataItem, "title_id", "/quickstart/aspplus/images/title-{0}.gif") %> '   >
          
</ td >
          
< td valign = " top " >
            
< b > 书名: </ b ><% # DataBinder.Eval(Container.DataItem,  " title " %>< br >
            
< b > 类别: </ b ><% # DataBinder.Eval(Container.DataItem,  " type " %>< br >
            
< b > 出版商 ID: </ b ><% # DataBinder.Eval(Container.DataItem,  " pub_id " %>< br >
            
< b > 价格: </ b ><% # DataBinder.Eval(Container.DataItem,  " price " " $ {0} " %>
          
</ td >
        
</ tr >
      
</ table >

    
</ ItemTemplate >

</ ASP:DataList >

 

重要说明 只有当为用户控件包括了 Register 指令时,用户控件的强类型才能由包含 Web 窗体页使用(即使没有实际声明的用户控件标记)。 本节小结

 
  1. 用户控件使开发人员能够使用编写 Web 窗体页的相同编程技巧轻松地定义自定义控件。
  2. 作为约定,用 .ascx 文件扩展名指示这样的控件。这样可以确保用户控件文件不能作为独立的 Web 窗体页执行。
  3. 用户控件通过 Register 指令包括在另一 Web 窗体页中,该指令指定 TagPrefixTagNameSrc location
  4. 注册了用户控件后,可以像普通的服务器控件那样将用户控件标记放置在 Web 窗体页中(包括 runat="server" 属性)。
  5. 在包含 Web 窗体页中将用户控件的公共字段、属性和方法提升为该控件的公共属性(标记属性)和方法。
  6. 用户控件参与每个请求的整个执行生存期,并且可以处理自己的事件,封装来自包含 Web 窗体页的一些页逻辑。
  7. 用户控件不应包含任何窗体控件,而应依靠其包含 Web 窗体页在必要时包括窗体控件。
  8. 可以使用 System.Web.UI.Page 类的 LoadControl 方法以编程方式创建用户控件。用户控件的类型由 ASP.NET 运行库决定,遵循约定文件名_扩展名
  9. 只有当为用户控件包括了 Register 指令时,用户控件的强类型才能由包含 Web 窗体页使用(即使没有实际声明的用户控件标记)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值