2011-11-12 73 views
6

Tôi khá mới đối với ASP.Net và tôi không chắc là mình đang đi đúng hướng. Tôi có một Repeater đó là ràng buộc vào một danh sách các đối tượng "Hình ảnh". Trong mỗi RepeaterItem là một hộp kiểm và tôi có một sự kiện OnClick, mà tôi muốn hiển thị một số thuộc tính của các đối tượng Image đã được kiểm tra.ASP.Net - Lấy dữ liệu từ RepeaterItem

Cập nhật nhãn, nhưng siêu dữ liệu trống. DataBinder.Eval (i.DataItem, "FileName") đang trở lại null, nhưng tôi không chắc chắn tại sao? Tôi nghĩ có lẽ postback từ hộp kiểm đã gây ra vấn đề nhưng tôi vẫn gặp vấn đề tương tự nếu tôi cố gắng hiển thị dữ liệu trước khi bất kỳ postback nào xảy ra, vì vậy có lẽ tôi không tìm nạp các thuộc tính một cách chính xác. Hoặc tôi đang đi về điều này một cách hoàn toàn sai? Bất kỳ trợ giúp nào được đánh giá cao.

Code:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     string importPath = Server.MapPath("~/Images/ForImport"); 
     ImageProcessor processor = new ImageProcessor(importPath); 

     rptImageList.DataSource = processor.ImageList; 
     rptImageList.DataBind(); 
    } 
} 

protected void btnImport_Click(object sender, EventArgs e) 
{ 
    foreach (RepeaterItem i in rptImageList.Items) 
    { 
     CheckBox chk = i.FindControl("chkSelectImage") as CheckBox; 
     if (chk.Checked) 
     { 
      Testlabel.Text += "Selected: " + DataBinder.Eval(i.DataItem, "FileName"); 
     } 
    } 
} 

HTML:

<asp:Repeater ID="rptImageList" runat="server"> 
    <ItemTemplate> 
    <div class="photoinstance"> 
     <asp:Image runat="server" ImageUrl='<%#"Images/ForImport/" +DataBinder.Eval(Container.DataItem, "FileName") %>' /> 
     <asp:CheckBox ID="chkSelectImage" AutoPostBack="true" runat="server"/> 
     <p><%#Eval("FileName")%> - <%#Eval("FileSize")%> bytes</p> 
     </div> 
    </ItemTemplate> 
</asp:Repeater> 
+1

Thuộc tính 'DataItem' chỉ khả dụng trước khi đăng lại, trong sự kiện' ItemDataBound'. Điều này không được chỉ ra rất tốt trên MSDN, nhưng là nhất quán trong suốt tất cả các điều khiển ASP.NET – jwiscarson

Trả lời

8

i.DataItem là không có sẵn (là null) tại btnImport_Click, chỉ có tại sự kiện ItemDataBound (nếu tôi nhớ chính xác tên sự kiện).
Bạn có thể sử dụng một HiddenField để lưu trữ FileName sau đó bạn sẽ phải gọi i.FindControl.

0

Tôi nghĩ câu hỏi này là hỏi cách lấy dữ liệu từ bộ lặp trên postback và cụ thể hơn cách tương tác với một Hộp kiểm nằm trong bộ lặp. Vì vậy, trên postback của điều khiển khác một ví dụ về làm thế nào để làm điều này là;

protected void CheckBox_CheckedChanged(object sender, EventArgs e) 
    { 
     foreach (RepeaterItem ri in Repeater.Items) 
     { 
      foreach (Control c in ri.Controls) 
      { 
       if (typeof(CheckBox) == c.GetType()) 
       { 
        CheckBox checkBox = (CheckBox)c; 
        checkBox.Checked = true; 
       } 
      } 
     } 
    } 
Các vấn đề liên quan