如何在转发器控制中查找控件?

我想启用或禁用’ParticipateBtn’,具体取决于EventStartDate。 我收到此错误:对象引用未设置为对象的实例。

开始日期:

<asp:Button runat="server" ID="ParticipateBtn" CommandName="Participate" CommandArgument='' Text="Participate" />      

背后的代码……

 //Code behind protected string CheckEnability(DateTime eventstartdate) { if (eventstartdate.Date < DateTime.Now.Date) { Button btn = (Button)Repeater1.FindControl("ParticipateBtn"); btn.Enabled = false; } return eventstartdate.ToString("yyyy-MM-dd"); } 

您可以使用声明性语法切换按钮控件的enabled属性,并使用Eval方法format参数显示和格式化Event_Start_Date 。 这样就不需要CheckEnability方法了。

       
Start Date : <%# Eval("Event_Start_Date", "{0:yyyy-MM-dd}")%>

转发器中的控件在数据绑定之前不存在,然后ItemTemplate中的每个控件都存在一个项目 – 因此,如果绑定到包含3个项目的源,则将有3个ParticipateBtns。 在找到之前,您需要知道自己想要哪一个。 一旦你这样做,你可以这样做:

 myRepeater.Items[1].FindControl("ParticipateBtn"); 

将属性OnItemDataBound="repeater_ItemDataBound"到转发器。

然后在你的代码后面做:

 void repeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e) { if (((DateTime)e.Item.DataItem).Date < DateTime.Now.Date) { Button participate = (Button)e.Item.FindControl("ParticipateBtn"); participate.Enabled = false; } }