2009-03-09 12 views
0

Ich bin ein zusammenklappbares Gruppierung Raster Beispiel unter Verwendung von Aufbau Matt Berseth des von mattberseth.com/blog/2008/01/building_a_grouping_grid_with.html Suche nach Kontrollen in verschachtelte Listviews

Es hat eine innere Listview „lvInner“ in einem äußeren Listview „lvOuter“ verschachtelt. Ich versuche, eine Textbox in lv_Inner zuzugreifen

Protected Sub lvInner_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles lvInner.ItemDataBound 

    If e.Item.ItemType = ListViewItemType.DataItem Then 

    Dim tb As TextBox = TryCast(e.Item.FindControl("lvOuter").FindControl("lvInner").FindControl("TextBox1"), TextBox) 
      ' Do something to TextBox1 

    End If 
EndSub 

mit erhalte ich einen Fehler auf der Leitung Dim tb „Objektverweis auf eine Instanz eines Objekts nicht festgelegt“.

Antwort

0

Sie müssen einfach e.Item.FindControl ("Textbox"), e.Item ist bereits auf die richtige ListView beschränkt.

Protected Sub lvInner_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles lvInner.ItemDataBound 

If e.Item.ItemType = ListViewItemType.DataItem Then 

Dim tb As TextBox = TryCast(e.Item.FindControl("TextBox1"), TextBox) 
     ' Do something to TextBox1 

End If 
EndSub 
0

FindControl ist praktisch, aber nicht rekursiv.

Wenn Sie auf einer Seite eine tiefe Verschachtelung von Steuerelementen haben, müssen Sie möglicherweise rekursiv die Steuerhierarchie der Seite durchsuchen, um das gewünschte Steuerelement zu finden.

schreiben Sie Ihre eigene Methode ...

C# Beispiel: (Rechnen Sie jede freie VBtoC# Online-Tool)

public static System.Web.UI.Control FindControlFromTop(System.Web.UI.Control start, string id, System.Web.UI.Control exclude) 
     { 
      System.Web.UI.Control foundControl; 

      if (start != null && id != null) 
      { 
       foundControl = start.FindControl(id); 

       if (foundControl != null) 
        if(foundControl.ID.Equals(id)) 
         return foundControl; 

       foreach (System.Web.UI.Control control in start.Controls) 
       { 
        if (control != exclude) 
         foundControl = FindControlFromTop(control, id, null); 

        if (foundControl != null) 
         if (foundControl.ID.Equals(id)) 
          return foundControl; 
       } 
      } 

      return null; 
     } 
+0

Zwei Dinge ... Er ist nicht Rekursion benötigt als e.Item ist schon auf der inneren Liste (siehe seinen Code) ... und zwei, können Sie Ihre rekursive Methode etwa 10 Zeilen kürzer machen. – FlySwat