2010-04-09 248 views
15

Estoy tratando de iterar sobre el contenido de un repetidor que contiene una tabla html y uso el contenido de cada celda. Esto funciona bien para componentes HTML estándar, pero explota cuando trato de usar un control. El siguiente código imprimirá el valor de la primera celda, "Artículo n. ° 1", pero arrojará una HttpException cuando intente acceder a .InnerText de la segunda celda. El error es el siguiente:No se puede obtener el contenido interno de '' porque el contenido no es literal

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

He intentado utilizar RenderControl a través de esta solución que se encuentra en otro lugar, que falló por dos razones; 1) se vuelve todo el HTML de la primera celda y 2) que todavía explotó al intentar acceder a la segunda celda con el siguiente mensaje:

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

¿Hay una manera fácil de obtener el texto LinkButton estoy ¿después? El código repetidor y C# se pueden encontrar a continuación.

El código repetidor:

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

El 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

¿Pudo arreglar esto por favor? Necesito desesperadamente una respuesta, ya que recibo los mismos errores que tú. Incluso he intentado utilizar los controles de System.Windows.Forms para evitar esto, pero no me alegro. – Fandango68

Respuesta

2

Iterar/recurse a través de los controles secundarios de la colección de controles. Cuando llegue a un nodo hoja (sin hijos), luego acceda a la propiedad InnerText de ese control.

15

Para cualquier otra persona que llega aquí:

No se puede obtener InnerHtml o InnerText en un Control menos que su contenido es literal, es decir, no hay ningún tipo de control del servidor o los controles con runat="server" en su interior la requerida renderizado

+0

¿Podría dar un ejemplo más específico para solucionar el problema anterior? Estoy teniendo exactamente el mismo problema. Gracias – Fandango68

+1

No puede solucionarlo sin rediseñar el control para que sus contenidos sean literales, elimine cualquier subcontroles con runat = "server" – katbyte

+0

Además, aparentemente un comentario HTML se analiza como "no es un control literal", incluso si es como '< ! - Comentario -> 'en lugar de' <% - Comentario -%> '. Eso fue lo que me trajo aquí. –

0

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

+0

No, eso causa un error de conversión al intentar lanzar un control HTML a un Literal. No funciona. Lo siento – Fandango68

0

Además, asegúrese de que no tiene nada que intente acceder a otro control de vista mientras que otro control de vista está activado en un control de vista múltiple .

+0

Bienvenido a stackoverflow !! Esto no proporciona una respuesta a la pregunta. Utilice el cuadro de comentarios a continuación y una vez que tenga suficiente reputación podrá comentar cualquier publicación. :) –

Cuestiones relacionadas