2013-07-16 70 views
0

我將動態文本區域添加到我的頁面,併爲它們設置名稱和ID時,我創建它們,但在運行時,控件都具有像ctl01這樣的名稱。爲什麼我的動態生成的控件沒有獲取ID值

我已經遍歷代碼並使用遞歸FindControl擴展,但是當它到達動態添加的textarea時,它清楚地顯示它們具有我設置它們的ID,但它們的名稱是「ctl00 $ MainContent $ ctl03」

即使我可以清楚地看到控件的ID與我正在搜索的字符串匹配,我的findcontrol方法仍然失敗。但是,如果我將搜索字符串更改爲「ctl03」(ASP分配我的控件的名稱值),它將起作用並發現控件正常。這使我相信FindControl實際上是按名稱而不是ID進行搜索的。如果我可以設置控件的名稱,哪個會被找到,即使我明確地做ASP也拒絕承認。

CODE: 下面的方法被從 「ApplicationForm_PreInit」 事件

Private Sub AddSupplementalQuestions() 
     For Each question In Board.ApplicationXML.<BoardorCommission>.<Questions>.<Question> 
      Dim Qdiv As New HtmlControls.HtmlGenericControl("div") 
      Qdiv.Attributes.Add("id", [email protected] & "div") 

      Dim lbl1 As New HtmlControls.HtmlGenericControl("Label") 
      lbl1.Attributes.Add("id", [email protected] & "lbl") 
      lbl1.InnerHtml = question.<QuestionText>.Value 
      Qdiv.Controls.Add(lbl1) 

      Dim br2 As New HtmlControls.HtmlGenericControl("br") 
      Qdiv.Controls.Add(br2) 

      Dim tb1 As New HtmlControls.HtmlTextArea 
      tb1.Attributes.Add("id", [email protected] & "tb") 
      tb1.Attributes.Add("Textmode", "Multiline") 
      tb1.Attributes.Add("runat", "server") 
      tb1.Attributes.Add("name", [email protected] & "tb") 
      tb1.Attributes.Add("style", "width:45%; height: 50px;") 
      tb1.Attributes.Add("TextMode", "MultiLine") 

      Qdiv.Controls.Add(tb1) 

      ControlstoAdd.Add(Qdiv) 
     Next 
    End Sub 

這是我的遞歸的FindControl Exstension稱爲

Function FindControlRecursive(ByVal ctrl As Control, ByVal id As String) As Control 
     Dim c As Control = Nothing 

     If ctrl.ID = id Then 
      c = ctrl 
     Else 
      For Each childCtrl In ctrl.Controls 
       Dim resCtrl As Control = FindControlRecursive(childCtrl, id) 
       If resCtrl IsNot Nothing Then c = resCtrl 
      Next 
     End If 

     Return c 
End Function 

然後我打電話此

Dim tb2 = FindControlRecursive(Me, [email protected] & "tb") 

哪個應該找到控制沒有問題,但它沒有。當我在頁面上查看源代碼的控制如下所示

<textarea name="ctl00$MainContent$ctl03" id="Whatcanyouprovidetb" Textmode="MultiLine" runat="server" style="width:45%; height: 50px;"></textarea> 
+0

如果您使用JavaScript訪問這些項目,那麼完整的名稱很重要。 .NET創建了這樣的名稱,試圖使它們成爲唯一的名稱,並基於控件如何嵌套在其他控件中。在代碼隱藏方面,您不必擔心呈現的HTML中的全名,只有您提供的ID。 –

+0

爲什麼你在你的代碼後面實例化'HtmlControls',然後添加屬性使它們像ASP.NET服務器控件一樣工作?只要讓他們服務器控件開始,並將它們注入容器控件的'Items'集合。 –

回答

1

您沒有設置控制ID財產。將"id"添加到其屬性收集葉ID屬性爲空。然後,它將被ASP.NET自動分配用於生成唯一的html值id/name值。這樣做:

Qdiv.ID = [email protected] & "div" 

lbl1.ID = [email protected] & "lbl" 

tb1.ID = [email protected] & "tb" 

你似乎對很多事情添加到收藏Attributes應當使用明確的控件屬性進行設置。

+0

謝謝,那個答案只是我大腦所需要的。 – Neberu

相關問題