[CN.Text开发笔记]OnInit与运行期数据绑定

时间:2022-12-28 23:16:39

    今天在开发CN.Text的过程中,我遇到了这样一个问题:当我通过<%# DataBinder.EvalContainer.DataItem,"Title"%>给一个控件的属性赋值时, 运行结果却显示这个属性没有被赋值,而我将<%# DataBinder.EvalContainer.DataItem,"Title"%>改成普通的字符串却很正常。这个属性是很简单的一个属性,它表示控件的标题,在控件中只要显示这个属性值就行了。.Text中提供的这个控件是在OnInit中显示这个属性值的。而我只要将显示属性值的代码移至OnPreRender(EventArgs e)或者OnLoad(EventArgs e)中问题就解决了。
    下面我用一个简单的例子详细描述一下这个问题。
    首先,我们定义一个简单的用户控件:

[CN.Text开发笔记]OnInit与运行期数据绑定public   class  MyControl : System.Web.UI.UserControl
[CN.Text开发笔记]OnInit与运行期数据绑定[CN.Text开发笔记]OnInit与运行期数据绑定    
{
[CN.Text开发笔记]OnInit与运行期数据绑定        
private string _text="Text is not be set";
[CN.Text开发笔记]OnInit与运行期数据绑定        
public string Text
[CN.Text开发笔记]OnInit与运行期数据绑定[CN.Text开发笔记]OnInit与运行期数据绑定        
{
[CN.Text开发笔记]OnInit与运行期数据绑定            
get
[CN.Text开发笔记]OnInit与运行期数据绑定[CN.Text开发笔记]OnInit与运行期数据绑定            
{
[CN.Text开发笔记]OnInit与运行期数据绑定                
return _text;
[CN.Text开发笔记]OnInit与运行期数据绑定            }

[CN.Text开发笔记]OnInit与运行期数据绑定            
set
[CN.Text开发笔记]OnInit与运行期数据绑定[CN.Text开发笔记]OnInit与运行期数据绑定            
{
[CN.Text开发笔记]OnInit与运行期数据绑定                _text
=value;
[CN.Text开发笔记]OnInit与运行期数据绑定            }

[CN.Text开发笔记]OnInit与运行期数据绑定        }

[CN.Text开发笔记]OnInit与运行期数据绑定        
[CN.Text开发笔记]OnInit与运行期数据绑定[CN.Text开发笔记]OnInit与运行期数据绑定        
Web 窗体设计器生成的代码
[CN.Text开发笔记]OnInit与运行期数据绑定
[CN.Text开发笔记]OnInit与运行期数据绑定        
private void Page_Load(object sender, System.EventArgs e)
[CN.Text开发笔记]OnInit与运行期数据绑定[CN.Text开发笔记]OnInit与运行期数据绑定        
{
[CN.Text开发笔记]OnInit与运行期数据绑定            Response.Write(Text);
[CN.Text开发笔记]OnInit与运行期数据绑定        }

[CN.Text开发笔记]OnInit与运行期数据绑定    }


这个控件很简单,就是将属性Text的值显示出来。

然后我们在一个aspx页面中使用这个控件:
[CN.Text开发笔记]OnInit与运行期数据绑定< asp:Repeater  id ="Repeater1"  runat ="server" >
[CN.Text开发笔记]OnInit与运行期数据绑定                
< ItemTemplate >
[CN.Text开发笔记]OnInit与运行期数据绑定                    
< uc1:MyControl  id ="MyControl1"  runat ="server"  Text ='<%#  "HelloWorld" % > '> </ uc1:MyControl >
[CN.Text开发笔记]OnInit与运行期数据绑定                
</ ItemTemplate >
[CN.Text开发笔记]OnInit与运行期数据绑定            
</ asp:Repeater >

[CN.Text开发笔记]OnInit与运行期数据绑定private   void  Page_Load( object  sender, System.EventArgs e)
[CN.Text开发笔记]OnInit与运行期数据绑定[CN.Text开发笔记]OnInit与运行期数据绑定        
{
[CN.Text开发笔记]OnInit与运行期数据绑定            ArrayList al
=new ArrayList();
[CN.Text开发笔记]OnInit与运行期数据绑定            al.Add(
1);
[CN.Text开发笔记]OnInit与运行期数据绑定            al.Add(
2);
[CN.Text开发笔记]OnInit与运行期数据绑定            Repeater1.DataSource
=al;
[CN.Text开发笔记]OnInit与运行期数据绑定            Repeater1.DataBind();
[CN.Text开发笔记]OnInit与运行期数据绑定        }

运行代码,结果当然是正常的。
现在我们将Response.Write(Text);移到OnInit中
[CN.Text开发笔记]OnInit与运行期数据绑定override   protected   void  OnInit(EventArgs e)
[CN.Text开发笔记]OnInit与运行期数据绑定[CN.Text开发笔记]OnInit与运行期数据绑定        
{
[CN.Text开发笔记]OnInit与运行期数据绑定            
//
[CN.Text开发笔记]OnInit与运行期数据绑定            
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
[CN.Text开发笔记]OnInit与运行期数据绑定            
//
[CN.Text开发笔记]OnInit与运行期数据绑定
            Response.Write(Text);
[CN.Text开发笔记]OnInit与运行期数据绑定            InitializeComponent();
[CN.Text开发笔记]OnInit与运行期数据绑定            
base.OnInit(e);
[CN.Text开发笔记]OnInit与运行期数据绑定            
[CN.Text开发笔记]OnInit与运行期数据绑定            
[CN.Text开发笔记]OnInit与运行期数据绑定        }

运行结果却显示“Text is not be set”, 在执行OnInit时, Text还没有被赋值。而我们只要将Response.Write(Text);移至OnLoad中就能正常显示。

[CN.Text开发笔记]OnInit与运行期数据绑定protected   override   void  OnLoad(EventArgs e)
[CN.Text开发笔记]OnInit与运行期数据绑定[CN.Text开发笔记]OnInit与运行期数据绑定        
{
[CN.Text开发笔记]OnInit与运行期数据绑定            Response.Write(Text);
[CN.Text开发笔记]OnInit与运行期数据绑定            
base.OnLoad (e);
[CN.Text开发笔记]OnInit与运行期数据绑定        }

也就是说, Text是在OnInit之后,OnLoad之前被赋值的。
这就说明Text='<%# "HelloWorld" %>'与Text="HelloWorld"执行的时间是不同的。所以我们在设计控件时,就要注意这一点,假如你想你写的控件支持运行期数据绑定,就避免在OnInit中处理相应的属性值。