首页 新闻 会员 周边

关于数据控件的数据通过手工绑定或通过数据源控件绑定的问题

0
[已解决问题] 解决于 2011-02-20 20:26

最近发现数据控件(我这里用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将能保持其在回发前输入的值? 难道默认情况下在回发时数据源控件将不为数据控件提供数据?

何塞穆里尼奥的主页 何塞穆里尼奥 | 初学一级 | 园豆:126
提问于:2011-02-17 00:46
< >
分享
最佳答案
0

你可以参考一下 http://msdn.microsoft.com/zh-cn/library/ms178472(VS.80).aspx,看一下ASP.NET 页生命周期,Load事件是在你按钮事件之前,你重新绑定Repeater1,已经将TextBox的值全部清空了

而IsPostBack指示该页是否正为响应客户端回发而加载,!IsPostBack就表示回发时,不重新绑定数据,这样你的text值就保留下来了

彭汉生 | 小虾三级 |园豆:1233 | 2011-02-17 09:36
支持这种解释
artwl | 园豆:16736 (专家六级) | 2011-02-17 11:16
页面生命周期我也知道,但是我的问题是我里面的TextBox1虽然位于Repeater1里面,但是并没有绑定字段,为什么在Repeater1绑定数据的时候,会将TextBox的值全部清空。 而为什么使用数据源控件为Repeater1绑定数据却不会将TextBox的值全部清空。
何塞穆里尼奥 | 园豆:126 (初学一级) | 2011-02-17 14:15
很简单,如果你不绑定数据,有TextBox吗?明显TextBox是根据数据源动态生成的,每次绑定还会是原来的TextBox吗?
彭汉生 | 园豆:1233 (小虾三级) | 2011-02-17 14:17
我这个TextBox是这样的 <Repeater> <ItemTemplate> <asp:TextBox ID='TextBox1' Text="这里没有绑定字段"></TextBox> </ItemTemplate> </Repeater> 不是动态生成的,但每次绑定,也会失去值。
何塞穆里尼奥 | 园豆:126 (初学一级) | 2011-02-17 14:21
我说TextBox整个控件都是动态,你自己想吧
彭汉生 | 园豆:1233 (小虾三级) | 2011-02-17 14:26
那为何我用数据源控件为Repeater1提供数据时,TextBox会保留原值?
何塞穆里尼奥 | 园豆:126 (初学一级) | 2011-02-17 14:32
开始就说了,你加了 if(!IsPostBack) 嘛,你点击按钮时,回发时没有执行 Repeater1.DataSource=...; Repeater1.DataBind(); 不重新绑定,你的值就没有丢失
彭汉生 | 园豆:1233 (小虾三级) | 2011-02-17 14:34
用数据源控件为Repeater1提供数据 是下面这样的 而不是Repeater1.DataSource=...; Repeater1.DataBind(); 这样 <Repeater DataSourceID="数据源控件的ID"> <ItemTemplate> <asp:Label...确实Label要绑定一个字段才能有TextBox,所以TextBox是动态生成的.. <asp:TextBox ID='TextBox1' Text="这里没有绑定字段"></TextBox> </ItemTemplate> </Repeater>
何塞穆里尼奥 | 园豆:126 (初学一级) | 2011-02-17 14:43
TextBox是根据数据行动态生成的,有一行数据就有一个TextBox,不是要绑定字段的
彭汉生 | 园豆:1233 (小虾三级) | 2011-02-17 14:47
对 现在在你的细心解释下我明白了TextBox是根据数据行动态生成的,有一行数据就有一个TextBox,不是要绑定字段的,但<ItemTemplate> 里有东西绑定字段 但问题是如果用数据源控件为Repeater1提供数据时,回发后TextBox1并没有失去你在回发前给其输入的值,这一点与手工绑定不同,不知为什么。
何塞穆里尼奥 | 园豆:126 (初学一级) | 2011-02-17 14:52
你贴ItemTemplate出来
彭汉生 | 园豆:1233 (小虾三级) | 2011-02-17 15:03
<Repeater DataSourceID="数据源控件的ID"> <ItemTemplate> <asp:Label ID='Label1' Text='<%#Eval("某字段")%>'<asp:TextBox ID='TextBox1' Text="这里没有绑定字段"></TextBox> </ItemTemplate> </Repeater>
何塞穆里尼奥 | 园豆:126 (初学一级) | 2011-02-17 15:07
同样道理,数据源控件.Select()看看TextBox的值还有没有
彭汉生 | 园豆:1233 (小虾三级) | 2011-02-17 15:26
何塞穆里尼奥 | 园豆:126 (初学一级) | 2011-02-17 15:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册