ASP.Net - Получение данных из RepeaterItem - PullRequest
6 голосов
/ 12 ноября 2011

Я довольно новичок в ASP.Net и не уверен, что поступлю правильно.У меня есть повторитель, который привязан к списку объектов «Изображение».Внутри каждого RepeaterItem есть флажок, и у меня есть событие OnClick кнопки, на котором я хочу отобразить некоторые атрибуты отмеченных объектов Image.

Метка обновляется, но метаданные остаются пустыми.DataBinder.Eval (i.DataItem, "FileName") возвращается в ноль, но я не уверен, почему?Я подумал, что, возможно, обратная передача из флажка вызывала проблемы, но у меня все еще возникает та же проблема, если я пытаюсь отобразить данные до того, как произошла какая-либо обратная передача, поэтому, возможно, я неправильно выбираю атрибуты.Или я поступаю об этом совершенно неправильно?Любая помощь приветствуется.

Код:

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>

Ответы [ 2 ]

8 голосов
/ 12 ноября 2011

i.DataItem недоступен (равен нулю) в btnImport_Click, доступен только в событии ItemDataBound (если я правильно помню имя события).
Вы можете использовать HiddenField для хранения FileName, тогда вам придется вызывать i.FindControl.

0 голосов
/ 07 февраля 2014

Я думаю, что этот вопрос спрашивает, как получить данные из репитера при обратной передаче и, более конкретно, как взаимодействовать с CheckBox, который находится внутри репитера.Таким образом, при обратной передаче другого элемента управления пример того, как это сделать:

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