ASP.Net — Получение данных из RepeaterItem

#c# #asp.net #repeater #checkbox #dataitem

#c# #asp.net #повторитель #флажок #элемент данных

Вопрос:

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

Метка обновляется, но метаданные остаются пустыми. 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 элементы управления

Ответ №1:

i.DataItem недоступен (имеет значение null) в btnImport_Click , но доступен только в ItemDataBound событии (если я правильно помню название события).

Вы можете использовать a HiddenField для сохранения имени файла, после чего вам придется вызывать i.FindControl .

Ответ №2:

Я думаю, что в этом вопросе задается вопрос о том, как получить данные от повторителя при обратной передаче и, более конкретно, как взаимодействовать с флажком, который находится внутри повторителя. Итак, при обратной передаче другого элемента управления примером того, как это сделать, является;

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