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?
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;
}
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" />
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.
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;
}
}
}
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
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.
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);
}
@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;
}
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;
};