ASP.NET CheckBox not checked on postback without weird hack

被刻印的时光 ゝ 提交于 2019-12-22 10:06:53

问题


I have a GridView with a checkbox column. On clicking a button, all rows with the checkbox checked should be removed. I somehow stumbled upon a strange and hacky solution, and I have no idea why it works. I already searched through related SO questions already.

Related code:

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>

The line Dim x = imageGridView.Rows is needed for the rows to be removed. I found this after trying my RemoveButton_Click code in the Page_Init sub, then removing code until it didn't work anymore. Dim x = imageGridView is not enough, and it doesn't work to do the same thing in Page_Load.

My checkboxes are never disabled.

So, simply put, why is it necessary for me to reference imageGridView.Rows in the Page_Init for my code to work?


回答1:


That is an interesting behavior. I reproduce the problem if I bind the data to the GridView in Page_Load on every postback. In that situation, the check boxes lose their selection state on postback, but not if we refer to imageGridView.Rows in Page_Init, as you observed.

The solution is to bind the data inside an If Not IsPostBack conditional block:

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

In that case, however, we must NOT refer to imageGridView.Rows in Page_Init. Doing so causes the check boxes to lose their selection state (!?!).

From the source code of the GridView (assuming that this source is reliable), I notice that accessing the Rows collection triggers a call to EnsureChildControls which then calls CreateChildControls. I haven't been able to step into the .NET code to see what happens at that point. Calling these methods in the Page_Init event handler may come earlier than expected in the life cycle of the GridView.

By the way, accessing the HeaderRow and the FooterRow properties also triggers a call to EnsureChildControls, and has the same effect on the selection status of the check boxes.



来源:https://stackoverflow.com/questions/38708500/asp-net-checkbox-not-checked-on-postback-without-weird-hack

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!