web-dev-qa-db-ja.com

GridViewセルの(つまり<br>)でデコードされたHTMLをレンダリングする方法

GridViewをLINQクエリにバインドしています。 LINQステートメントによって作成されたオブジェクトのフィールドの一部は文字列であり、新しい行を含める必要があります。

どうやら、GridViewは各セルのすべてをHTMLエンコードするので、<br />を挿入してセル内に新しい行を作成することはできません。

セルのコンテンツをHTMLエンコードしないようにGridViewに指示するにはどうすればよいですか?

代わりに別のコントロールを使用する必要がありますか?

28
core

RowDataBoundイベントをサブスクライブできますか?可能であれば、以下を実行できます。

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

HtmlEncode propertyfalseに設定するのはどうですか?私には、これははるかに簡単です。

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

通常の改行は出力に保持されますか?その場合は、改行を送信し、CSSスタイルwhite-space: preを使用できます。これにより、改行、スペース、タブが保持されます。

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

私は最初にデータを複数行のテキストボックスからsql-serverテーブルに挿入してこれを回避しました

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

次に、Ray Booysenのソリューションを使用してそれをグリッドビューに戻しました。

 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

ブイセンの答えは機能しますが、1つの列に対してのみです。 RowDataBoundイベントでループを実行する場合、[0]の代わりに変数を使用して、必要に応じてこれを各列で機能させることができます。これが私がしたことです:

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

私のデータのため、鉱山は故意に1から開始されますが、明らかに必要なものは何でも動作します。

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回答は正しいですが、場合によってはHtmlDecode()が問題を処理できないことがあります。 HtmlDecode()の代わりにUrlDecode()を使用できます。
ここに別のソリューションがあります:

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

DataBoundGridイベントにバインドし、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
szuuuken