问题描述
我现在在做一个留言板,显示页面那里在Repeater里镶嵌了几个控件,然后再用findcontrol索引里面控件的ID却始终找到为null,哪位高手知道哪里出错了?这是前台代码:<body><formid="form1"runat="server"><div><asp:LinkButtonID="LinkButton3"runat="server"Visible="false"><ahref="leaveword.aspx">我要留言 </a></asp:LinkButton><asp:LinkButtonID="LinkButton1"runat="server"Visible="false"><ahref="memberlogin.aspx">登录 </a></asp:LinkButton><asp:LinkButtonID="LinkButton2"runat="server"Visible="false"><ahref="login.aspx">注册</a></asp:LinkButton><br/><br/><asp:RepeaterID="Repeater1"runat="server"DataSourceID="SqlDataSource1"><ItemTemplate><tableid="table1"runat="server"class="style4"><tr><tdclass="style4">标题:<%#DataBinder.Eval(Container.DataItem,"title")%> </td><td><%#DataBinder.Eval(Container.DataItem,"name")%>于<%#DataBinder.Eval(Container.DataItem,"date")%>发表</td></tr><tr><tdcolspan="2">留言:<%#DataBinder.Eval(Container.DataItem,"word")%></td></tr><tr><tdcolspan="2"><asp:HyperLinkID="Button1"Visible="true"runat="server"NavigateUrl='<%#"?act=1&id="+Eval("id")%>'>查看回复</asp:HyperLink><asp:HyperLinkID="Button3"Visible="false"runat="server"NavigateUrl='<%#"?act=2&id="+Eval("id")%>'>收起回复</asp:HyperLink></td></tr><tr><td><asp:Panelrunat="server"ID="Panel1"visible="false"><tableid="table2"runat="server"class="style4"><tr><td><asp:TextBoxID="TextBox1"runat="server"Height="41px"TextMode="MultiLine"Width="1005px"></asp:TextBox></td></tr><tr><td><asp:ButtonID="Button2"runat="server"Text="回复"onclick="Button2_Click"CommandArgument='<%#DataBinder.Eval(Container.DataItem,"id")%>'CommandName="Reply"/></td></tr><tr><td><asp:RepeaterID="Repeater2"runat="server"><ItemTemplate><tableid="table3"runat="server"class="style4"><tr><td><%#DataBinder.Eval(Container.DataItem,"name")%>:<%#DataBinder.Eval(Container.DataItem,"word")%>(<%#DataBinder.Eval(Container.DataItem,"date")%>)</td></tr></table></ItemTemplate></asp:Repeater></td></tr></table></asp:Panel></td></tr></table><br/></ItemTemplate></asp:Repeater><asp:SqlDataSourceID="SqlDataSource1"runat="server"ConnectionString="<%$ConnectionStrings:leavewordConnectionString4%>"SelectCommand="SELECT*FROM[leaveword]"></asp:SqlDataSource></div></form></body>
这是后台代码:publicpartialclassshow:System.Web.UI.Page{protectedvoidPage_Load(objectsender,System.EventArgse){if(!IsPostBack){//intindex=((RepeaterItem)(senderasHyperLink).Parent).ItemIndex;PanelPanel1=(Panel)(this.Repeater1.FindControl("Panel1"));HyperLinkButton1=(HyperLink)(this.Repeater1.FindControl("Button1"));HyperLinkButton3=(HyperLink)(this.Repeater1.FindControl("Button3"));RepeaterRepeater2=(Repeater)(this.Repeater1.FindControl("Repeater2"));if(Session["membername"]==null){LinkButton1.Visible=true;LinkButton2.Visible=true;}else{LinkButton3.Visible=true;Button1.Visible=true;}stringact=Request.QueryString["act"];stringleavewordid=Request.QueryString["id"];stringstr1="DataSource=(local);InitialCatalog=leaveword;integratedsecurity=True";switch(act){case"1":SqlConnectionconn=newSqlConnection(str1);conn.Open();DataSetds2=newDataSet();stringstr2="SelectleavewordidFrom[reply]Whereleavewordid='"+leavewordid+"'";SqlDataAdapterda2=newSqlDataAdapter(str2,conn);da2.Fill(ds2,"t1");Repeater2.DataSource=ds2.Tables["t1"];Repeater2.DataBind();Panel1.Visible=true;Button1.Visible=false;Button3.Visible=true;conn.Close();break;case"2":Panel1.Visible=false;Button1.Visible=true;Button3.Visible=false;break;default:Panel1.Visible=false;Button1.Visible=false;Button3.Visible=false;break;}}}protectedvoidButton2_Click(objectsender,EventArgse){stringstr="DataSource=(local);InitialCatalog=leaveword;integratedsecurity=True";SqlConnectionconn=newSqlConnection(str);conn.ConnectionString=str;conn.Open();stringleavewordid=Request.QueryString["id"];TextBoxTextBox1=(TextBox)Repeater1.Items[0].FindControl("TextBox1");stringTextBox1_text=TextBox1.Text;stringname=Session["membername"].ToString();stringdate=System.DateTime.Now.ToString("yyyy-MM-ddhh:mm:ss");stringip=(HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=null&&HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=String.Empty)?HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]:HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];stringsql="Insertinto[reply](leavewordid,name,date,ip,word)values('"+leavewordid+"','"+name+"','"+date+"','"+ip+"','"+TextBox1_text+"')";SqlCommandcmd=newSqlCommand(sql,conn);cmd.ExecuteNonQuery();conn.Close();Response.Write("<scriptlanguage='javascript'>alert('回复成功!')</script>");Response.Redirect("show.aspx");}}
求教~~
解决方案
解决方案二:
是不是你的页面的或者面板的层级关系弄错误了?
解决方案三:
应该不是吧。。。我重新做过几次了,还一个一个做好再套进去的。。。
解决方案四:
你看你的名字Button1是否取正确了,,在页面看源码,,页面上是不是ID是否是Button1<asp:HyperLinkID="Button1"Visible="true"runat="server"NavigateUrl='<%#"?act=1&id="+Eval("id")%>'>查看回复</asp
解决方案五:
应该在databonuding中获取控件ID,
解决方案六:
同时把button榜定到dataupdateing实践中
解决方案七:
引用楼主crx0607的回复:
PanelPanel1=(Panel)(this.Repeater1.FindControl("Panel1"));HyperLinkButton1=(HyperLink)(this.Repeater1.FindControl("Button1"));.................
谁跟你说过findcontrol这样用的,你去找谁说理去!不会用findcontrol,说明你没有遇到过一个真正正规的asp.net的培训。findcontrol遇到INamingContainer接口就停止深度搜索了,也就是说从Repeater1根本不可能用findcontrol去找到Repeater.Item里边的内容,因为这个Item具有INamingContainer接口。你至少必须使用类似Repeater1.Item[3].FindControl(..)
这样的方法去找。不过我建议首先重视起这个事实,你还没有会用findcontrol。
解决方案八:
这个知识不属于什么艰深的知识,就是入门者应该知道的,而许多肤浅的入门上确连这个findcontrol的机制都没有单独说明。所以由于这恰好可以区分在学asp.net上的不同背景所以,以前我们招聘时用“是否懂得findcontrol方法的机制”作为一个非常重要的指标来考试asp.net应聘人员。
解决方案九:
用GridView来举例,从gw.Items[1].Cells[3].FindControl("abc")可以找到同一个Item中其它Cell(例如Cell[5])下的ID为abc的控件,但是Cell[3].Controls自身如果有一个用户控件的话里边的abc的控件却不能查到。另外GridView的运行时几乎每一行都可以有ID为abc的子控件,而且任何一行中Cells[3]下的用户控件中也可以有ID为abc的控件(你设计用户可能控件时肯定不知道将来它是否跟容器中某个子控件的ID相同)。如此,一个Repeater1中可能有上百个ID为abc的控件,你去执行findcontrol("abc")想找到某一个想象中的,这岂不是乱点鸳鸯谱了嘛。
解决方案十:
要用Repeater1.Items[3].FindControl("")这种形式去找,Items[3]对应的RepeaterItem是命名容器,FindControl寻找控件时不能穿越命名容器。
解决方案十一:
for循环rp来取
解决方案十二:
PanelPanel1=(Panel)(this.Repeater1.FindControl("Panel1"));HyperLinkButton1=(HyperLink)(this.Repeater1.FindControl("Button1"));HyperLinkButton3=(HyperLink)(this.Repeater1.FindControl("Button3"));RepeaterRepeater2=(Repeater)(this.Repeater1.FindControl("Repeater2"))这样肯定找不到的
解决方案十三:
引用6楼sp1234的回复:
引用楼主crx0607的回复:PanelPanel1=(Panel)(this.Repeater1.FindControl("Panel1"));HyperLinkButton1=(HyperLink)(this.Repeater1.FindControl("Button1"));.................谁跟你说过findcontrol这样用的,你去找……
不好意思,我只是刚学ASP.NET不久,但我之前是用for(inti=0;i<this.Repeater1.Items.Count;i++){var_item=this.Repeater1.Items[i];if(_item!=null){PanelPanel1=(Panel)_item.FindControl("Panel1");}}
这个找的,但在循环外面不能引用Panel1的值。。。
解决方案十四:
引用10楼kongwei521的回复:
for循环rp来取
用FOR的话在循环外面是获取不了FOR里面的值的,有什么方法可以从FOR外部获取FOR里面的值么?
解决方案十五:
新后台代码,但仍然不能控制Panel的显示。。。局部变量里我也找不到以上控件。。。晕。。。usingSystem;usingSystem.Web.UI;usingSystem.Data.SqlClient;usingSystem.Data;usingSystem.Web.UI.WebControls;usingSystem.Web;publicpartialclassshow:System.Web.UI.Page{protectedvoidPage_Load(objectsender,System.EventArgse){if(!IsPostBack){for(inti=0;i<Repeater1.Items.Count;i++){var_item1=Repeater1.Items[i].FindControl("Panel1");if(_item1!=null){PanelPanel1=(Panel)_item1;var_item2=Repeater1.Items[i].FindControl("Button1");if(_item2!=null){HyperLinkButton1=(HyperLink)_item2;var_item3=Repeater1.Items[i].FindControl("Button3");if(_item3!=null){HyperLinkButton3=(HyperLink)_item3;var_item4=Repeater1.Items[i].FindControl("Repeater2");if(_item4!=null){RepeaterRepeater2=(Repeater)_item4;if(Session["membername"]==null){LinkButton1.Visible=true;LinkButton2.Visible=true;}else{LinkButton3.Visible=true;Button1.Visible=true;}stringact=Request.QueryString["act"];stringleavewordid=Request.QueryString["id"];stringstr1="DataSource=(local);InitialCatalog=leaveword;integratedsecurity=True";switch(act){case"1":SqlConnectionconn=newSqlConnection(str1);conn.Open();DataSetds2=newDataSet();stringstr2="SelectleavewordidFrom[reply]Whereleavewordid='"+leavewordid+"'";SqlDataAdapterda2=newSqlDataAdapter(str2,conn);da2.Fill(ds2,"t1");Repeater2.DataSource=ds2.Tables["t1"];Repeater2.DataBind();Panel1.Visible=true;Button1.Visible=false;Button3.Visible=true;conn.Close();break;case"2":Panel1.Visible=false;Button1.Visible=true;Button3.Visible=false;break;default://Panel1.Visible=false;//Button1.Visible=false;//Button3.Visible=false;break;}}}}}}}}protectedvoidButton2_Click(objectsender,EventArgse){stringstr="DataSource=(local);InitialCatalog=leaveword;integratedsecurity=True";SqlConnectionconn=newSqlConnection(str);conn.ConnectionString=str;conn.Open();stringleavewordid=Request.QueryString["id"];TextBoxTextBox1=(TextBox)Repeater1.Items[0].FindControl("TextBox1");stringTextBox1_text=TextBox1.Text;stringname=Session["membername"].ToString();stringdate=System.DateTime.Now.ToString("yyyy-MM-ddhh:mm:ss");stringip=(HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=null&&HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=String.Empty)?HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]:HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];stringsql="Insertinto[reply](leavewordid,name,date,ip,word)values('"+leavewordid+"','"+name+"','"+date+"','"+ip+"','"+TextBox1_text+"')";SqlCommandcmd=newSqlCommand(sql,conn);cmd.ExecuteNonQuery();conn.Close();Response.Write("<scriptlanguage='javascript'>alert('回复成功!')</script>");Response.Redirect("show.aspx");}}
解决方案:
你就不会把Panel1声明在外面的啊?PanelPanel1;for(inti=0;i<this.Repeater1.Items.Count;i++){var_item=this.Repeater1.Items[i];if(_item!=null){Panel1=(Panel)_item.FindControl("Panel1");}}
解决方案:
引用15楼dalmeeme的回复:
你就不会把Panel1声明在外面的啊?PanelPanel1;for(inti=0;i<this.Repeater1.Items.Count;i++){var_item=this.Repeater1.Items[i];if(_item!=null){Panel1=(Panel)_item.FindControl(……
声明在外面FOR里面赋值以后外部那个也是获取不了FOR里面赋的值啊~