2009-03-09 12 views
0

Je construis une grille de regroupement pliable en utilisant l'exemple de Matt Berseth de mattberseth.com/blog/2008/01/building_a_grouping_grid_with.html Trouver des contrôles dans listviews imbriqués

Il a une listview intérieure « lvInner » niché dans un listview extérieur « lvOuter ». J'essaie d'accéder à une zone de texte à l'aide lv_Inner

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 

Je reçois une erreur « référence d'objet non définie à une instance d'un objet » sur la ligne Dim tb.

Répondre

0

Vous devez simplement faire un e.Item.FindControl ("textbox"), e.Item est déjà étendu à la listView appropriée.

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 est pratique, mais pas récursif.

Si vous avez une imbrication profonde des contrôles sur une page, vous devrez peut-être effectuer une recherche récursive dans la hiérarchie de contrôle de la page pour trouver le contrôle dont vous avez besoin.

écrire votre propre méthode ...

C# par exemple: (Convertissez en utilisant un outil en ligne gratuit VBtoC de #)

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

Deux choses ... Il n'a pas besoin récursion comme e.Item est déjà sur la liste interne (regardez son code) ... et deux, vous pouvez rendre votre méthode récursive d'environ 10 lignes plus courtes. – FlySwat

Questions connexes