复合控件的开发心得

先还是看看这篇文章
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcondevelopingcompositecontrols.asp
开发复合控件跟开发用户控件有一些不同。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcompositecontrolvsusercontrol.asp

最近遇到一个问题:
在编辑web页面希望出现的是输入框,而在显示状态的时候,希望出现的Label来显示文字。
自己继承了一个Label完成这个要求
中间遇到了一些问题:

1 如果是开发复合控件,必须完成接口:System.Web.UI.INamingContainer interface
而这个接口并没有方法71_71.gif
. When a control implements INamingContainer, the ASP.NET page framework creates a new naming scope under that control, thus ensuring that the child controls have unique names in the hierarchical tree of controls
只是asp。net框架会创建新的命名范围,〔晕,什么意思?cry_smile.gif
根据我的理解,意思是它会为每个子控件创建唯一的ID来区别;
如果父控件的UniqueID是MyEditLabel1,则子控件的UniqueID是MyEditLabel1:_ctl0
ctl是control的缩写,今天才想明白。confused_smile.gif

2 在子控件未加载到父控件之前,子控件的UniqueID是空的,

None.gif myText  =   new  TextBox();
None.gif
// myText.UniqueID 为null
None.gif
this .Controls.Clear();
None.gif
this .Controls.Add(myText);
None.gif
// 此时myText.UniqueID 不为null
None.gif

None.gif

3 子控件之间传递值的方式,可以有两种,
一种是通过post后,viewstat来读取

None.gif myText.Text  =  (String)ViewState[myText.UniqueID];

而另一种则是;通过post后Request类的方法读取

None.gif if (System.Web.HttpContext.Current.Request[myLabel.UniqueID] != null )
None.gif                        myLabel.Text 
=  System.Web.HttpContext.Current.Request[myLabel.UniqueID];

update 12:42
4 如果是重写了GetDesignTimeHtml方法,
需要重新启动vs.net,才能在设计时显示出更改后的方法。

None.gif MyEditLabel d  =  (MyEditLabel) this .Component;
None.gif            
string  html  = "" ;
None.gif            
None.gif            
None.gif            
if (d.Width != Unit.Empty)
None.gif                html  
=  String.Format( " <input type=text style="width:{0}px" > " ,d.Width.Value);
None.gif            
else
None.gif                html  
=  String.Format( " <input type=text style="width:{0}px" > " , 80 );
None.gif
None.gif            
None.gif
//             html  = "<input type=text style="width:64px" >";
None.gif
        
None.gif            
return  html;

5. 控件创建的顺序
=============================
 CreateChildControls()
……》
页面的
 MyEditLabel2.EditEnable = false;
……》
控件的属性被更改
=============================
根据这个顺序,
如果属性被更改后要起作用,实际上在set之后还需要加载一次

None.gif public   override   string  Text
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                EnsureChildControls();
InBlock.gif                
if(myLabel!=null)
InBlock.gif                    text 
= myLabel.Text;
InBlock.gif                
if(myText!=null)
InBlock.gif                    text 
= myText.Text;
InBlock.gif                
return text;
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
InBlock.gif
InBlock.gif                text 
= value;
InBlock.gif                CreateChildControls();//重新调用一次
InBlock.gif                
InBlock.gif
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif    






 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值