2011-11-12 5 views
6

Sono abbastanza nuovo su ASP.Net e non sono sicuro che lo farò nel modo giusto. Ho un ripetitore che è associato a un elenco di oggetti "Immagine". All'interno di ogni oggetto Repeater è presente una casella di controllo e ho un evento OnClick del pulsante, che desidero visualizzare alcuni attributi degli oggetti immagine selezionati.ASP.Net - Recupero dati da RepeaterItem

L'etichetta si aggiorna, ma i metadati sono vuoti. DataBinder.Eval (i.DataItem, "FileName") restituisce null, ma non sono sicuro del perché? Ho pensato che forse il postback dalla casella di controllo stava causando problemi, ma ho ancora lo stesso problema se provo a visualizzare i dati prima che si verifichino eventuali postback, quindi forse non sto recuperando gli attributi correttamente. O sto andando in questo modo completamente nel modo sbagliato? Qualsiasi aiuto apprezzato.

Codice:

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

La proprietà 'DataItem' è sempre disponibile solo prima del postback, nell'evento' ItemDataBound'. Questo non è indicato molto bene su MSDN, ma è coerente in tutti i controlli ASP.NET – jwiscarson

risposta

8

i.DataItem non è disponibile (è nullo) a btnImport_Click, è disponibile solo durante l'evento ItemDataBound (se ricordo bene il nome dell'evento).
È possibile utilizzare un campo nascosto per memorizzare FileName, quindi sarà necessario chiamare i.FindControl.

0

Penso che questa domanda si stia chiedendo come ottenere dati da un ripetitore sul postback e in particolare come interagire con un CheckBox che si trova all'interno di un ripetitore. Quindi sul postback di un altro controllo un esempio di come farlo è;

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