2010-08-11 5 views
2

Je parcourt une collection de tables asp: tablerows pour pouvoir obtenir ou définir le texte dans une zone de texte imbriquée dans la troisième cellule de la ligne; Je le fais par type plutôt que par ID parce que les ID de cellule dans cette colonne ne sont pas totalement cohérents - donc je ne peux pas vraiment appeler FindControl() pour y parvenir. J'ai converti le troisième contrôle dans le TableRow en TableCell et puis Casting le premier contrôle dans cette cellule à un TextBox. Pas tout à fait correct, car je reçois un index hors de portée exception levée. Le problème réside principalement dans la propriété Controls.Count() de la troisième cellule, qui revient à zéro.Accès au contrôle enfant asp.net tablerow par type

Vous ne savez pas s'il existe un meilleur moyen d'accéder à la zone de texte --- dois-je recourir à FindControl()?

Le code:

foreach (TableRow row in tblProviders.Rows) { 

    string value = ((TextBox)((TableCell)row.Controls(2)).Controls(0)).Text; 

    ... 


} 

Mes recherches ici que l'utilisation de FindControl donné(), de sorte que peut-être la seule façon ...

Merci!

+0

Pourquoi l'ID de cellule est-elle incohérente? Pouvez-vous donner un exemple? Utilisez-vous ClientID? –

+0

@ Daniel-votre appel récursif a parfaitement fonctionné. Vous ne savez pas comment/pourquoi utiliser ClientID dans cette instance. Les deux premières valeurs de la zone de texte sont uniques par rapport aux autres dans cette colonne (les deux seront affichées de manière statique, les autres seront dynamiques), j'ai donc assigné des identifiants de façon appropriée. Merci encore! – Todd

+0

@ Ben-votre solution est super élégante et a également travaillé, mais Daniel vous a battu au punch. J'ai upvoted votre réponse indépendamment. Merci! – Todd

Répondre

1

Un peu de vérification nulle ne serait pas aller mal ici.

Vous pouvez essayer d'utiliser cette appel récursif:

foreach (TableRow row in tblProviders.Rows) { 
     var tb = FindControlRecursive(row, typeof(TextBox)); 
     if (tb != null) { 
      string value = ((TextBox)tb).Text; 
     } 
    } 

    private Control FindControlRecursive(Control rootControl, Type controlType) { 
     if (rootControl.GetType() == controlType) 
      return rootControl; //Found it 

     foreach (Control controlToSearch in rootControl.Controls) { 
      Control controlToReturn = FindControlRecursive(controlToSearch, controlType); 
      if (controlToReturn != null) return controlToReturn; 
     } 
     return null; 
    } 
3

Vous pouvez utiliser LINQ comme suit:

var TextBoxes = tblProviders.Rows.OfType<TableRow>() 
          .SelectMany(row => row.Cells.OfType<TableCell>() 
                 .SelectMany(cell => cell.Controls.OfType<TextBox>())); 

TextBoxes serait alors une collection de tous les champs de saisie en tblProviders.Rows, que vous pourriez ensuite parcourir et faire ce que vous aimez.

Questions connexes