2011-06-30 23 views
6

Estoy intentando vincular un GridView HyperLinkField de manera que la columna enlazada se use como un valor de parámetro en la URL. Bastante estándar: nada sofisticado, pero el enlace falla cuando la columna enlazada contiene dos puntos, es decir, :. Soy mi caso particular, este valor es una cadena que representa un período de tiempo, p. "14:35" o "1:07:19".Cómo enlazar la URL de un GridView HyperLinkField cuando el valor enlazado contiene dos puntos?

Aquí está mi GridView, con el valor de tiempo vinculado a la url de HyperLinkField.

<asp:GridView ID="ResultsGridView" runat="server" AutoGenerateColumns="False" 
    DataSourceID="ResultsDataSource" EnableModelValidation="True" 
     AllowPaging="True"> 
    <Columns> 
     <asp:BoundField DataField="Year" HeaderText="Year" SortExpression="Year" /> 
     <asp:HyperLinkField DataNavigateUrlFields="RunTime" 
      DataTextField="RunTime" HeaderText="Hyperlink" 
      DataNavigateUrlFormatString="LinkedPage.aspx?param={0}" /> 
     <asp:BoundField DataField="RunTime" HeaderText="Time" 
      SortExpression="RunTime" /> 
     <asp:BoundField DataField="FullName" HeaderText="Name" 
      SortExpression="FullName" ReadOnly="True" /> 
    </Columns> 
</asp:GridView> 

Produce HTML como este. Tenga en cuenta que las etiquetas <a> no tienen el atributo href.

<tr> 
    <td>2010</td><td><a>34:58</a></td><td>34:58</td><td>Joe Schmoe</td> 
</tr><tr> 
    <td>2010</td><td><a>35:30</a></td><td>35:30</td><td>Rod Krueger</td> 
</tr><tr> 
    <td>2010</td><td><a>35:38</a></td><td>35:38</td><td>Mike Johnson</td> 
</tr> 

Pero si cambio el campo enlazado de tiempo de ejecución para el año, es decir, a una columna que no contiene dos puntos en los valores, que funciona como se espera. Tome el GridView anterior, y cambiar el atributo DataNavigateUrlFields del HyperLinkField, así:

<asp:HyperLinkField DataNavigateUrlFields="Year" 
     DataTextField="RunTime" HeaderText="Hyperlink" 
     DataNavigateUrlFormatString="LinkedPage.aspx?param={0}" /> 

Y ahora la salida HTML es correcta, así:

<tr> 
    <td>2010</td><td><a href="LinkedPage.aspx?param=2010">34:58</a></td><td>34:58</td><td>Joe Schmoe</td> 
</tr><tr> 
    <td>2010</td><td><a href="LinkedPage.aspx?param=2010">35:30</a></td><td>35:30</td><td>Rod Krueger</td> 
</tr><tr> 
    <td>2010</td><td><a href="LinkedPage.aspx?param=2010">35:38</a></td><td>35:38</td><td>Mike Johnson</td> 
</tr><tr> 

Así que la tuerca de mi pregunta es la siguiente : ¿cómo puedo vincular una columna de datos con valores que contienen dos puntos a la URL de un HyperLinkField? O, en su defecto, ¿crear el mismo hipervínculo enlazado por otro método?

Cambiar el formato de los datos para no incluir dos puntos sería un último recurso, porque LinkedPage.aspx espera el valor del parámetro en ese formato, y ya está escrito, probado y en uso.

Respuesta

8
<asp:TemplateField HeaderText="Hyperlink"> 
     <ItemTemplate> 
      <asp:HyperLink ID="HyperLink1" runat="server" 
       NavigateUrl='<%# Eval("RunTime", @"LinkedPage.aspx?param={0:hh\:mm}") %>' 
       Text='<%# Eval("RunTime", @"{0:hh\:mm}") %>'></asp:HyperLink> 
     </ItemTemplate> 
    </asp:TemplateField> 
+0

¿Cómo se puede usar este hipervínculo para cargar una segunda vista de cuadrícula en la misma página? – aspiring

+1

@aspiring use un LinkButton o ImageButton, adjunte un controlador para el evento ItemCommand, luego un UpdatePanel donde incluya la segunda grilla. El código del controlador de eventos es para vincular el origen de datos de esta cuadrícula. –

+0

No estoy seguro de qué quiere decir con un panel de actualización. El campo actual es un Boundfield simple para mostrar un nombre en la vista de cuadrícula. Entonces, si voy a usar un botón de enlace, tendré que encontrar una manera de mostrar los datos de db en el botón de enlace como texto o sth. Tal vez podría publicar una respuesta [aquí.] (Http://stackoverflow.com/q/30188620/2061309) Voy a buscar y probar su sugerencia. – aspiring

1

Guau, muy extraño, peor empeora, como último paso, siempre puede tocar RowDataBound y establecer el texto de la celda para hipervínculo HTML usted mismo, pero mientras tanto, intente tocar RowDataBound y examinar los resultados ahí. Tal vez puedas codificar el valor en el tiempo de enlace, de modo que si hay un problema con: ¿la codificación probablemente lo resolverá?

También puede querer presentar como un error que a connect.microsoft.com ...

HTH.

+0

Gracias, @Brian, voy a intentarlo. Sospecho que tiene algo que ver con dos puntos que se usan como parte del marcador de posición de valor en 'DataNavigateUrlFormatString', p. Ej. si tuviera un valor de moneda para formatear, podría usar {0: C} en lugar de solo {0} en la cadena de formato. – Matt

+0

Sí, eso podría tener sentido, pero creo que solo se aplicaría si tuviera el {}, pero quién sabe .. –

Cuestiones relacionadas