作成したDataTableにバインドされたGridViewがあります。テーブルのほとんどの列には、hypelinklinkの未加工のHTMLが含まれています。そのHTMLをブラウザーでリンクとしてレンダリングしたいのですが、GridViewはHTMLを自動的にエンコードするため、マークアップとしてレンダリングされます。
ハイパーリンクやその他の列を明示的に追加せずにこれを回避するにはどうすればよいですか?
BoundColumn.HtmlEncode
プロパティをfalseに設定するだけです。
<asp:BoundField DataField="HtmlLink" HtmlEncode="false" />
GridView
= true
を使用してAutoGenerateColumns
のコンテンツのHTMLエンコーディングを無効にする簡単な方法はないと思います。しかし、私はあなたが直面している問題を解決するかもしれない2つの回避策を考えることができます:
オプション1:GridView
クラスを継承し、Render
メソッドをオーバーライドして、すべてのセルをループし、その内容をデコードします。基本メソッドを実行する前:
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);
}
}
オプション2:GridView
から継承するクラス、またはPage
またはControl
を使用して、DataTable
を独自に検査し、各列に明示的なBoundColumn
を作成します。
foreach (DataColumn column in dataTable.Columns)
{
GridViewColumn boundColumn = new BoundColumn
{
DataSource = column.ColumnName,
HeaderText = column.ColumnName,
HtmlEncode = false
};
gridView.Columns.Add(boundColumn);
}
JørnSchou-Rodeが提供したソリューションを使用してこれを達成することができました。グリッドビューのRowDataBoundイベントから機能するように少し変更しました。
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);
}
}
}
別の方法は、次のようなものを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
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;
}
}
}
まあ、リンクのhtmlは既にdbにあるので、htmlをリテラルコントロールに出力するだけです。
<asp:TemplateField HeaderText="myLink" SortExpression="myLink">
<ItemTemplate>
<asp:Literal ID="litHyperLink" runat="server" Text='<%# Bind("myLink", "{0}") %>' />
</ItemTemplate>
</asp:TemplateField>
これにより、リンクが未加工のテキストとしてレンダリングされ、ブラウザーが期待どおりのリンクとしてレンダリングできるようになります。
すべての回答はC#であるように見え、質問は具体的ではなかったため、ASP.NetとVB.Netを使用してこの問題に遭遇しましたが、VB(私はそれがC#で機能することを想像しますが、これがVB.NetでASP私が持っているようにつまずく人)で作業する人を助けることを願っています。
VB.Netでは、BoundColumn
はGridview.Columns
ではないため、System.Web.UI.WebControls.DataControlField
に追加できません。代わりに、BoundField
を使用する必要がありますDataControlField
。
BoundColoumn
にもHtmlEncode
プロパティはありませんが、BoundField
にはあります。また、VB.NetではDataSource
は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()
また、明示的にAutoGenerateColumns="False"
を設定する必要があります。そうしないと、GridViewは上記で追加された列とともに列を生成します。
すべての行と列でHTMLエンコーディングを無効にする場合は、RowDataBoundイベントでこのコードを使用できます。
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;
}
}
}