ASP.Net - Getting data from RepeaterItem

24,230

i.DataItem is not available (is null) at btnImport_Click but is available only at the ItemDataBound event (if I recall correctly the event name).

You can use a HiddenField to store the FileName then you will have to call i.FindControl.

Share:
24,230
Ant P
Author by

Ant P

Updated on July 25, 2022

Comments

  • Ant P
    Ant P almost 2 years

    I'm pretty new to ASP.Net and I'm not sure I'm going about this the right way. I have a Repeater which is bound to a list of "Image" objects. Within each RepeaterItem is a checkbox and I have a button OnClick event, which I want to display some attributes of the checked Image objects.

    The label updates, but the metadata is blank. DataBinder.Eval(i.DataItem, "FileName") is coming back null, but I'm not sure why? I thought perhaps the postback from the checkbox was causing problems but I still get the same issue if I try to display the data before any postbacks have occurred, so perhaps I'm not fetching the attributes correctly. Or am I going about this in completely the wrong way? Any help appreciated.

    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>