2009-01-10 10 views
24

Estoy vinculando un GridView a una consulta LINQ. Algunos de los campos en los objetos creados por la instrucción LINQ son cadenas y deben contener nuevas líneas.Cómo renderizar HTML decodificado en un (es decir, un <br>) en la celda GridView

Aparentemente, GridView HTML-codifica todo en cada celda, por lo que no puedo insertar < br/> para crear una nueva línea dentro de una celda.

¿Cómo le digo a GridView que no codifique HTML los contenidos de las celdas?

¿Tal vez debería usar un control diferente en su lugar?

Respuesta

37

¿Puede suscribirse al evento RowDataBound? Si puede, puede ejecutar:

if (e.Row.RowType == DataControlRowType.DataRow) 
{ 
    string decodedText = HttpUtility.HtmlDecode(e.Row.Cells[0].Text); 
    e.Row.Cells[0].Text = decodedText; 
} 
+0

Una de las ventajas de este método sobre el establecimiento de 'HtmlEncode' propiedad en el' 'BoundField' a false' es que se puede añadir etiquetas HTML en todo el texto y seguir utilizando la codificación HTML de los datos. Por ejemplo, 'e.Row.Cells [0] .Text =" "+ e.Row.Cells [0] .Text +" ";' – beawolf

3

¿Se conservan las líneas nuevas normales en la salida? De ser así, puede enviar las nuevas líneas y utilizar el estilo css white-space: pre, que preservaría líneas nuevas, espacios y pestañas.

+0

Genial, esto me ayudó, evitando reemplazos de cadenas en código. – Marcel

2

llegué alrededor de esta insertando primero los datos en mi mesa sql-servidor desde un cuadro de texto de varias líneas utilizando

replace (txt = Replace(txt, vbCrLf,"<br />")) 

Luego utiliza una solución de Ray Booysen para volver a mi gridview:

Protected Sub grdHist_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grdHist.RowDataBound 

     Dim col1 As String = HttpUtility.HtmlDecode(e.Row.Cells(2).Text) 

     e.Row.Cells(2).Text = col1 

End Sub 
2

La respuesta de Booysen funciona solo para una columna. Si ejecuta un bucle en el evento RowDataBound, puede sustituir una variable por [0] y hacer que funcione en cada columna si lo desea. Esto es lo que hice:

protected void gridCart_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    for (int i = 1; i < 4; i++) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      string decode = HttpUtility.HtmlDecode(e.Row.Cells[i].Text); 
      e.Row.Cells[i].Text = decode; 
     } 
    } 
} 

mina se pone en marcha deliberadamente a 1 debido a mis datos, pero es obvio que va a trabajar en lo que necesite.

38

¿Qué hay de configurar el HtmlEncode property en false? Para mí, esto es mucho más simple.

<asp:BoundField DataField="MyColumn" HtmlEncode="False" /> 
+4

De acuerdo. Esto es mucho más fácil. – willem

+0

En mi extremo, está agregando una nueva columna con el encabezado en blanco y la original todavía está allí. así que no sirve de nada ... –

+1

Encontré algo que también necesita para establecer el atributo 'autogeneratecolumns =" ​​false "' en GridView. Pero en este caso necesita agregar '' para cada campo de base de datos dentro de la subetiqueta '' del control GridView. –

3
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 

    for (int i = 0; i < e.Row.Cells.Count; i++) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      string decodedText = HttpUtility.HtmlDecode(e.Row.Cells[i].Text); 
      e.Row.Cells[i].Text = decodedText; 
     } 
    } 
} 
1
protected void gvHead_OnRowDataBound(object sender, GridViewRowEventArgs e) { 
    for (int i = 0; i < e.Row.Cells.Count; i++) 
    e.Row.Cells[i].Text = HttpUtility.HtmlDecode(e.Row.Cells[i].Text); 
} 
0

Usted tiene que unirse al evento de la DataBoundGrid y cambiar la representación por las columnas que desea rendir código HTML.

public event EventHandler DataBoundGrid { 
    add { ctlOverviewGridView.DataBound += value; } 
    remove { ctlOverviewGridView.DataBound -= value; } 
} 

ctlOverview.DataBoundGrid += (sender, args) => { 
    ((sender as ASPxGridView).Columns["YourColumnName"] as GridViewDataTextColumn).PropertiesTextEdit.EncodeHtml = false; 
}; 
0

@Ray Booysen respuestas es correcta, pero en algunos casos HtmlDecode() no pueden manejar su problema. puede usar UrlDecode() en lugar de HtmlDecode().
aquí es otra solución:

if (e.Row.RowType == DataControlRowType.DataRow) 
{ 
    string decodedText = HttpUtility.UrlDecode(e.Row.Cells[0].Text); 
    e.Row.Cells[0].Text = decodedText; 
} 
Cuestiones relacionadas