我在表单中有一个嵌套的转发器,并将它们绑定到数据集中的表。我可以通过名称找到控件,并在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” )它返回一个空值。
答案 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
这应确保您的控件具有值。