ASP.NET - GridView中的链接

时间:2016-02-21 14:11:28

标签: c# asp.net gridview hyperlink

我使用GridView创建了页面,但是我需要在1列中创建链接,如果我尝试添加<a>标记它不起作用,它只显示简单的html <a>标记。

我需要在第一行链接到otherpage.aspx?id = 1,第二行otherpage.aspx?id = 2等等。

Grid.aspx

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" CellPadding="4"
  ForeColor="#333333" GridLines="None" PageSize="5" ViewStateMode="Enabled"
  Width="100%" OnSelectedIndexChanged="GridView1_SelectedIndexChanged1">

    <AlternatingRowStyle BackColor="White" />

    <Columns>
    </Columns>


</asp:GridView>

Grid.aspx.cs

DataTable data = new DataTable();

data.Columns.Add("New column");
// others columns


for (int i = 1;i < 10; i++)
{
    data.Rows.Add();
    data.Rows[i]["New column"] = "<a href='otherpage.aspx?id='"+ i +">Link</a>";
    // other columns
}

GridView1.DataSource = data;
GridView1.DataBind();

或者是在GridView中以编程方式创建链接的更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

您可以使用以下代码:

foreach (GridViewRow gr in gv.Rows)
{
    HyperLink hp = new HyperLink();
    hp.Text = gr.Cells[0].Text;
    hp.NavigateUrl = "~/Default.aspx?name=" + hp.Text;
    gr.Cells[0].Controls.Add(hp);
}

如需更多样本,您可以看到此链接create links in dynamically created grid view

答案 1 :(得分:1)

您可以将GridField添加到GridView并在其中添加HyperLink控件,而不是在DataTable中添加新列。 Hyperlink控件在HTML中呈现为a标记。

使用TemplateField的优点是您不必动态创建控件(有时这不是最稳定的方法)。有关TemplateField的更多详细信息,请参阅此link

ASPX

根据您的要求,您可以直接在ASPX中设置HyperLink控件的属性:

<asp:GridView ID="gdv" runat="server" AutoGenerateColumns="false" OnRowDataBound="gdv_RowDataBound">
    <Columns>
        <asp:BoundField DataField="Id" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:HyperLink ID="lnk" runat="server" 
                    Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>'
                    NavigateUrl='<%# "otherpage.aspx?id=" + DataBinder.Eval(Container.DataItem, "Id").ToString() %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

ASPX和Code Behind更复杂的场景

对于更复杂的方案,您可以在Code Behind中设置属性:

<asp:GridView ID="gdv" runat="server" AutoGenerateColumns="false" OnRowDataBound="gdv_RowDataBound">
    <Columns>
        <asp:BoundField DataField="Id" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:HyperLink ID="lnk" runat="server" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

protected void gdv_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var lnk = (HyperLink)e.Row.FindControl("lnk");
        lnk.NavigateUrl = "otherpage.aspx?id=" + ((DataRowView)e.Row.DataItem)["Id"].ToString();
        lnk.Text = ((DataRowView)e.Row.DataItem)["Text"].ToString();
    }
}

RowDataBound事件中,标识了TemplateField中的HyperLink控件,并设置了TextNavigateUrl属性。