以編程方式創建用戶控件(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);
Dim c1 As Control = LoadControl("pagelet7.ascx")
CType(c1, (Pagelet7VB)).Category = "business"
Page.Controls.Add(c1)
var c1:Control = LoadControl("pagelet7.ascx");
(Pagelet7JS(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 窗體頁使用(即使沒有實際聲明的用戶控件標記)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章