Prevent HTML encoding in auto-generated GridView columns

前端 未结 7 2077
渐次进展
渐次进展 2020-11-27 06:46

I have a GridView bound to a DataTable that I construct. Most columns in the table contain the raw HTML for a hypelinklink, and I would like that HTML to render as a link i

相关标签:
7条回答
  • 2020-11-27 07:17

    Another way is to add something like the following to the RowDataBound event handler...

        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
    
    0 讨论(0)
  • 2020-11-27 07:24

    I was able to achieve this by using the solution that Jørn Schou-Rode provided, I modified a little bit to make it work from the RowDataBound Event of my 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);
               }
    
        }
    }
    
    0 讨论(0)
  • 2020-11-27 07:29

    Use 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;
                }
            }
        }
    
    0 讨论(0)
  • 2020-11-27 07:31

    You can use this code in RowDataBound event if you want to disable HTML encoding in all rows and columns.

    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;
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-27 07:31

    Since all the answers seem to be in C# and the questions was not specific, I ran into this issue using ASP.Net and VB.Net and the accepted solution did not work for me in VB (though I imagine it does work in C#). Hopefully this helps anyone working with VB.Net in ASP who stumbles upon this as I have.

    In VB.Net BoundColumn cannot be added to Gridview.Columns as it is not a System.Web.UI.WebControls.DataControlField so instead one must use a BoundField which is a DataControlField.

    BoundColoumn also does not have an HtmlEncode property however BoundField does. Also, in VB.Net DataSource becomes 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()
    

    Also note that you must explicitly set AutoGenerateColumns="False" or the GridView will still generate columns along with the columns added above.

    0 讨论(0)
  • 2020-11-27 07:33

    Well since the html for the link is in your db already, you could just output the html to a literal control.

    <asp:TemplateField HeaderText="myLink" SortExpression="myLink">
        <ItemTemplate>
            <asp:Literal ID="litHyperLink" runat="server" Text='<%# Bind("myLink", "{0}") %>' />
        </ItemTemplate>
    </asp:TemplateField>
    

    This should render your link as raw text allowing the browser to render it as the link you expect it to be.

    0 讨论(0)
提交回复
热议问题