2011-06-01 73 views
3

我有一個頁面,我創建div控件dynamiclly併爲它們自動編號。Page.FindControl爲DIV返回空

subCell = new TableCell(); 
subCell.Controls.Add(new LiteralControl(
    "<div id=\"picker" + Index.ToString() + "\" runat=\"server\" 
    class=\"colorSelector\"><div style=\"background-color: #000000;\">Text 
    </div></div>")); 
subRow.Cells.Add(subCell); 
subTb.Rows.Add(subRow); 

代碼後來我想,像這樣的背景顏色值:

HtmlGenericControl div; 

div = (HtmlGenericControl)Page.FindControl("picker" + e.CommandArgument.ToString()); 

string colorCode = div.Style["background-color"].ToString(); 

這行代碼後,我得到一個空對象裁判的錯誤。 div爲空。 我已經嘗試HtmlControl和LiteralControl作爲對象類型,這也沒有幫助。

謝謝!

回答

4

Page.FindControl僅適用於服務器控件。您正在爲剛好是div的文字控件中的文本分配一個id,但不是控件本身。如果你設置了控件的ID,你應該能夠找到它,但我不知道你是否打算這麼做。

爲了迴應您的評論,請檢查您的HTML。 runat = server可能會在那裏,因爲ASP.NET並未將其作爲控件處理,而是將其視爲內容。嘗試這樣的事情,注意Page.FindControl僅適用於直接的孩子。在這裏我已經在aspx中聲明瞭一個名爲'declaredPanel'的服務器面板。 ClientIdMode.Static使得它如此ASP.NET不會父母的名字添加到控件(如 「MainContent_childPanel」)

<asp:Panel ID="declaredPanel" runat="server" ClientIDMode="Static" /> 

在Page_Load中:

Panel p = new Panel(); 
    p.Style["background-color"] = "#aaeeaa"; 
    p.ID = "childPanel"; 
    p.ClientIDMode = System.Web.UI.ClientIDMode.Static; 
    p.Controls.Add(new LiteralControl("<div id=\"div111\" runat=\"server\">Hello, world!</div>")); 
    declaredPanel.Controls.Add(p); 
    Panel p2 = declaredPanel.FindControl("childPanel") as Panel; 
    string colorCode = p2.Style["background-color"]; // reports "#aaeeaa" 

產生以下:

<div id="declaredPanel"> 
    <div id="childPanel" style="background-color:#aaeeaa;"> 
     <div id="div111" runat="server">Hello, world!</div> 
    </div> 
</div> 
+0

但不添加runat =「server」使其成爲服務器控件?我可以直接訪問控件嗎? – 2011-06-01 07:44:07

+1

+1。div也不是控件,它不會發布到服務器。 – Adeel 2011-06-01 07:44:07

+0

這個技巧。謝謝! – 2011-06-01 08:33:13

0

使用Panel而不是LiteralControl。它會呈現爲DIV,並通過它的ID被FindControl找到。您無法找到div,因爲它在LiteralControl內「包裹」。 Control.FindControl在當前NamingContainer中搜索具有給定ID的控件(runat=server)。請記住,FindControl將不會遞歸查找元素(即在頁面上的所有TableCell中)。

看看這裏的... Better way to find control in ASP.NET

0

嘗試以下操作:

LiteralControl literalControl = new LiteralControl(); 
literalControl.ID = "divLiteralControl"; 
literalControl.Text = ... 
subCell.Controls.Add(literalControl); 

然後使用FindControl方法獲取文本控件和編輯它的文本。

LiteralControl literalControl = 
    (LiteralControl) subCell.FindControl("divLiteralControl"); 
literalControl.Text = ...