ASP.NET CheckBox没有在回发时检查而没有奇怪的黑客攻击

时间:2016-08-01 21:35:11

标签: asp.net vb.net checkbox postback

我有GridView的复选框列。单击按钮时,应删除所有选中复选框的行。我不知何故偶然发现了一个奇怪而又狡猾的解决方案,我不知道它为什么会起作用。我已经搜索了相关的SO问题。

相关代码:

Protected Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Init
    ' I have no idea why this is needed for the checkboxes to work...
    Dim x = imageGridView.Rows
End Sub


Protected Sub RemoveButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles removeButton.Click

    For Each row As GridViewRow In imageGridView.Rows
        Dim selectCheckBox As CheckBox = DirectCast(row.Cells(0).FindControl("selectCheckBox"), CheckBox)
        If selectCheckBox.Checked Then
            Dim fileName As String = row.Cells(1).Text
            ImageList.Remove(ImageList.FindLast(Function(r) r.FileName = fileName))
        End If
    Next
    imageGridView.DataSource = ImageList
    imageGridView.DataBind()
End Sub

.aspx的:

<asp:GridView ID="imageGridView" runat="server">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:CheckBox ID="selectCheckBox" runat="server" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

要删除的行需要行Dim x = imageGridView.Rows。我在RemoveButton_Click子代码中尝试Page_Init代码后找到了这个代码,然后删除代码,直到它不再有效。 Dim x = imageGridView是不够的,Page_Load无法做同样的事情。

我的复选框永远不会被禁用。

所以,简单地说,为什么我需要在imageGridView.Rows中引用Page_Init以使我的代码有效?

1 个答案:

答案 0 :(得分:1)

这是一个有趣的行为。如果我在每个回发中将数据绑定到Page_Load中的GridView,我会重现该问题。在这种情况下,复选框会在回发时丢失其选择状态,但如果我们在imageGridView.Rows中引用Page_Init,则不会如您所见。

解决方案是绑定If Not IsPostBack条件块中的数据:

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        imageGridView.DataSource = ImageList
        imageGridView.DataBind()
    End If
End Sub

但是,在这种情况下,我们不得在imageGridView.Rows中引用Page_Init。这样做会导致复选框失去选择状态(!?!)。

从GridView的源代码(假设this source可靠),我注意到访问Rows集合会触发对EnsureChildControls的调用,然后调用CreateChildControls 。我还没有能够进入.NET代码,看看那时发生了什么。在Page_Init事件处理程序中调用这些方法可能比life cycle of the GridView中预期的要早。

顺便说一下,访问HeaderRowFooterRow属性也会触发对EnsureChildControls的调用,并对复选框的选择状态产生相同的影响。