zoukankan      html  css  js  c++  java
  • [CN.Text开发笔记]OnInit与运行期数据绑定

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

    public class MyControl : System.Web.UI.UserControl
        
    {
            
    private string _text="Text is not be set";
            
    public string Text
            
    {
                
    get
                
    {
                    
    return _text;
                }

                
    set
                
    {
                    _text
    =value;
                }

            }

            
            
    Web 窗体设计器生成的代码

            
    private void Page_Load(object sender, System.EventArgs e)
            
    {
                Response.Write(Text);
            }

        }


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

    然后我们在一个aspx页面中使用这个控件:
    <asp:Repeater id="Repeater1" runat="server">
                    
    <ItemTemplate>
                        
    <uc1:MyControl id="MyControl1" runat="server" Text='<%# "HelloWorld" %>'></uc1:MyControl>
                    
    </ItemTemplate>
                
    </asp:Repeater>

    private void Page_Load(object sender, System.EventArgs e)
            
    {
                ArrayList al
    =new ArrayList();
                al.Add(
    1);
                al.Add(
    2);
                Repeater1.DataSource
    =al;
                Repeater1.DataBind();
            }

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

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

    protected override void OnLoad(EventArgs e)
            
    {
                Response.Write(Text);
                
    base.OnLoad (e);
            }

    也就是说, Text是在OnInit之后,OnLoad之前被赋值的。
    这就说明Text='<%# "HelloWorld" %>'与Text="HelloWorld"执行的时间是不同的。所以我们在设计控件时,就要注意这一点,假如你想你写的控件支持运行期数据绑定,就避免在OnInit中处理相应的属性值。
  • 相关阅读:
    十二、curator recipes之双重屏障DoubleBarrier
    十一、curator recipes之联锁InterProcessMultiLock
    十、curator recipes之信号量InterProcessSemaphoreV2
    九、curator recipes之不可重入锁InterProcessSemaphoreMutex
    八、curator recipes之选举主节点LeaderSelector
    五、curator recipes之选举主节点Leader Latch
    ADO.net 数据库连接new SqlConnection、Open、Close、Dispose
    Java学习笔记【八、数据结构】
    Java学习笔记【七、时间、日期、数字】
    Java学习笔记【六、正则表达式】
  • 原文地址:https://www.cnblogs.com/dudu/p/48618.html
Copyright © 2011-2022 走看看