Привязка повторителя в пользовательском контроле, передача читателя в открытый класс. OnItemDataBound не стреляет
Мне было поручено что-то несколько уникальное, и я не нашел подобного примера в своем исследовании. У меня есть ascx, и в этом ascx я регистрирую пользовательский элемент управления.
Ascx открывает соединение SQL, выполняет считыватель - и затем передает это считыватель в пользовательский элемент управления, в котором есть повторитель.
Пользовательский элемент управления загружен, однако я получаю сообщение об ошибке "Ссылка на объект не установлена на экземпляр объекта" на повторителе. Я пытался все нормальные вещи (и некоторые не так нормально) в попытке связать. Вот схема (некоторые вещи были опущены для краткости)
Основной ascx:
<%@ Control Language="c#" AutoEventWireup="false" Codebehind="card_caller.ascx.cs" Inherits="mynamespace.card_caller" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
..
..
<%@ register Tagprefix="club" Tagname="card_display" Src="/somefolder/card_display.ascx"%>
<h1> <%# _firstName %> <%# _lastName%></h1>
<div style="float:right;">
<club:card_display ID="committee_cardView" runat="server" />
</div>
Основной код ascx позади (соответствующие части):
private void Page_Load(object sender, EventArgs e) {
getCards();
}
private void getCards() {
SqlConnection connection = null;
SqlDataReader reader = null;
connection = new SqlConnection(ConfigurationData.databaseConnectionString);
SqlCommand sqlCommand = new SqlCommand("data.dbo.get_card_data", connection);
card_display cardpanel;
cardpanel = new card_display();
cardpanel.DataBind();
try {
sqlCommand.CommandType = CommandType.StoredProcedure;
connection.Open();
sqlCommand.Parameters.AddWithValue(...);
sqlCommand.Parameters.AddWithValue(...);
sqlCommand.Parameters.AddWithValue(...);
reader = sqlCommand.ExecuteReader();
cardpanel.setDataSource(reader);
}
finally {
if (reader != null) {
reader.Close();
}
if (connection != null) {
connection.Close();
}
}
}
На пользовательский элемент управления. Вот соответствующая часть пользовательского элемента управления - повторитель. Ничего странного здесь не происходит. Я использую OnItemDataBound.
<asp:repeater id="card_repeater" EnableViewState="true" OnItemDataBound="card_repeater_ItemDataBound" Visible="True" runat="server">
<itemtemplate>
<!-- stuff goes in here -->
</itemtemplate>
</asp:repeater>
Вот соответствующая часть пользовательского элемента управления
namespace mynamespace {
/// <summary>
/// card view display
/// </summary>
[Serializable]
public class card_display : BaseModuleControl {
private void Page_Load(object sender, EventArgs e) {
card_repeater.ItemDataBound +=new RepeaterItemEventHandler(card_repeater_ItemDataBound);
}
public void setDataSource(SqlDataReader reader) {
card_repeater.DataSource = reader;
card_repeater.DataBind();
}
}
protected void directory_repeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) {
_currentRecord = e.Item.DataItem as DbDataRecord;
<!--Do some stuff -->
}
}
}
}
Я не совсем уверен, что обработчик событий необходим при загрузке страницы. Возможно это не является обязательным из-за проблемы доступности?
Отладчик пробирается через метод setDataSource и взрывается в card_repeater.DataBind().
Если я объявлю card_repeater = new Repeater(); в setDataSource больше нет ссылки на объект, не установленной для экземпляра ошибки объекта - но это, очевидно, неверно.
Кто-нибудь видит здесь что-то очевидное, почему повторитель не является обязательным? Любая помощь или указатели очень ценятся.
1 ответ
Решено это. Было несколько проблем.
В card_display, загрузка страницы
card_repeater.ItemDataBound +=new RepeaterItemEventHandler(card_repeater_ItemDataBound);
не нужен
в getCards
card_display cardpanel;
cardpanel = new card_display();
не требуется, вместо этого в setDataSource объект должен вызываться как
committee_cardView.DataSource=reader;
committee_cardView.DataBind();