最近发现数据控件(我这里用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将能保持其在回发前输入的值? 难道默认情况下在回发时数据源控件将不为数据控件提供数据?
你可以参考一下 http://msdn.microsoft.com/zh-cn/library/ms178472(VS.80).aspx,看一下ASP.NET 页生命周期,Load事件是在你按钮事件之前,你重新绑定Repeater1,已经将TextBox的值全部清空了
而IsPostBack指示该页是否正为响应客户端回发而加载,!IsPostBack就表示回发时,不重新绑定数据,这样你的text值就保留下来了