ASP.Net - Получение данных из RepeaterItem
Я довольно новичок в ASP.Net и не уверен, что поступлю правильно. У меня есть повторитель, который связан со списком объектов "Изображение". Внутри каждого RepeaterItem есть флажок, и у меня есть событие OnClick кнопки, которое я хочу отобразить некоторые атрибуты проверенных объектов изображения.
Метка обновляется, но метаданные пустые. 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 ответа
i.DataItem недоступен (равен нулю) в btnImport_Click, доступен только в событии ItemDataBound (если я правильно помню имя события).
Вы можете использовать HiddenField для хранения FileName, тогда вам придется вызывать i.FindControl.
Я думаю, что этот вопрос спрашивает, как получить данные из повторителя при обратной передаче и, более конкретно, как взаимодействовать с 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;
}
}
}
}