在repeateritem.findcontrol中找不到控件

时间:2014-03-07 15:47:34

标签: asp.net vb.net repeater findcontrol

我在表单中有一个嵌套的转发器,并将它们绑定到数据集中的表。我可以通过名称找到控件,并在Itemdatabound事件中读取和设置值,但是我无法在按钮单击事件中找到相同名称的控件。我可以找到转发器和物品。

 <asp:Repeater ID="rptrDivision" OnItemDataBound="rptrDivision_ItemDataBound" runat="server">
               <itemtemplate>
                <div class="fluid">
                  <div class="widget grid12">
                    <div class="whead"><div class="grid2"><h4 class="fieldDivision" >
                        <h4 class="fieldDivision" ><asp:Label ID="lblDivName" runat="server" Visible="True" ><%# DataBinder.Eval(Container.DataItem, "LocationName")%></asp:Label></h4></div>
                        <div class="grid10">
                          <div class="grid4 divAdmin" ><label><strong>Division Administrator: </strong> </label></div>
                        <div class="grid8 on_off">
                            <div class="floatL ml10"><asp:CheckBox ID="cbxDivMgr" name="chbox" runat="server" /></div>
                        </div>
                    </div></div>
                    <asp:Repeater ID="rptrCamera" OnItemDataBound="rptrCamera_ItemDataBound" runat="server" datasource='<%# Container.DataItem.Row.GetChildRows("CameraJoin")%>'>
                          <HeaderTemplate>
                              <div class="body">
                          </HeaderTemplate>
                          <itemtemplate>
                                 <div class="formRow">
                                    <div class="grid2">
                                        <asp:Label ID="CameraName" runat="server" ><strong><%# Container.DataItem("Name")%></strong></asp:Label> </div>
                                     <div class="grid10" >
                                         <asp:RadioButtonList ID="rblRoles" runat="server" CssClass="mr10" RepeatColumns="5" CellPadding="2" CellSpacing="2">
                                             <asp:ListItem Value="role1" >Role1</asp:ListItem>
                                             <asp:ListItem Value="role2">Role2  </asp:ListItem>
                                             <asp:ListItem Value="role3" >Role3 </asp:ListItem>
                                             <asp:ListItem Value="Role4">role4 </asp:ListItem>
                                             <asp:ListItem Value="none" Selected="True">N/A </asp:ListItem>
                                         </asp:RadioButtonList>

                                    </div>
                                  </div>
                              </itemtemplate>
                          <FooterTemplate>
                               </div>
                          </FooterTemplate>
                      </asp:Repeater>  
                  </itemtemplate>

        </asp:Repeater>
<asp:Button ID="btnSubmit" runat="server" Text="Submit"   CssClass="buttonM bBlue" OnClientClick="btnSubmit_Click" /> <asp:Button ID="btnCancel" runat="server" Text="Cancel" CssClass="buttonM bBlue" OnClientClick="btnCancel_Click"/>

提交按钮位于转发器之外,但格式相同

Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSubmit.Click

For Each Item As RepeaterItem In rptrDivision.Items
            If (Item.ItemType = ListItemType.Item) Or (Item.ItemType = ListItemType.AlternatingItem) Then
                DivLabel = CType(Item.FindControl("lblDivName"), Label)
                DivName = DivLabel.Text
                DivMgr = CType(Item.FindControl("cbxDivMgr"), CheckBox)
          '''do some logic
       End If
    Next
   End Sub

我查看了调试器并且项目具有正确数量的控件,因此我知道我在正确的位置,但转发器项目中的findcontrol无法按名称找到控件。它总是回来为null。

我可以从这里找到每个例子到MSDN论坛到asp.net到bytes.com显示循环遍历转发器中的项目并以相同的方式调用find控件。我无法弄清楚我做错了什么。

编辑: 所以这里是踢球者只是确保我不是疯了我通过转发器项目上的controlscollection做了一个循环,而在第二个控件上,如果我调用item.findControl(“lblDivName”),它会返回ID“lblDivName” )它返回一个空值。

1 个答案:

答案 0 :(得分:0)

控件事件(如Button的单击事件)发生在DataBound事件之前(有关详细信息,请参阅MSDN上的ASP.NET Page Life Cycle)。因此,您的Repeater还不是DataBound,因此它的数据绑定控件尚未初始化(它们为空)。

你有一些选择。

最好使用Repeater的数据绑定事件来处理它的数据项 - 因为这时您确定它们已初始化并填充了值。

但是,您可以在Click事件中处理之前调用“DataBind”:

Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSubmit.Click
    rptrDivision.DataSource = yourDataSource
    rptrDivision.DataBind()

    For Each Item As RepeaterItem In rptrDivision.Items
    ' The rest of your code                
End Sub

这应确保您的控件具有值。