【问题标题】:CheckBox Controls in Repeater not maintaining state中继器中的复选框控件未保持状态
【发布时间】:2020-01-21 23:17:55
【问题描述】:

对此有点困惑。我的印象是,如果您将服务器控件添加到转发器的 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。有人对为什么不维护状态以及我能做些什么有任何建议吗?

【问题讨论】:

  • 您是否也将转发器绑定到回发?
  • 是的。每个 Page_Load。不幸的是,我想我可能需要使用一些 javascript 来执行此操作。
  • 为什么要在每个 page_load 上对您进行数据绑定?我在这方面的“流程”:第一次请求数据绑定,接收回发,处理收到的复选框,然后我可以绑定复选框。否则会有例如如果您的数据源中不再存在 checkox 值,则会出现问题 ...

标签: asp.net checkbox repeater


【解决方案1】:

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

C#

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

VB

If Not IsPostBack Then
  rptPendingItems.DataBind()
End If

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

【讨论】:

  • 好的,谢谢。我确实需要在每个 page_load 上都这样做,因为回发时值会发生变化。我通过使用 javascript 将选中的值存储在隐藏字段控件中来解决它,该控件具有附加到复选框的 onclick 事件的函数。
  • 我遇到了同样的问题,使用回发检查为我解决了这个问题。谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多