Как отобразить декодированный HTML-код в (т.е. в < br >) в ячейке GridView

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

  •  08-07-2019
  •  | 
  •  

Вопрос

Я связываю GridView с запросом LINQ. Некоторые из полей в объектах, создаваемых оператором LINQ, являются строками и должны содержать новые строки.

Судя по всему, GridView HTML-кодирует все в каждой ячейке, поэтому я не могу вставить < br / > создать новую строку в ячейке.

Как мне сказать GridView не кодировать содержимое ячеек в HTML?

Может, мне стоит использовать другой элемент управления?

Это было полезно?

Решение

Можете ли вы подписаться на событие RowDataBound? Если вы можете, вы можете запустить:

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

Другие советы

Как насчет настройки <кода > Свойство HtmlEncode в false ? Для меня это намного проще.

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

Сохраняются ли нормальные символы новой строки в выходных данных? В этом случае вы можете отправлять новые строки и использовать стиль white-space: pre в стиле css, который сохранит новые строки, пробелы и символы табуляции.

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

Ответ Бойзена работает, но только для одного столбца. Если вы запускаете цикл в событии 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 из-за моих данных, но, очевидно, он будет работать с тем, что вам нужно.

Я справился с этим, сначала вставив данные в таблицу sql-сервера из многострочного текстового поля, используя

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

Затем я использовал решение Рэя Бойзена, чтобы вернуть его в мой обзор сетки:

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

Вы должны привязаться к событию 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;
};

@Ray Booysen правильно, но в некоторых случаях HtmlDecode () не может решить вашу проблему. Вы можете использовать UrlDecode () вместо HtmlDecode ().
вот другое решение:

if (e.Row.RowType == DataControlRowType.DataRow)
{
  string decodedText = HttpUtility.UrlDecode(e.Row.Cells[0].Text);
  e.Row.Cells[0].Text = decodedText;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top