我有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
以使我的代码有效?
答案 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中预期的要早。
顺便说一下,访问HeaderRow
和FooterRow
属性也会触发对EnsureChildControls
的调用,并对复选框的选择状态产生相同的影响。