#c# #asp.net
#c# #asp.net
Вопрос:
Я довольно новичок в ASP, и я немного озадачен этим. У меня есть repeater ( basicInfoReport
), связанный с источником данных ( basicInfo
). Эта часть работает нормально; Eval
вызовы в repeater возвращают правильные данные.
У меня также есть некоторый код, который предназначен для установки текста вместо <asp:Literal>
букв на странице. Я поместил фрагменты обоих ниже.
Насколько я могу судить, повторитель привязан к данным (поскольку Eval
вызовы работают), поэтому я не могу понять, почему он сообщает о нулевых элементах, и, следовательно, foreach
оператор ничего не делает. Кто-нибудь может помочь? 🙂
редактировать: решено, смотрите обновленный код еще ниже
ASP (удален ненужный материал)
<asp:AccessDataSource ID="basicInfo" runat="server"
DataFile="~/Disasters.accdb"
SelectCommand="SELECT * FROM [DisasterTable] WHERE ([ID] = ?)">
<SelectParameters>
<asp:QueryStringParameter Name="ID" QueryStringField="ID" Type="Int32" />
</SelectParameters>
</asp:AccessDataSource>
<asp:Repeater ID="basicInfoReport" runat="server" DataSourceID="basicInfo"
onitemdatabound="basicInfoReport_ItemDataBound">
<ItemTemplate>
<h2>Disaster report: <%#Eval("Description")#%></h2>
<b><i>This report is confidential.</i></b><br /><br /><br />
This event was reported on <tt><%#Eval("dateReported")#%></tt>. It was reported <asp:Literal ID="_wasReportedAnonymously" runat="server"></asp:Literal> and is currently <asp:Literal ID="_isEmergency" runat="server"></asp:Literal> classed as an emergency.
</ItemTemplate>
</asp:Repeater>
C # (удален ненужный материал)
protected void basicInfoReport_ItemDataBound(object sender, RepeaterItemEventArgs e) {
// [...]
// reader refers to an OleDbDataReader that is used for some database interaction in this method.
// until this point, basicInfoReport has not been referenced at all.
if (reader[1].ToString().Equals("False"))
{
// at this point basicInfoReport.Items.Count is always zero
foreach (RepeaterItem repeaterItem in basicInfoReport.Items) {
// control never makes it this far
if (repeaterItem.ItemType == ListItemType.Item || repeaterItem.ItemType == ListItemType.AlternatingItem)
{
Literal emergencyLiteral = (Literal)repeaterItem.FindControl("_isEmergency");
emergencyLiteral.Text = "not";
}
}
}
// [...]
}
Обновление: разобрался с этим благодаря помощи almog.ori. Для справки, вот рабочий код:
C # (удален ненужный материал)
protected void basicInfoReport_ItemDataBound(object sender, RepeaterItemEventArgs e) {
// [...]
// reader refers to an OleDbDataReader that is used for some database interaction in this method.
// until this point, basicInfoReport has not been referenced at all.
if (reader[1].ToString().Equals("False"))
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Literal emergencyLiteral = (Literal)e.Item.FindControl("_isEmergency");
emergencyLiteral.Text = "not";
}
}
// [...]
}
Комментарии:
1. Где вы пытаетесь получить количество элементов. Я не нашел эту строку кода из предоставленного вами кода.
2. В этом фрагменте кода это не так. Но если вы добавили «int count = basicInfoReport. Товары. Count » там, где находится комментарий, тогда он был бы равен нулю (в любом случае, это то, что происходит, когда я его запускаю).
Ответ №1:
Вам следует взглянуть на документацию msdn для события ItemDataBound, особенно обратите внимание на использование аргумента event.
void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
// This event is raised for the header, the footer, separators, and items.
// Execute the following logic for Items and Alternating Items.
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
Событие ItemDataBound передает вам «строку» в eventargs. Так что вы можете делать с ним все, что вам нравится. Вы должны посмотреть на e.Item.DataItem, который будет элементом данных для привязываемого элемента