代码之家  ›  专栏  ›  技术社区  ›  Bob Tway

中继器中的复选框控件不保持状态

  •  1
  • Bob Tway  · 技术社区  · 14 年前

    对此有点困惑。我的印象是,如果您将服务器控件添加到中继器的ItemTemplate中,那么分配给这些控件的ID将在回发期间保持不变,并且状态将保持不变。但这似乎没有发生。这是我的项目模板:

    <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
    

    2 回复  |  直到 14 年前
        1
  •  2
  •   Andrew M    14 年前

    根据CyberDude的评论,数据绑定时可能正在重置值。如果可能的话,尝试在第一页加载时使用IsPostback到only databind。

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

    (抱歉,这不是VB,但要点应该是一样的)

        2
  •  0
  •   Angel Hawks    12 年前

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