ASP.NET CheckBox 没有在没有奇怪的 hack 的情况下在回发时被选中
ASP.NET CheckBox not checked on postback without weird hack
我有一个带有复选框列的 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
行。我在 Page_Init
子中尝试我的 RemoveButton_Click
代码后发现了这个,然后删除代码直到它不再工作。 Dim x = imageGridView
不够用,在Page_Load
.
做同样的事情也行不通
我的复选框从未被禁用。
那么,简单地说,为什么我必须在 Page_Init
中引用 imageGridView.Rows
才能使我的代码正常工作?
这是一个有趣的行为。如果我在每次回发时将数据绑定到 Page_Load
中的 GridView,我就会重现该问题。在那种情况下,复选框会在回发时失去它们的选择状态,但如果我们在 Page_Init
中引用 imageGridView.Rows
则不会,正如您观察到的那样。
解决方案是将数据绑定到 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
然而,在那种情况下,我们不能在 Page_Init
中引用 imageGridView.Rows
。这样做会导致复选框失去其选择状态 (!?!)。
来自 GridView 的源代码(假设 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。
顺便说一下,访问 HeaderRow
和 FooterRow
属性也会触发对 EnsureChildControls
的调用,并且对复选框的选择状态有相同的影响。
我有一个带有复选框列的 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
行。我在 Page_Init
子中尝试我的 RemoveButton_Click
代码后发现了这个,然后删除代码直到它不再工作。 Dim x = imageGridView
不够用,在Page_Load
.
我的复选框从未被禁用。
那么,简单地说,为什么我必须在 Page_Init
中引用 imageGridView.Rows
才能使我的代码正常工作?
这是一个有趣的行为。如果我在每次回发时将数据绑定到 Page_Load
中的 GridView,我就会重现该问题。在那种情况下,复选框会在回发时失去它们的选择状态,但如果我们在 Page_Init
中引用 imageGridView.Rows
则不会,正如您观察到的那样。
解决方案是将数据绑定到 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
然而,在那种情况下,我们不能在 Page_Init
中引用 imageGridView.Rows
。这样做会导致复选框失去其选择状态 (!?!)。
来自 GridView 的源代码(假设 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。
顺便说一下,访问 HeaderRow
和 FooterRow
属性也会触发对 EnsureChildControls
的调用,并且对复选框的选择状态有相同的影响。