Comment rendre le code HTML décodé dans une cellule (c'est-à-dire un < br >) dans une cellule GridView

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

  •  08-07-2019
  •  | 
  •  

Question

Je lie un GridView à une requête LINQ. Certains des champs des objets créés par l'instruction LINQ sont des chaînes et doivent contenir de nouvelles lignes.

Apparemment, HTML GridView code tout ce qui se trouve dans chaque cellule, je ne peux donc pas insérer de < br / > créer une nouvelle ligne dans une cellule.

Comment dire à GridView de ne pas coder HTML le contenu des cellules?

Peut-être que je devrais utiliser un contrôle différent à la place?

Était-ce utile?

La solution

Pouvez-vous vous abonner à l'événement RowDataBound? Si vous le pouvez, vous pouvez exécuter:

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

Autres conseils

Pourquoi ne pas définir le Propriété HtmlEncode à false ? Pour moi, c'est beaucoup plus simple.

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

Les nouvelles lignes normales sont-elles conservées dans la sortie? Si tel est le cas, vous pouvez envoyer les nouvelles lignes et utiliser le style css white-space: pre , qui conserverait les nouvelles lignes, les espaces et les tabulations.

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 réponse de Booysen ne fonctionne que pour une colonne. Si vous exécutez une boucle dans l'événement RowDataBound, vous pouvez remplacer la variable [0] par une variable et le faire fonctionner sur chaque colonne si vous le souhaitez. Voici ce que j'ai fait:

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;
        }
    }
}
La mienne a été délibérément mise à 1 à cause de mes données, mais elle fonctionnera évidemment avec tout ce dont vous avez besoin.

J'ai contourné cela en insérant d'abord les données dans ma table de serveur SQL à partir d'une zone de texte multiligne à l'aide de

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

Ensuite, j'ai utilisé la solution de Ray Booysen pour la renvoyer dans ma grille:

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

Vous devez établir une liaison avec l'événement DataBoundGrid et modifier le rendu pour les colonnes que vous souhaitez restituer en code 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;
};

@Ray Booysen répond, mais dans certains cas, HtmlDecode () ne peut pas gérer votre problème. vous pouvez utiliser UrlDecode () au lieu de HtmlDecode ().
voici une autre solution:

if (e.Row.RowType == DataControlRowType.DataRow)
{
  string decodedText = HttpUtility.UrlDecode(e.Row.Cells[0].Text);
  e.Row.Cells[0].Text = decodedText;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top