问题描述
声明了全局变量,在page_load中赋予某个值,但是Repeater的ItemDataBound读取不到新的值publicstringstrProductTypeID="a";protectedvoidPage_Load(objectsender,EventArgse){strProductTypeID="temp";}protectedvoidrptProductBrand_ItemDataBound(objectsender,RepeaterItemEventArgse){Response.Write(strProductTypeID);}为什么显示的内容为a,不是page_load中赋值的temp呢,要在ItemDataBound中使用全局变量怎么办啊
解决方案
解决方案二:
在关键位置打几个断点就知道了
解决方案三:
如果就你这代码的话,不可能会有这种情况,如果你这是多次页面响应,那你可以试着将你的全局变量改为viewstate来保持
解决方案四:
数据绑定事件本身就是在Page_Load之前,当然不会执行赋值了#2说的我没懂,每个页面都是一个类,无论打开执行多少次这个页面,都不会影响到这个变量值,为什么需要viewstate保存呢?
解决方案五:
补充3楼至少要在OnInit事件之前,也就是说OnPreInit事件完成赋值也可以先不绑定,然后在Page_Load中对控件进行数据绑定,从而引发事件
解决方案六:
stringTableSwitch="Root";protectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){//设置初始排序项目和方向ViewState["SortOrder"]="Format";ViewState["OrderDire"]="DESC";//height=//RandomName();bind();}}
我这样声明的TableSwitch都没有问题,可以在这个CS里面通用。
解决方案七:
首先Page_Load运行优先于ItemDataBound事件。楼上#3楼说法是错误的。其次,你没有运行到strProductTypeID="temp";只有2种可能。第一:由于ItemDataBound事件是在数据绑定时才出发的(也就是Repeater1.DataBind();时出发)。换句话说,你在Page_load事件里增加Repeater1.DataBind();,那么在Repeater1.DataBind();此行之后的代码,会在ItemDataBound事件执行完,才继续执行page_load的其他代码。因此,你可能是将strProductTypeID="temp";写在了DataBind事件之后了。第二:可能你根本没有DataBind事件,所以也就不会出发strProductTypeID="temp";,那么这样的话,你的itemdatabound应该也不会触发了。附上我的测试代码前台:<asp:RepeaterID="Repeater1"runat="server"OnItemDataBound="Repeater1_ItemDataBound"><ItemTemplate><asp:TextBoxID="TextBox1"runat="server"></asp:TextBox></ItemTemplate></asp:Repeater>
后台:publicstringa="123";privatevoidPage_Load(objectsender,EventArgse){a="234566";//写在Repeater1.DataBind();之前,就会在ItemDataBound之前运行。DataTabledt=newDataTable();DataRowdr;//Definethecolumnsofthetable.dt.Columns.Add(newDataColumn("IntegerValue",typeof(Int32)));dt.Columns.Add(newDataColumn("StringValue",typeof(String)));dt.Columns.Add(newDataColumn("CurrencyValue",typeof(double)));//Populatethetablewithsamplevalues.for(inti=0;i<9;i++){dr=dt.NewRow();dr[0]=i;dr[1]="Descriptionforitem"+i.ToString();dr[2]=1.23*(i+1);dt.Rows.Add(dr);}DataViewdv=newDataView(dt);Repeater1.DataSource=dt;Repeater1.DataBind();a="234566";//写在Repeater1.DataBind();之后,就会在ItemDataBound之后才运行。}protectedvoidRepeater1_ItemDataBound(objectsender,RepeaterItemEventArgse){if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem){TextBoxPriceLabel=(TextBox)e.Item.FindControl("TextBox1");PriceLabel.Text=a;}}
解决方案八:
赋初值应该在Page_Init,目测你这里不需要重写OnInit(),在Init事件触发前赋值
解决方案九:
不要以为MS搞个Init事件是摆设,用处大着呢