无法在列表视图中找到控件或指定值以导航url属性

时间:2015-06-16 10:03:54

标签: c# asp.net

希望今天大家都很好。

我遇到了一个我正在努力解决的小问题,我确信这可能是一件简单的事情,但是我盯着它的时间越长,看起来感觉就越不明显。

我有一个详细信息视图,其中包含listview。列表视图显示图像。我已经将图像包裹在asp:超链接但是无法从后面的代码设置navigateUrl,我试图从listviews数据绑定事件中做到这一点。由于某种原因,超链接控制很难找到。

我的.aspx:

<asp:DetailsView ID="productDetails" OnDataBound="productDetails_DataBound" runat="server" AutoGenerateRows="false">
    <Fields>

        <asp:TemplateField>
            <ItemTemplate>
                <div class="row">
                <div class="col-sm-12">
                <h2 id="prodNamelbl" runat="server" class="text-center"><%# Eval("ProductName") %></h2>
                    <asp:Image ID="prodMainImage" runat="server" ImageAlign="Middle" ImageUrl='<%# Eval("ImagePath") %>' />
                </div>

                </div>
                <div class="row">

                    <div class="col-sm-12">
                        <asp:ListView ID="listOtherImages" OnDataBound="listOtherImages_DataBound" OnPagePropertiesChanging="listOtherImages_PagePropertiesChanging" runat="server">
                             <LayoutTemplate>

                        <div class="row">
                            <div runat="server" id="itemPlaceholder"></div>
                        </div>
                       <asp:DataPager runat="server" PagedControlID="listOtherImages"  ID="imgListDataPager"
                            PageSize="3">
                            <Fields>
                                <asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="false" ShowPreviousPageButton="true"

                        ShowNextPageButton="false" />

                    <asp:NumericPagerField ButtonType="Link" />

                    <asp:NextPreviousPagerField ButtonType="Link" ShowNextPageButton="true" ShowLastPageButton="false" ShowPreviousPageButton = "false" />
                            </Fields>

                        </asp:DataPager>

                    </LayoutTemplate>

                    <ItemTemplate>



                                    <div class="col-sm-4">
                                        <asp:HyperLink ID="imgLink" runat="server" >
                                        <asp:Image ID="supImage" Height="80px" Width="80px" ImageAlign="AbsMiddle" AlternateText='<%# Eval("ImgId") %>' ImageUrl='<%# Eval("ImagePath") %>' runat="server" />
                                    </asp:HyperLink>

                                    </div>

                    </ItemTemplate>
                        </asp:ListView>
                    </div>
                </div>


            </ItemTemplate>
        </asp:TemplateField>
    </Fields>
</asp:DetailsView>

我的代码背后:

protected void listOtherImages_DataBound(object sender, EventArgs e)
{
    ListView imgs = (ListView)productDetails.FindControl("listOtherImages");
    foreach (ListViewItem item in imgs.Items)
    {
        try
        {
            // find controls
            Image prodImage = (Image)item.FindControl("supImg");
            HyperLink picLink = (HyperLink)item.FindControl("imgLink");
            // assign value to NavigateUrl
            picLink.NavigateUrl = "~/ProductCatalogue/prodImage.aspx?ImageId=" + prodImage.AlternateText;

        }
        catch (Exception err)
        {
            lblError.Text = "Error finding controls: " + err.Data + "<br />" + err.Message + "<br />" + err.InnerException;
        }

    }
}

感谢先进的任何可以提供帮助的人;)

1 个答案:

答案 0 :(得分:0)

我认为您不必要地循环遍历数据绑定事件上的列表视图项。更改功能如下,然后检查。

protected void listOtherImages_DataBound(object sender, ListViewItemEventArgs e)
{
    if(e.Item.ItemType == ListViewItemType.DataItem )
    {
        try
        {
            // find controls
            Image prodImage = (Image)e.Item.FindControl("supImg");
            HyperLink picLink = (HyperLink)e.Item.FindControl("imgLink");
            // assign value to NavigateUrl
            picLink.NavigateUrl = "~/ProductCatalogue/prodImage.aspx?ImageId=" + prodImage.AlternateText;

        }
        catch (Exception err)
        {
            lblError.Text = "Error finding controls: " + err.Data + "<br />" + err.Message + "<br />" + err.InnerException;
        }


    }
}

另外我注意到在数据绑定事件中你只是分配了超链接的navigateURL。您可以直接在ASPX中进行如下操作

<asp:HyperLink ID="imgLink" runat="server" 
 NavigateUrl='<%# "~/ProductCatalogue/prodImage.aspx?ImageId=" + Eval("ImgId") %>' 
 Checked='<%# Eval("IsActive") %>'>