【问题标题】:How to FindControls in repeater control?如何在中继器控件中查找控件?
【发布时间】:2010-12-16 17:33:43
【问题描述】:

我想根据 EventStartDate 启用或禁用“ParticipateBtn”。我收到此错误:对象引用未设置为对象的实例。

开始日期 :

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

【问题讨论】:

    标签: c# asp.net controls repeater


    【解决方案1】:

    控件在转发器中不存在,直到它被数据绑定,然后 ItemTemplate 中的每个控件每个项目都存在一次 - 因此,如果您绑定到具有 3 个项目的源,将有 3 个 ParticipateBtns。在找到它之前,您需要知道您想要哪一个。完成后,您可以像这样得到它:

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

    【讨论】:

      【解决方案2】:

      您可以使用声明性语法切换按钮控件的启用属性,并使用 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>
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2012-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多