Pregunta

Este es un ASP.Net web 2.0 de la aplicación.La plantilla de Elemento que se parece a esto, para la referencia:

<ItemTemplate>
  <tr>
    <td class="class1" align=center><a href='url'><img src="img.gif"></a></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field1") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field2") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field3") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field4") %></td>
  </tr>
</ItemTemplate>

El uso de este en el código subyacente:

foreach (RepeaterItem item in rptrFollowupSummary.Items)
{
    string val = ((DataBoundLiteralControl)item.Controls[0]).Text;
    Trace.Write(val);
}

Produzco:

<tr>
  <td class="class1" align=center><a href='url'><img src="img.gif"></a></td>
  <td class="class1">23</td>
  <td class="class1">1/1/2000</td>
  <td class="class1">-2</td>
  <td class="class1">11</td>
</tr>

Lo que necesito es que los datos de Campo1 y Field4

Me parece que no puede obtener los datos de la manera en que lo haría en decir un DataList o un GridView, y me parece que no puede venir con cualquier otra cosa en Google o aprovechar esto para hacer lo que yo quiero.La única manera que puedo ver, para llegar a los datos que van a ser el uso de una expresión regular para ir a buscarla (Porque un hombre toma lo que él quiere.Él se lo lleva todo.Y soy un hombre, ¿no?Que yo no?).

Estoy en la pista de la derecha (no en busca de la específica regex para ello;la forja de que podría ser una continuación de la pregunta ;) ), o me estoy perdiendo algo?


El Repetidor en este caso se establece en la piedra, así que no se puede cambiar a algo más elegante.Érase una vez hice algo similar a lo que Alison Zhou sugirió el uso de DataLists, pero hace algún tiempo (2+ años) y sólo me había olvidado por completo, haciendo de esta manera.Yeesh, hablar con vistas a algo que es obvio...

Así que lo hice como Alison sugerido y funciona bien.No creo que el viewstate es un problema aquí, aunque este repetidor puede obtener decenas de filas.Yo no puedo hablar a la pregunta de si hacerlo de esa manera, en lugar de emplear la vez (pero que parece una multa solución para mi en lo contrario).Obviamente esto último es menos de un viewstate de la huella, pero no tengo experiencia suficiente como para decir cuando un método podría ser preferible en ocasiones a otro sin un ejemplo extremo en frente de mí.Alison, una pregunta:por qué literales y no de las etiquetas?

Euro Micelli, yo estaba tratando de evitar un viaje de regreso a la base de datos.Como todavía estoy un poco verde en relación con el resto del mundo del desarrollo, admito que no necesariamente tienen una buena comprensión de cómo la base de datos de muchos viajes es "justo".No sería un problema de rendimiento aquí (sé que la aplicación de la carga suficiente para saber esto), pero supongo que estaba tratando de evitar que de costumbre, puesto que mi jefe tiende a enfatizar menos viajes donde sea posible.

¿Fue útil?

Solución

La parte superior de mi cabeza, usted puede intentar algo como esto:

<ItemTemplate>
  <tr>
    <td "class1"><asp:Literal ID="litField1" runat="server" Text='<%# Bind("Field1") %>'/></td>
    <td "class1"><asp:Literal ID="litField2" runat="server" Text='<%# Bind("Field2") %>'/></td>
    <td "class1"><asp:Literal ID="litField3" runat="server" Text='<%# Bind("Field3") %>'/></td>
    <td "class1"><asp:Literal ID="litField4" runat="server" Text='<%# Bind("Field4") %>'/></td>
  </tr>
</ItemTemplate>

Luego, en el código detrás, se puede acceder a cada Literal de control de la siguiente manera:

foreach (RepeaterItem item in rptrFollowupSummary.Items)
{   
    Literal lit1 = (Literal)item.FindControl("litField1");
    string value1 = lit1.Text;
    Literal lit4 = (Literal)item.FindControl("litField4");
    string value4 = lit4.Text;
}

Esto va a añadir a su ViewState pero hace que sea fácil de encontrar a sus controles.

Otros consejos

Puesto que usted está trabajando con datos tabulares, me gustaría recomendar el uso del control GridView.Entonces usted será capaz de acceder a las células individuales.

De lo contrario, usted puede configurar el td para Campo1 y Field4 a runat="server" y darles ID.A continuación, en el código subyacente, el acceso a la InnerText propiedad para cada uno de los td.

Si usted puede permitirse el lujo aunque sea un poco más alto en la generación, ir a por DataList y el uso de la DataKeys de la propiedad, lo que ahorrará a los campos de datos que usted necesita.

También puede utilizar las etiquetas en cada una de sus celdas de la tabla y ser capaz de elementos de referencia, con el correo.Elemento.FindControl("LabelID").

El <%#DataBinder.Eval(...) %> mecanismo no es del Enlace de Datos en una "estricta" de sentido.Es una manera técnica de poner el texto en lugares específicos en la plantilla.

Si usted necesita para obtener los datos de nuevo, tienes que:

  1. Conseguir a partir de los datos de origen
  2. Rellenar el repetidor con un mecanismo diferente

Tenga en cuenta que el Repetidor no guardar el origen de datos entre las devoluciones de datos, Usted no sólo puede pedir para dar los datos más tarde.

El primer método es generalmente más fácil trabajar con.No asuma que es demasiado caro para adquirir los datos de la fuente, a menos que demostrar a ti mismo mediante la medición;por lo general es bastante rápido.El mayor problema con esta técnica es que si la fuente de datos puede cambiar entre llamadas.

Para el segundo método, una técnica común es el uso de un control Literal.Ver Alison Zhou's para un ejemplo de cómo hacerlo.Normalmente yo personalmente prefiero a llenar el Literal controles dentro de la OnItemDataBound lugar

@peacedog:

Correcto;Alison método es perfectamente aceptable.

El truco con la base de datos de viajes de ida y vuelta:ellos no son libres, obviamente, pero los servidores web tienden a ser muy "cercanos" (rápido, conexión de baja latencia) a la base de datos, mientras que los usuarios son, probablemente, "lejos" (lento, conexión de alta latencia).

Debido a que, el envío de datos a/desde el navegador a través de las cookies, ViewState, campos ocultos o cualquier otro método, en realidad puede ser "peor" que la lectura de nuevo de la base de datos.También hay implicaciones de seguridad a tener en cuenta (el "malo" de usuario falsos los datos que vienen de vuelta desde el navegador?Sería importa si lo hacen?).

Pero muy a menudo no hace ninguna diferencia en el rendimiento.Es por eso que usted debe hacer lo que funciona de la forma más natural para su problema en particular y de preocuparse sólo si el rendimiento comienza a ser un problema del mundo real.

Buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top