我正在尝试使用转发器制作一张桌子。然而,在转发器中的项目中,div表示我需要实现一些特定控件的逻辑。
我已经尝试了this但是它无效了,我得到了:
异常详细信息:System.NullReferenceException:不是对象引用 设置为对象的实例。
来源错误:
Line 35: HtmlGenericControl myDiv = (HtmlGenericControl)e.Item.FindControl("RepeaterBG");
Line 36:
Line 37: myDiv.Style.Add("background-color","green");
Line 38: }
Line 39: }
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
我的Html是:
<asp:Repeater runat="server" ID="MyStudents"
OnItemDataBound="rptArticleContent_ItemDataBound">
<HeaderTemplate>
<table><tr>
</HeaderTemplate>
<ItemTemplate>
<td>
<div runat="server" ID="RepeaterBG" > helli there</div>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
</td>
<td>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("RegistrationDate") %>'></asp:Label>
</td>
<td>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("Email") %>'></asp:Label>
</td>
</ItemTemplate>
<FooterTemplate>
</tr></table>
</FooterTemplate>
</asp:Repeater>
我的.CS
protected void rptArticleContent_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Label lb = new Label();
lb.Text = "</tr><tr>";
e.Item.Controls.Add(lb);
HtmlGenericControl myDiv = (HtmlGenericControl)e.Item.FindControl("RepeaterBG"); // i get null here, it seems to not find it at all!
myDiv.Style.Add("background-color","green"); // problem here
}
我哪里出错?!
答案 0 :(得分:2)
您应该检查项目类型,而不是“在标题中搜索”,例如
protected void rptArticleContent_ItemDataBound(object sender, RepeaterItemEventArgs e)
if (e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem) {
// search for control here
}
}
答案 1 :(得分:1)
您需要检查并确保您的商品是数据商品。如果您在发布的示例链接中看到,则ItemDataBound事件中的第一行是:
if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType !=
ListItemType.AlternatingItem) return;
IIRC,那是因为ItemDataBound事件中的第一项是标题项。您必须检查项目是否为数据项。
答案 2 :(得分:0)
在运行时,您无法以这种方式从转发器内部获取项目,因为在执行代码后会添加转发器中的控件。
相反,您需要在数据绑定中对单个项目执行FindControl。要执行此操作,请在转发器上设置onItemDataBound事件,并在触发每个项目的事件中执行逻辑。您可以在事件参数的项属性中找到项模板中的控件。
例如:
在你的转发器上:
<asp:Repeater id="Repeater1" OnItemDataBound="Repeater1OnItemDataBound" runat="server">
你的代码隐藏中的:
Public void Repeater1OnItemDataBound(Object Sender, RepeaterItemEventArgs e) {
HtmlGenericControl myDynamicRepeaterControl =
((HtmlGenericControl)e.Item.FindControl("MyDiv"))
//...do some work on myDynamicRepeaterControl
}