Repeater中的CheckBox控件不保持状态

时间:2010-11-10 12:00:57

标签: asp.net checkbox repeater

有点困惑。我的印象是,如果您将服务器控件添加到转发器的ItemTemplate中,那么分配给这些控件的ID将在回发中保留,并且状态将得到维护。但它似乎并没有发生。这是我的ItemTemplate:

<asp:HiddenField ID="hidPending" runat="server" value="<%# DataBinder.Eval(Container.DataItem, "Id")%>" />
<td class="leftpadd"><uc:restrictedtext ID="uclblCategory" runat="server" Width="125" /></td>
<td style="border-left:1px solid #528ABD;" class="leftpadd"><%# DataBinder.Eval(Container.DataItem, "SelectedOptions")%></td>
<td style="border-left:1px solid #528ABD;" class="leftpadd"><%# DataBinder.Eval(Container.DataItem, "Price.IncludingTax", "{0:C}")%></td>
<td style="border-left:1px solid #528ABD;" class="leftpadd"><%# DataBinder.Eval(Container.DataItem, "ExtrasCost", "{0:C}")%></td>
<td style="border-left:1px solid #528ABD;" class="leftpadd"><%# DataBinder.Eval(Container.DataItem, "Quantity", "{0:000}")%></td>
<td style="border-left:1px solid #528ABD;" class="leftpadd"><asp:CheckBox ID="chkPendingItems" runat="server" /></td> 

哪个人好。我希望发生的是用户能够使用复选框从转发器中选择某些项目,并在点击转发器外部的按钮时“处理”它们(即对这些项目执行一些数据操作)。这是我的按钮点击代码:

Private Sub lnkPendingProcessSelected_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkPendingProcessSelected.Click
    For Each rItem As RepeaterItem In rptPendingItems.Items
        If rItem.ItemType = ListItemType.Item Or rItem.ItemType = ListItemType.AlternatingItem Then
            Dim chk As CheckBox = DirectCast(rItem.FindControl("chkPendingItems"), CheckBox)
            If chk.Checked Then
                Dim orderItemId As Integer
                Dim hid As HiddenField = DirectCast(rItem.FindControl("hidPending"), HiddenField)
                orderItemId = CInt(hid.Value)
                My.Application.ManagerFactory.OrderManagerInstance.ChangeOrderItemStatus(orderItemId, Concrete.Cms.DataTransferObjects.OrderItemStatus.Processing)
            End If
        End If
    Next
End Sub

但如果您单步执行此操作,则会找到并正确分配复选框,但其Checked属性始终为False。任何人都有任何建议,为什么国家没有得到维护,我能做些什么呢?

2 个答案:

答案 0 :(得分:2)

根据Cyber​​Dude的评论,您可能在数据绑定时重置值。如果可能的话,尝试使用IsPostback仅在第一页加载时进行数据绑定。

if(!IsPostBack)
{
    rptPendingItems.DataBind();
}

(对不起,C#不是VB,但要点应该是相同的)

如果这不可能或不起作用,您可能必须手动获取并设置所有这些复选框值,并将其保留在您的数据集或会话或汇总中。

答案 1 :(得分:0)

我在页面上的用户控件中有一个转发器,其他用户控件会导致回发。在某些情况下,我想在回发时重新绑定,所以我在页面上创建了一个bool属性(IsDirty),当我想在回发时重新绑定数据时,我可以设置为true。然后在我的page_load中,我在数据绑定之前检查了(!IsPostBack || IsDirty)。