我的任务有些独特,在我的研究中还没有发现类似的例子。我有一个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();