最近发现数据控件(我这里用Repeater)如果通过手工绑定一个数据源的话,如果回发时又一次绑定数据的话该数据控件里的服务器控件将不能保存其控件状态,大致代码如下:(Repeater控件内的TextBox1(TextBox1并没有绑定数据,只是在Repeater控件内),用Label1来获取回发后TextBox1的值)
protected void Page_Load(object sender,EventArgs e)
{
  ......这里省略了获取数据的代码
  Repeater1.DataSource=...;
  Repeater1.DataBind();
}
protected void Button1_Click(object sender,EventArgs e)
{
  string str="";
  foreach(RepeaterItem item in Repeater1.Items)
   {
     str+=((TextBox)item.FindControl("TextBox1")).Text; //获取回发后TextBox1的值 
   }
  Label1.text=str;
}
得到的结果很明确,就是Repeater1控件内的TextBox1在网页回发后,如果Repeater1在回发时绑定的话,TextBox1将不能保持其在回发前输入的值,如果Repeater1在回发时不绑定的话,则TextBox1将能保持其在回发前输入的值,即改成如下代码:
protected void Page_Load(object sender,EventArgs e)
{
  if(!IsPostBack)
  {
  ......这里省略了获取数据的代码
  Repeater1.DataSource=...;
  Repeater1.DataBind();
  }
}
protected void Button1_Click(object sender,EventArgs e)
{
  string str="";
  foreach(RepeaterItem item in Repeater1.Items)
   {
     str+=((TextBox)item.FindControl("TextBox1")).Text; //获取回发后TextBox1的值 
   }
  Label1.text=str;
}
如果改成数据源控件提供数据的话,则TextBox1将能保持其在回发前输入的值,也就是和第2种情况一样。
问题:
第1种情况下的TextBox1并没有绑定数据,为什么在Repeater1在回发时绑定数据后不能保存其自身的状态(即不能保持其在回发前输入的值)?
数据源控件提供数据的情况下是在页面生命周期的哪个阶段为数据源控件提供数据的? 为什么这种情况下TextBox1将能保持其在回发前输入的值? 难道默认情况下在回发时数据源控件将不为数据控件提供数据?

解决方案 »

  1.   

    我这个TextBox是这样的 <Repeater> 
    <ItemTemplate> 
    <asp:TextBox ID='TextBox1' Text="这里没有绑定字段"></TextBox> 
    </ItemTemplate> 
    </Repeater> 
    不是动态生成的,但每次绑定,也会失去值。
      

  2.   

    错了TextBox虽然没有绑定字段,但它也是动态生成的,所以每次绑定都会恢复到原来的状态,如下:
    <Repeater> 
    <ItemTemplate>
     <asp:Label...确实Label要绑定一个字段才能有TextBox,所以TextBox是动态生成的..
     <asp:TextBox ID='TextBox1' Text="这里没有绑定字段"></TextBox> 
    </ItemTemplate>
     </Repeater> 
    但为何用数据源控件为Repeater1提供数据时,TextBox会保留原值?
    <Repeater DataSourceID="数据源控件的ID"> 
    <ItemTemplate> 
    <asp:Label...确实Label要绑定一个字段才能有TextBox,所以TextBox是动态生成的.. 
    <asp:TextBox ID='TextBox1' Text="这里没有绑定字段"></TextBox> 
    </ItemTemplate> 
    </Repeater>
      

  3.   

    Look Here:http://home.cnblogs.com/q/22383/