在用户控件(ASCX)中动态设置Gridview DataNavigateUrlFormatString

3
我有一个问题,不确定是否能够解决。
在aspx页面中,我有一个用户控件(ascx),根据用户活动加载。
用户控件包含一个网格视图,其中一个列是超链接。
<asp:HyperLinkField  DataNavigateUrlFormatString='<%page %>'
        DataTextField="ReqId" HeaderText="Request No." DataNavigateUrlFields="ReqId" />

我希望当点击超链接时,它能够带有参数跳转到同一页,但是因为某些原因我做不到。所以我尝试了以下方法:

<%string page = Page.Request.Path + "reqid={0}"; %>

但在页面中,该链接将%page%作为字符串引用。 请问有人能指导我如何做吗?
附注: 之前这样做是可行的,而且当ascx位于解决方案的根文件夹中时也能正常工作。但问题是,当我把所有控件移动到名为“Controls”的文件夹中时,问题就开始出现了。
<asp:HyperLinkField  DataNavigateUrlFormatString="?reqid={0}"
        DataTextField="ReqId" HeaderText="מספר בקשה" DataNavigateUrlFields="ReqId" />

thanks in advance.


我忘了提到几个页面(aspx)加载了该控件,而且每次的URL都不同。因此,我需要根据调用页面来执行它。 - RonenIL
1个回答

8
使用模板字段并在其中添加超链接。
<asp:TemplateField HeaderText="Request No.">
   <ItemTemplate>
     <asp:HyperLink ID="EditHyperLink1" runat="server" 
          NavigateUrl='<%# Page.Request.Path + "?reqid=" + Eval("ReqId") %>'
          Text='<%# Eval("ReqId") %>' >
     </asp:HyperLink>
   </ItemTemplate>
</asp:TemplateField>

或者您可以使用GridView_RowDatabound事件处理程序,并更改特定控件的Navigateurl。

protected void myGV_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        HyperLink myHL = (HyperLink)e.Row.FindControl("EditHyperLink1");
        myHL.NavigateUrl = Page.Request.Path + "?reqid=" + e.Row.Cells[0].Text.ToString();
    }
}

我假定ReqId在第一个单元格中出现。

你能给我一个GridView_RowDatabound的例子吗? - RonenIL
谢谢askids!最后一个问题,你认为哪个更好? - RonenIL
我认为第一种方法更简单。但是如果你需要高级解析或其他操作,那么请使用rowdatabound。例如,我正在生成一个链接,其中字段值带有“+”符号。必须将“+”符号转换为%2B才能使链接实际工作。在这种情况下,我必须使用rowdatabound进行字符串操作。因此,每当有机会时,我仍然会选择第一种选项,因为它更简单。 - askids

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