·简单问题,为什么获取不到控件实例?
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class Repeater0 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Repeater1.DataSource = pageDs();
Repeater1.DataBind();
//------(为什么找不到DropDownList1这个控件?)
DropDownList DDl = (DropDownList)Repeater1.FindControl( "DropDownList1 ");
string n = DDl.DataValueField.ToString();
//------
}
protected PagedDataSource pageDs()
{
string constr = ConfigurationManager.ConnectionStrings[ "NorthwindConnectionString "].ConnectionString;
SqlConnection sqlCon = new SqlConnection(constr);
DataSet Ds = new DataSet();
SqlDataAdapter sqlDa1 = new SqlDataAdapter( "select * from Orders ", sqlCon);
sqlDa1.Fill(Ds, "01 ");
SqlDataAdapter sqlDa2 = new SqlDataAdapter( "select * from [Order Details] ", sqlCon);
sqlDa2.Fill(Ds, "02 ");
Ds.Relations.Add( "All ", Ds.Tables[ "01 "].Columns[ "OrderID "], Ds.Tables[ "02 "].Columns[ "OrderID "]);
PagedDataSource pageDs = new PagedDataSource();
pageDs.DataSource = Ds.Tables[ "01 "].DefaultView;
pageDs.AllowPaging = true;
pageDs.PageSize = 16;
pageDs.CurrentPageIndex = Convert.ToInt32(Request.QueryString[ "page "]);
return pageDs;
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Footer)
{
int Cp = pageDs().PageCount;
int Ip = pageDs().CurrentPageIndex;
//------
DropDownList ddl = (DropDownList)e.Item.FindControl( "DropDownList1 ");
ddl.AutoPostBack = true;
for (int i = 0; i < Cp; i++)//(在这里添加Text/value)
{
ddl.Items.Add(new ListItem(Convert.ToInt32(i + 1).ToString(), i.ToString()));
}
//------
Label Cpage = (Label)e.Item.FindControl( "Cpage ");
Cpage.Text = Cp.ToString();
Label Ipage = (Label)e.Item.FindControl( "Ipage ");
Ipage.Text = Convert.ToString(Ip + 1);//(pageDs().CurrentPageIndex + 1)
HyperLink Tp = (HyperLink)e.Item.FindControl( "Tp ");
Tp.NavigateUrl = "?page=0 ";//首页
HyperLink Sn = (HyperLink)e.Item.FindControl( "Sn ");
Sn.NavigateUrl = "?page= " + Convert.ToInt32(Cp - 1);//末页
HyperLink Up = (HyperLink)e.Item.FindControl( "Up ");
HyperLink Dn = (HyperLink)e.Item.FindControl( "Dn ");
if (Ip <= 0)
{
Tp.Enabled = false;//首页,关闭
Up.Enabled = false;//上页,关闭
Dn.Enabled = true;//下页,开启
}
else
{
Up.NavigateUrl = "?page= " + Convert.ToInt32(Ip - 1);
}
if (Ip > = Cp-1)
{
Sn.Enabled = false;//末页,关闭
Dn.Enabled = false;//下页,关闭
Up.Enabled = true;//上页,开启
}
else
{
Dn.NavigateUrl = "?page= " + Convert.ToInt32(Ip + 1);
}
}
}
}
[解决办法]
DropDownList1如果是动态生成就不行了。
[解决办法]
DropDownList DDl = (DropDownList)Repeater1.Items[i].FindControl( "DropDownList1 ");
i指定在哪行中进行FindControl,如第一行
DropDownList DDl = (DropDownList)Repeater1.Items[0].FindControl( "DropDownList1 ");
[解决办法]
Repeater1.FindControl( "DropDownList1 ")
显然是错误的。{Control}.FindControl并不是随便去寻找某个控件,它遇到一个实现了 INamingContainer接口的控件就停止了。也就是说,即使Repeater只有一行,它也不会深入到Item内部去寻找控件。必须从Item开始寻找,而不是从Repeater开始寻找。