2009-11-15 39 views
2

我想根据EventStartDate启用或禁用'ParticipateBtn'。我收到此错误:对象引用未设置为对象的实例。如何在中继器控制中查找控件?

<table> 
     <tr> 
      <td align="right" style=" font-weight:bold">Start Date : </td> 
      <td><%# CheckEnability((DateTime)Eval("Event_Start_Date")) %></td> 
     </tr> 


     <asp:Button ID="ParticipateBtn" CommandName="Participate" CommandArgument='<%# Eval("Event_Id") + "|" + Eval("Event_Name") + "|" + Eval("Volume") + "|" + Eval("Tournament_Id") %>' runat="server" Text="Participate" />&nbsp;&nbsp; 

    </ItemTemplate> 
    <FooterTemplate></FooterTemplate> 
    <SeparatorTemplate><hr style="color:Silver; height:1px;" /></SeparatorTemplate> 
</asp:Repeater> 

//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"); 
} 

回答

1

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

<asp:Repeater> 
    <table> 
     <tr> 
      <td align="right" style=" font-weight:bold">Start Date : </td> 
      <td><%# Eval("Event_Start_Date", "{0:yyyy-MM-dd}")%></td> 
     </tr> 
     <asp:Button ID="ParticipateBtn" Enabled='<%# Convert.ToDateTime(Eval("Event_Start_Date")) < DateTime.Now %>' CommandName="Participate" CommandArgument='<%# Eval("Event_Id") + "|" + Eval("Event_Name") + "|" + Eval("Volume") + "|" + Eval("Tournament_Id") %>' runat="server" Text="Participate" />&nbsp;&nbsp; 
    </ItemTemplate> 
    <FooterTemplate></FooterTemplate> 
    <SeparatorTemplate><hr style="color:Silver; height:1px;" /></SeparatorTemplate> 
</asp:Repeater> 
5

控件不处于转发存在,直到它已被数据绑定,然后每个项目在ItemTemplate每个控制存在一次 - 如果你绑定到3个项目的来源,将有3个ParticipateBtns。你需要知道你想要哪一个,然后才能找到它。一旦你这样做,你可以得到它,像这样:

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

将属性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;    
    }  
}