Come eseguire il rendering dell'HTML decodificato in un (cioè a < br >) nella cella GridView

StackOverflow https://stackoverflow.com/questions/431840

  •  08-07-2019
  •  | 
  •  

Domanda

Sto associando un GridView a una query LINQ. Alcuni dei campi negli oggetti creati dall'istruzione LINQ sono stringhe e devono contenere nuove righe.

Apparentemente, GridView HTML codifica tutto in ogni cella, quindi non posso inserire un < br / > per creare una nuova linea all'interno di una cella.

Come faccio a dire a GridView di non codificare HTML il contenuto delle celle?

Forse dovrei usare un controllo diverso invece?

È stato utile?

Soluzione

Puoi iscriverti all'evento RowDataBound? Se puoi, puoi eseguire:

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

Altri suggerimenti

Che dire dell'impostazione del Proprietà HtmlEncode su false ? Per me, questo è molto più semplice.

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

Le nuove righe normali vengono conservate nell'output? In tal caso, puoi inviare le nuove righe e utilizzare lo stile css white-space: pre , che conserverà le nuove righe, gli spazi e le schede.

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

La risposta di Booysen funziona ma solo per una colonna. Se si esegue un ciclo nell'evento RowDataBound, è possibile sostituire una variabile per lo [0] e fare questo lavoro su ogni colonna se lo si desidera. Ecco cosa ho fatto:

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

Il mio è stato avviato deliberatamente all'1 a causa dei miei dati, ma ovviamente funzionerà con qualsiasi cosa tu abbia bisogno.

Ho risolto il problema inserendo prima i dati nella mia tabella sql-server da una casella di testo multilinea usando

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

Quindi ho usato la soluzione di Ray Booysen per restituirla alla mia griglia:

 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
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);
}

Devi associare l'evento DataBoundGrid e modificare il rendering per le colonne in cui desideri eseguire il rendering del codice 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;
};
Le risposte

@Ray Booysen sono corrette ma in alcuni casi HtmlDecode () non è in grado di gestire il problema. puoi usare UrlDecode () invece di HtmlDecode ().
ecco un'altra soluzione:

if (e.Row.RowType == DataControlRowType.DataRow)
{
  string decodedText = HttpUtility.UrlDecode(e.Row.Cells[0].Text);
  e.Row.Cells[0].Text = decodedText;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top