asp:GridView HYPERLINKFIELD - datanavigateurlformatstring中的asp代码

时间:2013-07-15 07:56:04

标签: c# asp.net gridview

我有一个按名称搜索产品的页面。 在许多页面中,我使用产品代码。如果用户不知道产品代码,我让他转到此页面,按名称搜索,然后选择其中一个结果并返回他来自的页面。

在按名称搜索的结果中,我设置了一个HyperLinkField,它将重定向到某个页面,并带有产品代码的参数。

我的代码是这样的:

 <asp:GridView ID="GridView1" Runat="server" 
  DataSource='<%# GetData(pName.Text) %>' AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="Name">
            <ItemStyle HorizontalAlign="Center" 
              VerticalAlign="Middle"></ItemStyle>
        </asp:BoundField>
        <asp:BoundField  DataField="Code"></asp:BoundField>
        <asp:ImageField ControlStyle-Width="150px"  ControlStyle-Height="150px" DataImageUrlField="PictureURL" ></asp:ImageField>
        <ASP:HYPERLINKFIELD text=">>" datanavigateurlfields="Code"  datanavigateurlformatstring="priceUpdater.aspx?ProductCode={0}"></ASP:HYPERLINKFIELD> 
    </Columns>
</asp:GridView>

其中GetData是一个函数,它返回一个Product类型的对象,包含字段,名称,代码,图像等。

如您所见,HYPERLINKFIELD中的此链接将重定向到名为priceUpdater的页面,其中包含产品代码的参数。

我希望这个页面是动态的。 我试图像这样添加一个参数到搜索页面

 <%string pageRequested = Page.Request.QueryString["SearchScreen"];%>

现在我试图像这样使用HYPERLINK:

<ASP:HYPERLINKFIELD text=">>" datanavigateurlfields="Code"  datanavigateurlformatstring="<%=pageRequested%>.aspx?ProductCode={0}"></ASP:HYPERLINKFIELD> 

但链接引用的页面与wrriten(http://mysite.com/%3C%=pageRequested%&gt; .aspx?ProductCode = 2450)一样纯文本

我该如何做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:3)

如果要使用HyperLinkField,则需要使用GetData查询字符串参数附带的值扩展pageRequested方法返回的数据源对象。

在这种情况下,HyperLinkField的标记将如下:

<asp:HyperLinkField text=">>" 
    datanavigateurlfields="PageRequested,Code"
    datanavigateurlformatstring="{0}.aspx?ProductCode={1}"></asp:HyperLinkField>

但是,只有将PageRequested作为公共字段或属性添加到GetData方法返回的对象时,此方法才有效。

如果这不是一个选项,那么您需要实施自己的"LinkField"控件,该控件继承自DataControlField或使用ItemTemplate Nitin建议。

答案 1 :(得分:1)

尝试:

<asp:TemplateField>                     
<ItemTemplate>
    <ASP:HYPERLINK text=">>" NavigateUrl='<%# String.Format("~/{0}.aspx?ProductCode={1}",Page.Request.QueryString["SearchScreen"],Eval("Code")) %>'></ASP:HYPERLINK> 
</ItemTemplate>
</asp:TemplateField>

答案 2 :(得分:1)

将HYPERLINKFIELD替换为包含HyperLink的TemplateField,并将其绑定在grid的rowdatabound事件中

<强> ASPX:

<asp:GridView ID="GridView1" runat="server" DataSource='<%# GetData(pName.Text) %>'
OnRowDataBound="Grd_RowDatabound"
    AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Name">
            <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle"></ItemStyle>
        </asp:BoundField>
        <asp:BoundField DataField="Code"></asp:BoundField>
        <asp:ImageField ControlStyle-Width="150px" ControlStyle-Height="150px" DataImageUrlField="PictureURL">
        </asp:ImageField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:HyperLink ID="lnkNavigate" runat="server" NavigateUrl="" Text=">>"></asp:HyperLink>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

<强>代码隐藏

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
            GridView1.DataBind();
    }

    public List<myData> GetData(string param)
    {
        List<myData> lst = new List<myData>();
        lst.Add(new myData() { Name = "Hello", Code = "World", PictureURL = "Images/Select.png" });
        return lst;
    }

    public string pageRequested
    {
        get {
            return Page.Request.QueryString["SearchScreen"];
        }
    }

    protected void Grd_RowDatabound(Object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            HyperLink lnkNavigate = (HyperLink)e.Row.FindControl("lnkNavigate");
            if (lnkNavigate != null)
            {
                myData obj = (myData)e.Row.DataItem;
                lnkNavigate.NavigateUrl = pageRequested + ".aspx?ProductCode="+obj.Code;
            }
        }
    }
}

public class myData
{
    public string Name { get; set; }
    public string Code { get; set; }
    public string PictureURL { get; set; }
}