2016-11-16 46 views
-1

我有一個幻燈片顯示來自文件夾的圖像的中繼器,以便當您單擊幻燈片中的當前圖像時,會打開一個產品頁面,其中顯示所選圖像的詳細信息。 同時,我有一個productModel列出數據庫中的所有圖像,這樣當您單擊任何圖像時,它將打開上面的圖像產品頁面。 現在,我擔心的是,我連接到中繼器的超鏈接會不斷從中繼器上顯示的不同圖像打開相同的產品頁面。任何人都可以請幫我指出我做錯了什麼?我將不勝感激!爲什麼我會從中繼器的不同圖像視圖中獲取相同的圖像ID?

<ul class="bjqs"> 
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound"> 
<ItemTemplate><li> 
<asp:HyperLink ID="link" runat="server">      
<img src='<%# DataBinder.Eval(Container.DataItem,"Value") %>' 
    title='<%# (DataBinder.Eval(Container.DataItem,"Text").ToString()).Split('.')[0].ToString() %>' alt=""> 
    </asp:HyperLink></li> 
</ItemTemplate> 
</asp:Repeater> 
</ul> 

服務器端代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 
    FillPage(); 
     string[] filePaths = Directory.GetFiles(Server.MapPath("~/pages/Management/Images/Products/")); 
     List<ListItem> files = new List<ListItem>(); 
     foreach (string filePath in filePaths) 
     {    
      string fileName = Path.GetFileName(filePath); 
      files.Add(new ListItem(fileName, "/pages/Management/Images/Products/" + fileName)); 
     } 
     Repeater1.DataSource = files; 
     Repeater1.DataBind(); 
    } 
} 

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 

     ProductModel productModel = new ProductModel(); 
    List<Product> products = productModel.GetAllProducts(); 

    foreach (Product product in products) 
    { 
     Panel productPanel = new Panel();   
     HyperLink hp = (HyperLink)e.Item.FindControl("link"); 
     hp.NavigateUrl = "~/pages/Product.aspx?id=" + product.ID; 
    } 
} 
+0

爲什麼你得到新的產品列表,並通過他們在你的ItemDataBound事件循環?我不確定你在做什麼,但從粗略一眼看來,它看起來像是有一個根本的濫用ItemDataBound事件。 –

+0

您能否確定我出錯的地方? –

+0

我不能幫你太多,因爲我真的不知道你在做什麼。 ItemDataBound事件將觸發文件列表中的每個單獨項目(無論您綁定到哪個項目)。您可以訪問RepeaterItemEventArgs e中的每個項目,以從中獲取所需內容。顯然你綁定的是一個帶有文件名的字符串對象。也許你想綁定到產品列表,然後將每個產品附加到文件?真的取決於你。希望理解中繼器和ItemDataBound事件可以幫助你弄清楚你想做的更好。 –

回答

-1
protected void Page_Load(object sender, EventArgs e) 
{ 
    FillPage(); 
    if (!IsPostBack) 
    { 
     GetData(null, null, null, null); 
    } 

    DbRetrival(); 

} 


protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 

    string ID = DataBinder.Eval(e.Item.DataItem, "ID").ToString(); 
    HyperLink hp = (HyperLink)e.Item.FindControl("link"); 
     hp.NavigateUrl = "~/pages/Product.aspx?id=" + ID ; 

} 


private void DbRetrival() 
{ 
    string cs = ConfigurationManager.ConnectionStrings["SuperStoreDBConnectionString"].ConnectionString; 
    SqlConnection con = new SqlConnection(cs); 
    DataTable dt = new DataTable(); 
    SqlDataAdapter adp = new SqlDataAdapter("Select ID,Image,Name from Product",con); 
    adp.Fill(dt); 

     Repeater1.DataSource = dt; 
    Repeater1.DataBind(); 
} 

private void FolderRetrival() 
{ 
    string[] filePaths = Directory.GetFiles(Server.MapPath("~/pages/Management/Images/Products/")); 
    List<ListItem> files = new List<ListItem>(); 
    foreach (string filePath in filePaths) 
    { 

     string fileName = Path.GetFileName(filePath); 
     files.Add(new ListItem(fileName, "/pages/Management/Images/Products/" + fileName)); 
    } 
    Repeater1.DataSource = files; 
    Repeater1.DataBind(); 
} 

ASP頁:

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound"> 

<ItemTemplate> 
    <li> 

    <asp:HyperLink ID="link" runat="server">      
     <br /> <asp:Image runat="server" ImageUrl='<%#"~/pages/Management/Images/Products/" + String.Format("{0}", 
       Eval("Image")) %>' Width='180px' Height='145px' /> </Image> 
     <br /> <%# Eval("Name")%> 

    </asp:HyperLink> 
     </li> 
    </ItemTemplate> 

1

你有你的轉發每一個項目相同鏈接的原因是,當你綁定一個項目到中繼器每一個項目運行ItemDataBound事件。在該事件中,您循環遍歷每個Product項並在foreach循環中反覆覆蓋HyperLink NavigateURL,直到列表中的LAST產品爲超鏈接的剩餘值。

如果您設置了一個斷點並逐步通過ItemDataBound事件,您將看到此行爲。

我不能告訴你如何解決它,因爲我根本看不到你打算如何將文件映射到產品。一旦你這樣做,我會建議綁定你的中繼器到產品列表,並添加一個公共屬性到你的產品模型,它將保存你想要顯示的圖像的文件位置。這可以在ItemDataBound事件或aspx標記中進行設置,例如您現在正在使用src進行設置。

有關ItemDataBoundEvent的一些信息,包括如何獲取基礎數據項。

https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound(v=vs.110).aspx

+0

謝謝Adam,至少你讓我意識到很難將文件映射到如果沒有使用文件系統的方法,是否有我可以從數據庫創建幻燈片放映(圖片和標籤)?如果是的話,我會欣賞一些樣品 –

+0

第二個想法是,有沒有一種方法可以添加具有產品ID的標籤並使用Eval來設置值,然後在itemdatabound事件中找到控件並設置超鏈接的URL? –