使用AutoGenerateColumns将超链接绑定到GridView

3
我有一个DataTable,其中的列是在运行时动态生成的。这个DataTable绑定到一个GridView上,GridView的AutoGenerateColumns属性设置为true。我遇到了一个问题,因为DataTable中的一些数据是HyperLink对象,所以在表格中显示实际链接的位置,它会显示"System.Web.UI.WebControls.HyperLink"。
通常,我会在我的GridView中使用HyperLinkField,但由于GridView的列是自动生成的,我不确定该怎么做。有什么想法吗?

为什么您要将超链接存储在数据表中,而不仅仅是链接? - Tim Schmelter
@Tim:我猜你指的是纯文本链接?我可以以任何方式存储它,但如果我只存储链接,那么我如何在GridView中呈现它作为HTML链接? - Tyler Treat
1个回答

2
你可以动态添加新列,只需要隐藏自动生成的列即可。
对于这种情况,你可以将超链接存储在两个列中-一个用于存储链接,另一个用于存储要显示的文本,或者如果你想要显示通用的内容(如“点击此处”),你可以只存储链接(例如“http://example.com.au/Default.aspx”)。
protected void GridView1_RowBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        //add new header
        TableCell tc = new TableCell();
        tc.Text = "Groovy Link";
        e.Row.Cells.Add(tc);
        //hide original column that has been autobound - skip column we just added
        for (int i = 0; i < e.Row.Cells.Count - 1; i++)
        {
            BoundField field = (BoundField)((DataControlFieldCell)e.Row.Cells[i]).ContainingField;
            if (field.DataField == "AutoGeneratedColumnName")
                field.Visible = false;
        }
    }
    else if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //create new tablecell
        TableCell tc = new TableCell();
        //do a check to see if the data is stored as a hyperlink in DB
        if (DataBinder.Eval(e.Row.DataItem, "AutoGeneratedColumnName").ToString().StartsWith("<a") == true)
        {
            //create hyperlink
            HyperLink hyp = new HyperLink();
            hyp.NavigateUrl = DataBinder.Eval(e.Row.DataItem, "AutoGeneratedColumnName").ToString();
            hyp.Text = "click here";
            tc.Controls.Add(hyp);
        }
        else
        {
            //just text
            tc.Text = DataBinder.Eval(e.Row.DataItem, "AutoGeneratedColumnName").ToString()
        }
        //add tablecell to row
        e.Row.Cells.Add(tc);
        //hide original column that has been autobound
        for (int i = 0; i < e.Row.Cells.Count - 1; i++)
        {
            BoundField field = (BoundField)((DataControlFieldCell)e.Row.Cells[i]).ContainingField;
            if (field.DataField == "AutoGeneratedColumnName")
                field.Visible = false;
        }
    }
}

我遇到的问题是,根据数据的不同,该项可能是一个超链接或仅仅是一个字符串。 - Tyler Treat
@Tyler:你想把字符串作为超链接展示吗? - JumpingJezza
@JumpingJezza:不,其中一些项目是链接,而另一些则不是。 - Tyler Treat
@Tyler:那你是如何区分它们的?你对数据有任何控制权吗? - JumpingJezza
@JumpingJezza:我想要的是在GridView中添加一列,根据DataTable的值显示链接或纯文本。我能够确定哪些值是链接,哪些不是,并且能够完全构建URL。我只是不知道如何让一列同时显示两者,或者有什么其他的选择。 - Tyler Treat
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接