2011-11-12 110 views
6

我對ASP.Net非常陌生,我不確定我是否會以正確的方式進行操作。我有一個綁定到「Image」對象列表的Repeater。在每個RepeaterItem中都有一個複選框,並且我有一個按鈕OnClick事件,我想要顯示選中的Image對象的某些屬性。ASP.Net - 從RepeaterItem獲取數據

標籤更新,但元數據爲空。 DataBinder.Eval(i.DataItem,「FileName」)返回null,但我不確定爲什麼?我想也許回覆從複選框引起的問題,但我仍然遇到同樣的問題,如果我試圖在任何回發發生之前顯示數據,所以也許我沒有正確地獲取屬性。還是我完全用錯誤的方式去解決這個問題?任何幫助讚賞。

代碼:

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

'DataItem'屬性只在回發之前在ItemDataBound事件中可用。這在MSDN上沒有很好地指出,但在所有ASP.NET控件中都是一致的 – jwiscarson

回答

8

i.DataItem不可用(爲null)在btnImport_Click,僅適用於ItemDataBound事件(如果我沒有記錯的事件名稱)。
您可以使用HiddenField來存儲FileName,然後您將不得不調用i.FindControl。

0

我認爲這個問題是要求如何從回發站獲取數據,更具體地說,如何與中繼器內的複選框進行交互。所以在另一個控件的回發中,如何做到這一點的例子是;

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; 
       } 
      } 
     } 
    }