C# ASP.NET-GridView中的链接
我用GridView创建了一个页面,但如果我试图放置C# ASP.NET-GridView中的链接,c#,asp.net,gridview,hyperlink,C#,Asp.net,Gridview,Hyperlink,我用GridView创建了一个页面,但如果我试图放置”,我需要在1列中创建链接; //其他栏目 } GridView1.DataSource=数据; GridView1.DataBind(); 或者在GridView中创建链接是否有更好的解决方案(以编程方式)?您可以使用以下代码: foreach (GridViewRow gr in gv.Rows) { HyperLink hp = new HyperLink(); hp.Text = gr.Cells[0].Text;
”,我需要在1列中创建链接;
//其他栏目
}
GridView1.DataSource=数据;
GridView1.DataBind();
或者在GridView中创建链接是否有更好的解决方案(以编程方式)?您可以使用以下代码:
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);
}
有关更多示例,请参见此链接您可以使用以下代码:
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);
}
有关更多示例,您可以查看此链接,而不是在DataTable中添加新列,您可以在GridView中添加TemplateField并在其中放置超链接控件。超链接控件在HTML中呈现为
标记
使用TemplateField的优点是不必动态创建控件(有时这不是最稳定的方法)
ASPX
根据您的要求,您可以直接在ASPX中设置超链接控件的属性:
<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和代码隐藏用于更复杂的场景
对于更复杂的场景,可以在代码隐藏中设置属性:
<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();
}
}
受保护的void gdv_RowDataBound(对象发送方,GridViewRowEventArgs e)
{
如果(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中的超链接控件被标识,并且设置了Text
和NavigateUrl
属性。您可以将TemplateField添加到GridView并在其中放置超链接控件,而不是在DataTable中添加新列在HTML中取消标记
使用TemplateField的优点是不必动态创建控件(有时这不是最稳定的方法)
ASPX
根据您的要求,您可以直接在ASPX中设置超链接控件的属性:
<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和代码隐藏用于更复杂的场景
对于更复杂的场景,可以在代码隐藏中设置属性:
<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();
}
}
受保护的void gdv_RowDataBound(对象发送方,GridViewRowEventArgs e)
{
如果(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
事件中,模板字段中的超链接控件被识别,并且Text
和NavigateUrl
属性被设置。但是如何在我的for循环中直接添加链接?我不想有2个for循环,但是如何在我的for循环中直接添加链接?我不想有2个for循环,但我不知道如何添加直接实现到我的代码中(for循环),但我不知道如何直接实现到我的代码中(for循环)没有模板是不可能的?可以将html标记放入gridview吗?@Tomsk模板是将自定义html标记放入gridview单元格的稳定方式。我使用了超链接控件来显示链接。它呈现为a
标记,但可以从ASP.NET轻松设置。我用一种更简单的方法更新了答案,而这种方法不需要重新设置ed aRowDataBound
事件处理程序在code Behind.Im中获得:Type'System.Web.UI.WebControls.HyperLinkField'没有名为'ID'的公共属性……这不是将html标记放入GridView的更简单的方法吗?如果我需要在1列中包含两个自定义类的链接等呢?@Tomsk错误消息指向您选择的方向perLinkField而不是超链接控件。TemplateField是为将自定义HTML添加到GridView单元格中而构建的。因此,我仍然建议使用它,即使以后您决定将常规HTML而不是ASP.NET控件添加到其中。对于初学者,我会尝试使用带有超链接控件的TemplateField。我已经更新了答案并添加了一个link到如何使用TemplateField的概述。没有模板是不可能的?可以将html标记放入gridview吗?@Tomsk模板是将自定义html标记放入gridview单元格的稳定方式。我使用超链接控件显示链接。它呈现为标记,但可以从ASP.NET轻松设置。我更新了他用一种更简单的方法来回答,即不需要代码隐藏中的RowDataBound
事件处理程序。我得到:键入'System.Web.UI.WebControls.HyperLinkField'没有名为'ID'的公共属性……这不是将html标记放入GridView的更简单的方法吗?如果我需要在1列中包含两个自定义类的链接等怎么办?@Tomsk错误消息指向的方向是使用超链接字段而不是超链接控件。TemplateField是为将自定义HTML添加到GridView单元格中而构建的。因此,我仍然建议使用它,即使您稍后决定将常规HTML而不是ASP.NET控件放入其中。对于初学者,我会尝试使用带有超链接控件的TemplateField我已经更新了我的答案,并添加了一个链接,指向如何使用TemplateField的概述。