自定义控件的构建(4)

    在自定义控件的构建(3)中,我们构建了组合控件,实际上,在大部分构建组合控件时,同时会指定其子控件的布局

构建混合控件

  下面的代码是设计为一个登录控件,同时指定其布局

 
 
 namespace MyCompositeControls
{    
    /// 
    /// 构建混合控件
   /// 
    public class Login : CompositeControl
    {
        private TextBox txtUserName;
        private TextBox txtPassword;
        public string UserName
        {
            get 
            {
                EnsureChildControls();
                return txtUserName.Text;
            }
            set
            {
                EnsureChildControls();
               txtUserName.Text=value;
            }
        }
        public string Password
        {
            get
            {
                EnsureChildControls();
                return txtPassword.Text;
            }
            set
            {
                EnsureChildControls();
                txtPassword.Text = value;
            }
        }
        protected override void CreateChildControls()
        {
            txtUserName = new TextBox();
            txtUserName.ID = "txtUserName";
            this.Controls.Add(txtUserName);
            txtPassword = new TextBox();
            txtPassword.ID = "txtPassword";
            this.Controls.Add(txtPassword);
        }
        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.AddAttribute(HtmlTextWriterAttribute.For, txtUserName.ClientID);
            writer.RenderBeginTag(HtmlTextWriterTag.Label);
            writer.Write("User Name:");
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            txtUserName.RenderControl(writer);
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.AddAttribute(HtmlTextWriterAttribute.For, txtPassword.ClientID);
            writer.RenderBeginTag(HtmlTextWriterTag.Label);
            writer.Write("Password:");
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            txtPassword.RenderControl(writer);
            writer.RenderEndTag();
            writer.RenderEndTag();
        }
        protected override HtmlTextWriterTag TagKey
        {
            get { return HtmlTextWriterTag.Table; }
        }
}
    }
 
 
 可以看到RenderContents()内部被重写为两个TextBox的布局顺序,TextBox是通过调用各自的RenderContents()生成的

运行后查看界面源码

 
 
 <table id="Login1">
  <tr>
    <td><label for="Login1_txtUserName">User Name:label>td><td><input name="Login1$txtUserName" type="text" id="Login1_txtUserName" />td>
  tr><tr>
    <td><label for="Login1_txtPassword">Password:label>td><td><input name="Login1$txtPassword" type="text" id="Login1_txtPassword" />td>
  tr>
table>    

可见TextBox是生成在一个表格中的。

默认的RenderContents()只调用每个子控件的RenderContents(),通过重写控件的RenderContents()可以对子控件的布局进行更多的控制

下面的代码对RenderContents()进行了改写,实现

对控件进行布局的,因为在Web标准中,更支持对
的使用
 
   
 
   
 //重写布局
        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.AddStyleAttribute("float", "left");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "3px");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.AddAttribute(HtmlTextWriterAttribute.For, txtUserName.ClientID);
            writer.RenderBeginTag(HtmlTextWriterTag.Label);
            writer.Write("User Name:");
            writer.RenderEndTag();
            writer.RenderEndTag();       
           
            writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "3px");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.AddAttribute(HtmlTextWriterAttribute.For, txtPassword.ClientID);
            writer.RenderBeginTag(HtmlTextWriterTag.Label);
            writer.Write(" Password:");
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderEndTag();
           
            writer.AddStyleAttribute("float", "left");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "3px");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            txtUserName.RenderBeginTag(writer);        
            writer.RenderEndTag();
           
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "3px");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            txtPassword.RenderBeginTag(writer);
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.Write("
");
        }
        protected override HtmlTextWriterTag TagKey
        {
            get { return HtmlTextWriterTag.Div; }
        }
看看页面的Html生成
 
   
 
 
   
<div id="LoginStandard1">
  <div style="float:left;">
    <div style="padding:3px;">
      <label for="LoginStandard1_txtUserName">User Name:label>
    div><div style="padding:3px;">
      <label for="LoginStandard1_txtPassword"> Password:label>
    div>
  div>
<div style="float:left;">
       <div style="padding:3px;">
      <input name="LoginStandard1$txtUserName" type="text" id="LoginStandard1_txtUserName" /><div>
        <div style="padding:3px;">
          <input name="LoginStandard1$txtPassword" type="text" id="LoginStandard1_txtPassword" />
        div>
<br style='clear:left'/>
  div>
尽管如此,在标准控件中Ms还是采用了Html表格布局方式。

 

 

本篇参考了《ASP.NET 3.5(揭秘) 卷2》

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25284529/viewspace-684566/,如需转载,请注明出处,否则将追究法律责任。

user_pic_default.png
请登录后发表评论 登录
全部评论
<%=items[i].createtime%>

<%=items[i].content%>

<%if(items[i].items.items.length) { %>
<%for(var j=0;j
<%=items[i].items.items[j].createtime%> 回复

<%=items[i].items.items[j].username%>   回复   <%=items[i].items.items[j].tousername%><%=items[i].items.items[j].content%>

<%}%> <%if(items[i].items.total > 5) { %>
还有<%=items[i].items.total-5%>条评论 ) data-count=1 data-flag=true>点击查看
<%}%>
<%}%>
<%}%>

转载于:http://blog.itpub.net/25284529/viewspace-684566/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值