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

时间:2009-11-15 04:21:21

标签: c# asp.net controls repeater

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

                             开始日期 :                 <%#CheckEnability((DateTime)Eval(“Event_Start_Date”))%>             

        <asp:Button runat="server" 
            ID="ParticipateBtn" 
            CommandName="Participate" 
            CommandArgument='<%# Eval("Event_Id") + "|" + Eval("Event_Name") + "|" + Eval("Volume") + "|" + Eval("Tournament_Id") %>' 
            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");
}

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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>

答案 2 :(得分:1)

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