在自定义控件中绑定Repeater,将读取器传递到公共类.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中,不再有Object引用未设置为对象错误的实例,但这显然是不正确的。

有人在这里看到了中继器不绑定的原因吗?非常感谢任何帮助或指示。

解决了这个问题。有几个问题。

在卡片显示中,页面加载

card_repeater.ItemDataBound +=new RepeaterItemEventHandler(card_repeater_ItemDataBound);

不需要

在getCards 中

card_display cardpanel;
cardpanel = new card_display();

不需要,而是在setDataSource中需要像一样调用对象

committee_cardView.DataSource=reader;
committee_cardView.DataBind();

最新更新