none
如何取得DataList中的子DataList欄位值 RRS feed

  • 問題

  • 如題,我有一個DataList1包著子DataList2,我要取得子DataList2的相關值,我該怎麼取得?
    通常一般取得值的方法如 Dim str1 As Label = CType(DataList1.Items(i).FindControl("ROLE_NAMELabel"), Label),可是用此方法無法取得DataLis2,應該怎麼寫呢?
    謝謝。

    以下是我的Code:

    <asp:DataList ID="DataList1" runat="server" CssClass="general-txt" HeaderStyle-Font-Bold="true">
       <HeaderTemplate>
           <table  style=" border-bottom:2px solid black; border-top:2px solid black;">
             <tr>   
               <td width="50px">
                   <a>序號</a>
               </td>
               <td width="150px">
                   <a>申請單號</a>
               </td>
               <td width="200px">
                   <a>圖號</a>
               </td>
               <td width="150px">
                   <a>料號</a>
               </td>
               <td width="150px">
                   <a>附加規格</a>
               </td>
               <td width="80px">
                   <a>數量</a>
               </td>
               <td width="80px">
                   <a>單位</a>
               </td>
             </tr>  
           </table> 
       </HeaderTemplate>
       <ItemTemplate>
           <table > 
             <tr>   
               <td width="50px">
                   <%# DataBinder.Eval(Container, "DataItem.seq")%>
               </td>
               <td width="150px">
                   <%# DataBinder.Eval(Container, "DataItem.po_no")%>
               </td>
               <td width="200px">
                   <%# DataBinder.Eval(Container, "DataItem.ref_partno")%>
               </td>
               <td width="150px">
                   <%# DataBinder.Eval(Container, "DataItem.partno")%>
               </td>
               <td width="150px">
                   <%# DataBinder.Eval(Container, "DataItem.description")%>
               </td>
               <td width="80px">
                   <%# DataBinder.Eval(Container, "DataItem.ord_qty")%>
               </td>
               <td width="80px">
                   <%# DataBinder.Eval(Container, "DataItem.unit")%>
               </td>
             </tr>  
             <tr>   
               <td colspan="7">
                   <table width="100%">
                     <tr>
                       <td valign="top">
                           <a >包裝票類別:</a>
                       </td>
                       <td valign="top" align="right" style="border-top: 1px solid black;">
                           <a >交期排程</a>
                       </td>
                       <td  style="border-top: 1px solid black;">
                           <asp:DataList ID="DataList2" runat="server" datasource='<%# DataBinder.Eval(Container, "DataItem.myrelation") %>'>
                             <ItemTemplate>
                                 <table>
                                   <tr>
                                     <td>
                                         <asp:Label ID="need_date" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.need_date","{0:dd/MM/yyyy}")%>' />
                                         
                                     </td>
                                     <td>
                                         <%# DataBinder.Eval(Container, "DataItem.ord_qty")%>
                                     </td>
                                   </tr>
                                 </table>
                             </ItemTemplate>
                           </asp:DataList>
                       </td>
                     </tr>
                   </table>
               </td>
             </tr>  
           </table> 
       </ItemTemplate>
     </asp:DataList>

    2012年11月20日 上午 02:28

解答

  • 您好,

    如果用以下的function去找,是否可以找得到呢?

    Dim str1 As Label = FindControlRecurisve(DataList1.Items(i), "ROLE_NAMELabel")
    
    ''' <summary>
    ''' 依代號Recurisve去找到物件,直到找到為止
    ''' </summary>
    ''' <param name="rRoot"></param>
    ''' <param name="ctrlID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function FindControlRecurisve(ByRef rRoot As Control, ByVal ctrlID As String) As Control
    	If (rRoot.ID = ctrlID) Then
    		Return rRoot
    	End If
    
    	For Each ctrl In rRoot.Controls
    		Dim ctrlFound As Control = FindControlRecurisve(ctrl, ctrlID)
    		If IsNothing(ctrlFound) = False Then
    			Return ctrlFound
    		End If
    	Next
    	Return Nothing
    End Function


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 Sabine.Pao 2012年11月20日 上午 05:16
    2012年11月20日 上午 04:39

所有回覆

  • 您好,

    如果用以下的function去找,是否可以找得到呢?

    Dim str1 As Label = FindControlRecurisve(DataList1.Items(i), "ROLE_NAMELabel")
    
    ''' <summary>
    ''' 依代號Recurisve去找到物件,直到找到為止
    ''' </summary>
    ''' <param name="rRoot"></param>
    ''' <param name="ctrlID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function FindControlRecurisve(ByRef rRoot As Control, ByVal ctrlID As String) As Control
    	If (rRoot.ID = ctrlID) Then
    		Return rRoot
    	End If
    
    	For Each ctrl In rRoot.Controls
    		Dim ctrlFound As Control = FindControlRecurisve(ctrl, ctrlID)
    		If IsNothing(ctrlFound) = False Then
    			Return ctrlFound
    		End If
    	Next
    	Return Nothing
    End Function


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 Sabine.Pao 2012年11月20日 上午 05:16
    2012年11月20日 上午 04:39
  • 謝謝,成功了。

    2012年11月20日 上午 05:17
  • 謝謝你的解答,不過有另一個問題,雖然可以取得子DataList2得值,不過我該怎麼取得DataList2的Row 數呢?
    Dim str1 As Label = FinControlRecurisve(DataList1.Items(0), "ROLE_NAMELabel")的i值該怎麼給?
    2012年11月20日 上午 05:46
  • 您好,
    您是不是取myrelationd的資料筆數就知道幾行了呢?

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年11月20日 上午 06:13
  • 不好意思,我不太能理解意思

    我嘗試你給的code,不過都只能取得第一筆資料。
    即使我的資料有N筆,我在Items填入1以上的數字,就會出現錯"超過集合大小",我該怎麼取得全部的資料呢?
    ex.
    Dim str1 As Label = FinControlRecurisve(DataList1.Items(1), "ROLE_NAMELabel")

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim str1 As Label = New Label()
            str1 = FindControlRecurisve(DataList1, "lb_needDate")
    
            Response.Write(str1.Text.ToString())
        End Sub
    
        Public Shared Function FindControlRecurisve(ByRef rRoot As Control, ByVal ctrlID As String) As Control
            If (rRoot.ID = ctrlID) Then
                Return rRoot
            End If
    
            For Each ctrl In rRoot.Controls
                Dim ctrlFound As Control = FindControlRecurisve(ctrl, ctrlID)
                If IsNothing(ctrlFound) = False Then
                    Return ctrlFound
                End If
            Next
            Return Nothing
        End Function

    2012年11月22日 上午 06:25
  • 您好,
    請問您是要取某個DataList1第N個Item中的DataList2的Item Count嗎?
    我用以下的方式是可以取得到,您試一下。
    在執行Click之中,請先確定DataList1有先Bind到資料哦。

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    	Response.Write(String.Format("DataList1.Items.Count:{0} <br>", DataList1.Items.Count))
    	Dim dl2 As DataList = FindControlRecurisve(DataList1.Items(0), "DataList2")
    	If dl2 Is Nothing = False Then
    		Response.Write(String.Format("DataList1.Items(0).DataList2.Count:{0} <br>", dl2.Items.Count))
    	End If
    
    	dl2 = FindControlRecurisve(DataList1.Items(1), "DataList2")
    	If dl2 Is Nothing = False Then
    		Response.Write(String.Format("DataList1.Items(1).DataList2.Count:{0} <br>", dl2.Items.Count))
    	End If
    End Sub


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年11月22日 上午 10:27
  • 謝謝你幫我解決困擾好一陣子的問題,超級感謝大大的協助,終於成功了。
    因為Funcation那段我不太能理解,我需要再努力加強功力。

    2012年11月27日 上午 01:35
  • 別客氣,

    有問題再回來跟大家討論~


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年11月27日 上午 01:49