代碼如下:
複製代碼 代碼如下:Panel spnButtons = new Panel();
Button btn = new Button();
btn.ID = "btn1";
spnButtons.Controls.Add(btn);
// 輸出True,表示沒有找到控制項
Response.Write(spnButtons.FindControl(btn.ID) == null);
而如果是下面的代碼就可以了:複製代碼 代碼如下:Panel spnButtons = new Panel();
Page.Controls.Add(spnButtons);// 建立Panel後把它加入Page
Button btn = new Button();
btn.ID = "btn1";
spnButtons.Controls.Add(btn);
// 輸出False,表示找到了控制項
Response.Write(spnButtons.FindControl(btn.ID) == null);
或者使用Repeater也可以: 複製代碼 代碼如下:Repeater spnButtons = new Repeater();
Button btn = new Button();
btn.ID = "btn1";
spnButtons.Controls.Add(btn);
// 輸出False,表示找到了控制項
Response.Write(spnButtons.FindControl(btn.ID) == null);
查了一下Panel是繼承於WebControl,而WebControl的定義是:
public class WebControl : Control, IAttributeAccessor
{}
Repeater的定義是:
public class Repeater : Control, INamingContainer
{}
難道是因為Repeater實現了INamingContainer的原因嗎?
我又自訂了一個類,繼承自Panel,並實現了INamingContainer,可以找到控制項了: 複製代碼 代碼如下:public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
myPanel spnButtons = new myPanel();
Button btn = new Button();
btn.ID = "btn1";
spnButtons.Controls.Add(btn);
Response.Write(spnButtons.FindControl(btn.ID) == null);
}
}
public class myPanel : Panel, INamingContainer
{
public myPanel():base()
{
}
}
上,ASP.Net中,PlaceHolder、Panel等控制項未實現INamingContainer,導致FindControl無效
如果把這些控制項加入到實現了INamingContainer的父控制項中,或者用子類實現INamingContainer,就可以使FindControl有效了。