2010-04-09 3 views
15

J'essaie de parcourir le contenu d'un répéteur contenant une table html et d'utiliser le contenu de chaque cellule. Cela fonctionne bien pour les composants HTML standard, mais explose lorsque j'essaie d'utiliser un contrôle. Le code ci-dessous affichera la valeur de la première cellule, "Item # 1", mais lancera une exception HttpException en essayant d'accéder à .InnerText de la deuxième cellule. L'erreur est la suivante:Impossible d'obtenir le contenu interne de '' car le contenu n'est pas littéral

Cannot get inner content of because the contents are not literal. 

J'ai essayé d'utiliser RenderControl via cette solution trouvée ailleurs, qui a échoué pour deux raisons; 1) il a rendu l'ensemble du code HTML de la première cellule et 2) il encore fait exploser lorsque vous essayez d'accéder à la seconde cellule avec le message suivant:

'LinkButton1' of type 'LinkButton' must be placed inside 
a form tag with runat=server 

est-il un moyen facile d'obtenir le texte LinkButton Je suis après? Le code du répéteur et C# peuvent être trouvés ci-dessous.

Le code répéteur:

<asp:Repeater ID="Rep1" runat="server"> 
<HeaderTemplate> 
    <table id="Table1" class="data"> 
</HeaderTemplate> 
<ItemTemplate> 
    <tr id="Row" runat="server"> 
     <td>Item #1</td> 
     <td><asp:LinkButton ID="LinkButton1" OnClick="DoSomething" 
      Text="Item #2" runat="server" /></td> 
    </tr> 
</ItemTemplate> 
<FooterTemplate> 
    </table> 
</FooterTemplate> 

Le C#:

foreach (RepeaterItem item in Rep1.Items) 
{ 
    HtmlTableRow row = item.Controls[0].FindControl("Row") as HtmlTableRow; 

    foreach (HtmlTableCell cell in row.Cells) 
    { 
     if (cell.InnerText != string.Empty) 
     { 
      Console.WriteLine(cell.InnerText); 
     } 
    } 
} 
+0

Avez-vous pu résoudre ce problème? J'ai désespérément besoin d'une réponse, car j'ai les mêmes erreurs que vous. J'ai même essayé d'utiliser les contrôles System.Windows.Forms pour contourner cela, mais pas de joie. – Fandango68

Répondre

2

Itérer/recurse par tout contrôle enfant dans la collection Controls. Lorsque vous arrivez à un nœud feuille (sans enfants), accédez à la propriété InnerText de ce contrôle.

15

Pour toute autre personne qui arrive ici:

Vous ne pouvez pas obtenir InnerHtml ou InnerText sur un Control à moins que son contenu littéral, autrement dit, il n'y a pas de contrôle du serveur ou des contrôles avec runat="server" à l'intérieur que nécessaire rendu

+0

Pourriez-vous s'il vous plaît donner un exemple plus spécifique pour résoudre le problème ci-dessus? J'ai exactement le même problème. Merci – Fandango68

+1

Vous ne pouvez pas le réparer sans redéfinir le contrôle afin que son contenu soit littéral, supprimez tous les sous-contrôles avec runat = "server" – katbyte

+0

Aussi, apparemment un commentaire HTML est analysé comme "pas un contrôle littéral", même si c'est comme < ! - Commentaire -> 'au lieu de' <% - Commentaire -%> '. C'est ce qui m'a amené ici. –

0

valeur de chaîne = ((Literal) (cell.Controls [0])). Texte

+0

Aucun qui provoque une erreur de distribution essayant de convertir un contrôle HTML en littéral. Ne marche pas. Désolé – Fandango68

0

De même, assurez-vous que rien de tel n'essaie d'accéder à un autre contrôle de vue alors qu'un autre contrôle de vue est activé dans un contrôle multi-vues .

+0

Bienvenue sur stackoverflow !! Cela ne fournit pas de réponse à la question. S'il vous plaît utiliser la boîte de commentaire ci-dessous et une fois que vous avez une réputation suffisante, vous serez en mesure de commenter sur n'importe quel poste. :) –

Questions connexes