如何在GridView中为超链接添加导航网址

9
每一行我的GridView都应该有一个按钮/超链接,用于导航到Page?id=something。 然后有一个JavaScript捕获重定向并将页面打印为iframe。 这个 something 已经在行中可用(但是隐藏的)。 因此,我想为每个字段设置NavigateUrl =“〜/ Page.aspx?id =”+ Id.ToString(),但问题是从LINQ数据源填充Id在DataBind()中。
<asp:GridView ID="gridleitNidurstada" runat="server" GridLines="None" AllowPaging="True"
    CssClass="mGrid" PagerStyle-CssClass="pgr" DataKeyNames="Id" OnRowDataBound="gridLeit_RowDataBound"
    AllowSorting="True" SortedAscendingHeaderStyle-CssClass="sortasc-header" SortedDescendingHeaderStyle-CssClass="sortdesc-header"
    OnSorting="gridleitNidurstada_Sorting" CurrentSortField="Id" CurrentSortDir="Ascending"
    AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" Visible="false"/>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:HyperLinkField HeaderText="Print" Text="Print" **anything here?**/>
    </Columns>
    <PagerStyle CssClass="pgr"></PagerStyle>
    <SortedAscendingHeaderStyle CssClass="sortasc-header"></SortedAscendingHeaderStyle>
    <SortedDescendingHeaderStyle CssClass="sortdesc-header"></SortedDescendingHeaderStyle>
</asp:GridView>

绑定是这样的:我能在那里做吗?或者在行绑定事件中?
IQueryable<model.SomeClass> someClass = 
    from m in preparePredicate()
    select new model.SomeClass
    {
        Id = m.id,
        ...
    };
        gridleitNidurstada.DataSource = someClass;
        gridleitNidurstada.DataBind();
4个回答

12

你可以使用以下语法:

<asp:HyperLinkField DataNavigateUrlFields="col1,col2" DataNavigateUrlFormatString="gotopage.aspx?p1={0}&p2={1}" Text="Print">

更多信息请看这里这里的MSDN页面。

编辑:


如果在创建网格时不知道确切的URL,您需要做更多的工作。以下是我本周处理的一个示例,使用了一个项目模板。但是,为了使用此功能,您必须将EnableSortingAndPagingCallbacks设置为false,并且需要在代码后端进行一些额外的操作。我只在我的网格上使用了分页,因此可以提供此示例。标记:

<asp:GridView ID="gridViewTicketsClosed" runat="server" CellPadding="4" ForeColor="#333333"
    GridLines="None" EnableSortingAndPagingCallbacks="False" AutoGenerateColumns="False"
    AllowPaging="True" OnRowDataBound="gridViewTicketsClosed_RowDataBound" OnPageIndexChanging="GridViewPageIndexChanging">
    <PagerSettings Mode="NextPrevious" NextPageText="Next" PreviousPageText="Previous" />
    <Columns>
        <asp:BoundField DataField="TicketId" HeaderText="Nr.">
            <ItemStyle Width="20px" />
        </asp:BoundField>
        <asp:BoundField DataField="DateStarted" DataFormatString="{0:dd/MM/yyyy HH:mm}" HeaderText="Date">
            <ItemStyle Width="100px" />
        </asp:BoundField>
        <asp:BoundField DataField="President" HeaderText="President">
            <ItemStyle Width="100px" />
        </asp:BoundField>
        <asp:BoundField DataField="TicketTypeId" HeaderText="TicketType"></asp:BoundField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:HyperLink ID="lnkActionLog" runat="server" Text="Log"></asp:HyperLink>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

代码后端:

protected void gridViewTicketsClosed_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var hyperLink = e.Row.FindControl("lnkActionLog") as HyperLink;
        if (hyperLink != null)
            hyperLink.NavigateUrl = CreateShowActionLogUrl(e.Row) + "?id="+ DataBinder.Eval(e.Row.DataItem, "TicketId");
    }
}

在重新阅读您的问题后,我认为您已经接受了我提出的第一个建议,因为您的URL始终是相同的。只有查询参数的值不同。 - Koen
是的,谢谢。这正是我需要的东西,但你的编辑实际上帮助了我的后续想法。 - fogedi

7
在您的NavigateUrl属性中包含以下内容。
NavigateUrl='<%# Eval("Sl_no", 
              "frmAddIntake.aspx?id=Dashboard&intake_id={0}") %>'

Rupesh More的解决方案对我很有用,但需要先将<SL_no>绑定到隐藏列,而不是直接从数据源绑定。谢谢你,伙计。 - Moe

1
这对我来说很简单。没有其他要求。
<asp:HyperLink ID="HyperLink1" runat="server" 
                        Text="URL Text" NavigateUrl='<%# "URL.aspx?your_parameter=" + Eval("ID") %>'></asp:HyperLink>

1
<asp:TemplateField HeaderText = "Id" ItemStyle-Width="30">
            <ItemTemplate>
                <asp:HyperLink runat="server" NavigateUrl='<%# Eval("TheQueryStringParameterComingFromDB", "~/PageYouWantTONavigateTo.aspx?Id={0}") %>'
                    Text='GiveTextYouWantToDisplay' />
            </ItemTemplate>
        </asp:TemplateField>

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