2010-04-09 13 views
15

Próbuję iterować zawartość repeatera zawierającego tabelę html i używać zawartości każdej komórki. Działa to dobrze dla standardowych komponentów HTML, ale wysadza się, gdy próbuję użyć kontrolki. Poniższy kod wyświetli wartość pierwszej komórki, "Element # 1", ale rzuci wyjątek HttpException podczas próby uzyskania dostępu .InnerText drugiej komórki. Błąd jest następujący:Nie można uzyskać wewnętrznej zawartości "", ponieważ zawartość nie jest literalna

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

Próbowałem użyć RenderControl przez to rozwiązanie znaleźć gdzie indziej, które nie powiodło się z dwóch powodów; 1) to renderowane cały HTML pierwszej komórki i 2) to nadal wysadzili podczas próby dostępu do drugiej komórki z następującym komunikatem:

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

Czy istnieje prosty sposób, aby uzyskać tekst linkButton jestem po? Kod przekaźnika i C# można znaleźć poniżej.

Kod Repeater:

<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> 

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

Czy byłeś w stanie to naprawić? Jestem w rozpaczliwej potrzebie odpowiedzi, ponieważ mam takie same błędy jak ty. Próbowałem nawet używać formantów System.Windows.Forms, aby ominąć to, ale bez radości. – Fandango68

Odpowiedz

2

Iterate/recurse poprzez jakiejkolwiek kontroli dzieci w kolekcji Controls. Gdy dojdziesz do węzła liści (bez dzieci), uzyskaj dostęp do tej właściwości kontrolnej InnerText.

15

Dla każdego, kto przybywa tutaj:

nie można dostać InnerHtml lub InnerText na zasadzie Control chyba że jego zawartość jest dosłowne, czyli tam nie są wszelkie kontrole Server lub kontrole z runat="server" wewnątrz niej, które wymagały renderowania

+0

Czy możesz podać dokładniejszy przykład, aby rozwiązać powyższy problem? Mam dokładnie ten sam problem. Dziękuję – Fandango68

+1

Nie możesz tego naprawić bez przeprojektowania formantu, więc jego zawartość jest dosłowna, usuń wszelkie kontrole z runat = "server" – katbyte

+0

Ponadto, najwyraźniej komentarz HTML zostanie sparsowany jako "nie jest dosłownym sterowaniem", nawet jeśli jest podobny do '< ! - Comment -> 'zamiast' <% - Comment -%> '. Właśnie to mnie tu sprowadziło. –

0

string value = ((Literal) (cell.Controls [0])). Text

+0

Nie powoduje to błędu rzutowania podczas próby przesłania kontrolki HTML do Literału. Nie działa. Przepraszam – Fandango68

0

Upewnij się również, że nic nie próbujesz uzyskać dostępu do innego formantu widoku, podczas gdy inne sterowanie widokiem jest uaktywnione w kontrolce widoku wielu .

+0

Witamy w stackoverflow !! To nie daje odpowiedzi na pytanie. Użyj poniższego pola komentarza, a po uzyskaniu wystarczającej reputacji będziesz mógł komentować każdy post. :) –

Powiązane problemy