it-swarm.com.de

Wie wird dekodiertes HTML in einer (d. H. Einem <br>) in der GridView-Zelle dargestellt?

Ich binde eine GridView an eine LINQ-Abfrage. Einige der Felder in den von der LINQ-Anweisung erstellten Objekten sind Zeichenfolgen und müssen neue Zeilen enthalten.

Offenbar kodiert GridView alles in jeder Zelle mit HTML-Code, sodass ich keine <br /> einfügen kann, um eine neue Zeile in einer Zelle zu erstellen.

Wie kann ich GridView anweisen, den Inhalt von Zellen nicht mit HTML zu kodieren?

Vielleicht sollte ich stattdessen eine andere Steuerung verwenden?

26
core

Können Sie das RowDataBound-Ereignis abonnieren? Wenn Sie können, können Sie Folgendes ausführen:

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

Wie steht es um die HtmlEncode-Eigenschaft auf false? Für mich ist das viel einfacher.

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

Werden normale Zeilenumbrüche in der Ausgabe beibehalten? In diesem Fall können Sie die Zeilenumbrüche senden und den CSS-Code white-space: pre verwenden, wodurch die Zeilenumbrüche, Leerzeichen und Registerkarten erhalten bleiben.

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

Ich bin damit umgekommen, indem ich die Daten zuerst aus einer mehrzeiligen Textbox in meine SQL-Server-Tabelle eingefügt habe 

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

Dann habe ich die Lösung von Ray Booysen verwendet, um sie in meine Rasteransicht zu bringen:

 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

Die Antwort von Booysen funktioniert aber nur für eine Spalte. Wenn Sie im RowDataBound-Ereignis eine Schleife ausführen, können Sie die Variable [0] durch eine Variable ersetzen und diese Funktion für jede Spalte übernehmen, wenn Sie möchten. Folgendes habe ich getan:

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

Meines ist absichtlich um 1 wegen meiner Daten gestartet, aber es funktioniert offensichtlich mit dem, was Sie brauchen.

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

@Ray Booysen answers ist richtig, aber in einigen Fällen kann HtmlDecode () Ihr Problem nicht lösen. Sie können UrlDecode () anstelle von HtmlDecode () verwenden.
Hier ist eine andere Lösung:

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

Sie müssen an das DataBoundGrid-Ereignis binden und das Rendering für die Spalten ändern, für die HTML-Code ausgegeben werden soll.

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