急求!控件镶嵌的findcontrol问题
我现在在做一个留言板,显示页面那里在Repeater里镶嵌了几个控件,然后再用findcontrol索引里面控件的ID却始终找到为null,哪位高手知道哪里出错了?这是前台代码:
<body>
<form id="form1" runat="server">
<div>
<asp:LinkButton ID="LinkButton3" runat="server" Visible="false"><a href="leaveword.aspx">我要留言 </a></asp:LinkButton>
<asp:LinkButton ID="LinkButton1" runat="server" Visible="false"><a href="memberlogin.aspx">登录 </a></asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" Visible="false"><a href="login.aspx">注册</a></asp:LinkButton>
<br />
<br />
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
<ItemTemplate>
<table id="table1" runat="server" class="style4">
<tr>
<td class="style4">
标题:<%# DataBinder.Eval(Container.DataItem,"title") %> </td>
<td>
<%# DataBinder.Eval(Container.DataItem,"name") %>于<%# DataBinder.Eval(Container.DataItem,"date") %>发表</td>
</tr>
<tr>
<td colspan="2">
留言:<%# DataBinder.Eval(Container.DataItem,"word") %></td>
</tr>
<tr>
<td colspan="2">
<asp:HyperLink ID="Button1" Visible="true" runat="server" NavigateUrl='<%#"?act=1&id="+Eval("id")%>' >查看回复</asp:HyperLink>
<asp:HyperLink ID="Button3" Visible="false" runat="server" NavigateUrl='<%#"?act=2&id="+Eval("id")%>'>收起回复</asp:HyperLink>
</td>
</tr>
<tr>
<td>
<asp:Panel runat="server" ID="Panel1" visible="false">
<table id="table2" runat="server" class="style4" >
<tr>
<td>
<asp:TextBox ID="TextBox1" runat="server" Height="41px" TextMode="MultiLine" Width="1005px"></asp:TextBox></td>
</tr>
<tr>
<td>
<asp:Button ID="Button2" runat="server" Text="回复" onclick="Button2_Click" CommandArgument = '<%# DataBinder.Eval(Container.DataItem,"id") %>' CommandName="Reply"/></td>
</tr>
<tr>
<td>
<asp:Repeater ID="Repeater2" runat="server" >
<ItemTemplate>
<table id="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:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:leavewordConnectionString4 %>"
SelectCommand="SELECT * FROM [leaveword]"></asp:SqlDataSource>
</div>
</form>
</body>
这是后台代码:
public partial class show : System.Web.UI.Page
{
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
//int index = ((RepeaterItem)(sender as HyperLink).Parent).ItemIndex;
Panel Panel1 = (Panel)(this.Repeater1.FindControl("Panel1"));
HyperLink Button1 = (HyperLink)(this.Repeater1.FindControl("Button1"));
HyperLink Button3 = (HyperLink)(this.Repeater1.FindControl("Button3"));
Repeater Repeater2 = (Repeater)(this.Repeater1.FindControl("Repeater2"));
if (Session["membername"] == null)
{
LinkButton1.Visible = true;
LinkButton2.Visible = true;
}
else
{
LinkButton3.Visible = true;
Button1.Visible = true;
}
string act = Request.QueryString["act"];
string leavewordid = Request.QueryString["id"];
string str1 = "Data Source=(local);Initial Catalog=leaveword;integrated security=True";
switch (act)
{
case "1":
SqlConnection conn = new SqlConnection(str1);
conn.Open();
DataSet ds2 = new DataSet();
string str2 = "Select leavewordid From [reply] Where leavewordid='" + leavewordid + "'";
SqlDataAdapter da2 = new SqlDataAdapter(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;
}
}
}
protected void Button2_Click(object sender, EventArgs e)
{
string str = "Data Source=(local);Initial Catalog=leaveword;integrated security=True";
SqlConnection conn = new SqlConnection(str);
conn.ConnectionString = str;
conn.Open();
string leavewordid = Request.QueryString["id"];
TextBox TextBox1 = (TextBox)Repeater1.Items[0].FindControl("TextBox1");
string TextBox1_text = TextBox1.Text;
string name = Session["membername"].ToString();
string date = System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
string ip = (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"];
string sql = "Insert into [reply] (leavewordid,name,date,ip,word) values ('" + leavewordid + "','" + name + "','" + date + "','" + ip + "','" + TextBox1_text + "')";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
Response.Write("<script language='javascript'>alert('回复成功!')</script>");
Response.Redirect("show.aspx");
}
}
求教~~ --------------------编程问答--------------------
是不是你的 页面的 或者面板的 层级关系 弄错误了? --------------------编程问答-------------------- 应该不是吧。。。我重新做过几次了,还一个一个做好再套进去的。。。 --------------------编程问答-------------------- 你看你的名字Button1是否取正确了,,在页面看源码,,页面上是不是ID是否是Button1
<asp:HyperLink ID="Button1" Visible="true" runat="server" NavigateUrl='<%#"?act=1&id="+Eval("id")%>' >查看回复</asp
百度
--------------------编程问答-------------------- 应该在databonuding中获取控件ID, --------------------编程问答-------------------- 同时把button榜定到dataupdateing实践中 --------------------编程问答--------------------
谁跟你说过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来取 --------------------编程问答-------------------- Panel Panel1 = (Panel)(this.Repeater1.FindControl("Panel1"));
HyperLink Button1 = (HyperLink)(this.Repeater1.FindControl("Button1"));
HyperLink Button3 = (HyperLink)(this.Repeater1.FindControl("Button3"));
Repeater Repeater2 = (Repeater)(this.Repeater1.FindControl("Repeater2"))
这样肯定找不到的 --------------------编程问答--------------------
不好意思,我只是刚学ASP.NET不久,但我之前是用
for (int i = 0; i < this.Repeater1.Items.Count; i++)
{
var _item = this.Repeater1.Items[i];
if (_item != null)
{
Panel Panel1 = (Panel)_item.FindControl("Panel1"); }
}
这个找的,但在循环外面不能引用Panel1的值。。。 --------------------编程问答--------------------
用FOR的话在循环外面是获取不了FOR里面的值的,有什么方法可以从FOR外部获取FOR里面的值么? --------------------编程问答-------------------- 新后台代码,但仍然不能控制Panel的显示。。。局部变量里我也找不到以上控件。。。晕。。。
--------------------编程问答-------------------- 你就不会把Panel1声明在外面的啊?
using System;
using System.Web.UI;
using System.Data.SqlClient;
using System.Data;
using System.Web.UI.WebControls;
using System.Web;
public partial class show : System.Web.UI.Page
{
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
for (int i = 0; i < Repeater1.Items.Count; i++)
{
var _item1 = Repeater1.Items[i].FindControl("Panel1");
if (_item1 != null)
{ Panel Panel1 = (Panel)_item1;
var _item2 = Repeater1.Items[i].FindControl("Button1");
if (_item2 != null)
{ HyperLink Button1 = (HyperLink)_item2;
var _item3 = Repeater1.Items[i].FindControl("Button3");
if (_item3 != null)
{ HyperLink Button3 = (HyperLink)_item3;
var _item4 = Repeater1.Items[i].FindControl("Repeater2");
if (_item4 != null)
{
Repeater Repeater2 = (Repeater)_item4;
if (Session["membername"] == null)
{
LinkButton1.Visible = true;
LinkButton2.Visible = true;
}
else
{
LinkButton3.Visible = true;
Button1.Visible = true;
}
string act = Request.QueryString["act"];
string leavewordid = Request.QueryString["id"];
string str1 = "Data Source=(local);Initial Catalog=leaveword;integrated security=True";
switch (act)
{
case "1":
SqlConnection conn = new SqlConnection(str1);
conn.Open();
DataSet ds2 = new DataSet();
string str2 = "Select leavewordid From [reply] Where leavewordid='" + leavewordid + "'";
SqlDataAdapter da2 = new SqlDataAdapter(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;
}
}
}
}
}
}
}
}
protected void Button2_Click(object sender, EventArgs e)
{
string str = "Data Source=(local);Initial Catalog=leaveword;integrated security=True";
SqlConnection conn = new SqlConnection(str);
conn.ConnectionString = str;
conn.Open();
string leavewordid = Request.QueryString["id"];
TextBox TextBox1 = (TextBox)Repeater1.Items[0].FindControl("TextBox1");
string TextBox1_text = TextBox1.Text;
string name = Session["membername"].ToString();
string date = System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
string ip = (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"];
string sql = "Insert into [reply] (leavewordid,name,date,ip,word) values ('" + leavewordid + "','" + name + "','" + date + "','" + ip + "','" + TextBox1_text + "')";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
Response.Write("<script language='javascript'>alert('回复成功!')</script>");
Response.Redirect("show.aspx");
}
}
Panel Panel1;
for (int i = 0; i < this.Repeater1.Items.Count; i++)
{
var _item = this.Repeater1.Items[i];
if (_item != null)
{
Panel1 = (Panel)_item.FindControl("Panel1"); }
}
--------------------编程问答--------------------
声明在外面FOR里面赋值以后外部那个也是获取不了FOR里面赋的值啊~
补充:.NET技术 , C#