Привязка повторителя в пользовательском контроле, передача читателя в открытый класс. 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();
Другие вопросы по тегам