web-dev-qa-db-fra.com

Comment rendre le code HTML décodé dans une cellule GridView

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

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

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

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

26
core

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;
}
41
Ray Booysen

Qu'en est-il de définir la propriété HtmlEncode sur false? Pour moi, c'est beaucoup plus simple.

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

Les nouvelles lignes normales sont-elles conservées en 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 onglets.

3
configurator
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;
        }
    }
}
3
Developer

J'ai contourné cela en insérant d'abord les données dans ma table sql-server à 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 à 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
2
DaamonTurne

La réponse de Booysen fonctionne, mais seulement 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;
        }
    }
}

Le mien est délibérément commencé à 1 en raison de mes données, mais évidemment cela fonctionnera avec tout ce dont vous avez besoin.

2
John
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);
}
1
Hank Brandenburg

@Ray Booysen answer est correct, 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;
}
0
Reza Paidar

Vous devez vous lier à l'événement DataBoundGrid et modifier le rendu pour les colonnes pour lesquelles le code HTML doit être rendu.

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
szuuuken