J'ai un GridView lié à un DataTable que je construis. La plupart des colonnes de la table contiennent le code HTML brut pour un lien hypelink. J'aimerais que ce code soit rendu sous forme de lien dans le navigateur, mais GridView code automatiquement le code HTML et le restitue sous forme de balisage.
Comment puis-je éviter cela sans ajouter explicitement HyperLink ou toute autre colonne?
Définissez simplement la propriété BoundColumn.HtmlEncode
sur false:
<asp:BoundField DataField="HtmlLink" HtmlEncode="false" />
Je crains qu’il n’existe pas de moyen simple de désactiver le codage HTML du contenu d’une variable GridView
avec AutoGenerateColumns
= true
. Cependant, je peux penser à deux solutions de contournement qui pourraient résoudre le problème auquel vous êtes confronté:
Option 1: Héritez de la classe GridView
, substituez la méthode Render
, parcourez toutes les cellules, décodez leur contenu avant d'exécuter la méthode de base:
for (int i = 0; i < Rows.Count; i++)
{
for (int j = 0; j < Rows[i].Cells.Count; j++)
{
string encoded = Rows[i].Cells[j].Text;
Rows[i].Cells[j].Text = Context.Server.HtmlDecode(encoded);
}
}
Option 2: Dans une classe héritant de GridView
ou de la Page
ou Control
l'utilisant, faites votre propre inspection de la DataTable
et créez une BoundColumn
explicite pour chaque colonne:
foreach (DataColumn column in dataTable.Columns)
{
GridViewColumn boundColumn = new BoundColumn
{
DataSource = column.ColumnName,
HeaderText = column.ColumnName,
HtmlEncode = false
};
gridView.Columns.Add(boundColumn);
}
J'ai pu y parvenir en utilisant la solution fournie par Jørn Schou-Rode, j'ai modifié un peu pour que cela fonctionne à partir de l'événement RowDataBound de mon Gridview.
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
for (int j = 0; j < e.Row.Cells.Count; j++)
{
string encoded = e.Row.Cells[j].Text;
e.Row.Cells[j].Text = Context.Server.HtmlDecode(encoded);
}
}
}
Une autre méthode consiste à ajouter le suivant au gestionnaire d’événements RowDataBound ...
If e.Row.RowType = DataControlRowType.Header Then
For Each col As TableCell In e.Row.Cells
Dim encoded As String = col.Text
col.Text = Context.Server.HtmlDecode(encoded)
Next
End If
Utilisez OnRowCreated
protected void gvFm_RowCreated(object sender, GridViewRowEventArgs e)
{
foreach (TableCell cell in e.Row.Cells)
{
BoundField fldRef = (BoundField)((DataControlFieldCell)cell).ContainingField;
switch (fldRef.DataField)
{
case "ColToHide":
fldRef.Visible = false;
break;
case "ColWithoutEncode":
fldRef.HtmlEncode = false;
break;
}
}
}
Puisque toutes les réponses semblent être en C # et que les questions n'étaient pas spécifiques, j'ai rencontré ce problème en utilisant ASP.Net et VB.Net et la solution acceptée ne fonctionnait pas pour moi dans VB (bien que j'imagine ça marche en C #). J'espère que cela aidera tous ceux qui travaillent avec VB.Net dans ASP et qui tombent par hasard là-dessus.
Dans VB.Net, BoundColumn
ne peut pas être ajouté à Gridview.Columns
car ce n’est pas un System.Web.UI.WebControls.DataControlField
; vous devez donc utiliser une BoundField
qui est une DataControlField
.
BoundColoumn
n'a pas non plus de propriété HtmlEncode
cependant BoundField
en a. De plus, dans VB.Net, DataSource
devient DataField
.
For Each dataCol As DataColumn In dv.Table.Columns
Dim boundCol As New BoundField With {
.DataField = dataCol.ColumnName,
.HeaderText = dataCol.ColumnName,
.HtmlEncode = False
}
gvResult.Columns.Add(boundCol)
Next
gvResult.DataSource = dv
gvResult.Databind()
Notez également que vous devez définir explicitement AutoGenerateColumns="False"
ou le GridView générera toujours des colonnes avec les colonnes ajoutées ci-dessus.
Eh bien, puisque le code HTML pour le lien se trouve déjà dans votre base de données, vous pouvez simplement exporter le code HTML dans un contrôle littéral.
<asp:TemplateField HeaderText="myLink" SortExpression="myLink">
<ItemTemplate>
<asp:Literal ID="litHyperLink" runat="server" Text='<%# Bind("myLink", "{0}") %>' />
</ItemTemplate>
</asp:TemplateField>
Cela devrait rendre votre lien en tant que texte brut permettant au navigateur de le rendre comme le lien que vous attendez.
Vous pouvez utiliser ce code dans l'événement RowDataBound si vous souhaitez désactiver le codage HTML dans toutes les lignes et toutes les colonnes.
protected void GV_Product_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
foreach (TableCell ObjTC in e.Row.Cells)
{
string decodedText = HttpUtility.HtmlDecode(ObjTC.Text);
ObjTC.Text = decodedText;
}
}
}