我有一个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
sub,然后删除代码,直到它不再起作用。Dim x = imageGridView
还不够,并且在中做同样的事情是行不通的Page_Load
.
我的复选框永远不会被禁用。
那么,简单来说,为什么我需要参考imageGridView.Rows
in the Page_Init
让我的代码正常工作?
这是一个有趣的行为。如果我将数据绑定到 GridView 中,我会重现该问题Page_Load
在每次回发时。在这种情况下,复选框在回发时会失去其选择状态,但如果我们参考imageGridView.Rows
in 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
in Page_Init
。这样做会导致复选框失去其选择状态(!?!)。
从 GridView 的源代码(假设这个来源 http://www.dotnetframework.org/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/fx/src/xsp/System/Web/UI/WebControls/GridView@cs/1546361/GridView@cs是可靠的),我注意到访问Rows
收集会触发调用EnsureChildControls
然后调用CreateChildControls
。我无法进入 .NET 代码来查看此时发生的情况。在中调用这些方法Page_Init
事件处理程序可能比预期更早出现GridView 的生命周期 http://thesitedoctor.co.uk/blog/complete-lifecycle-of-an-aspnet-page-and-controls/.
顺便说一句,访问HeaderRow
和FooterRow
属性也会触发调用EnsureChildControls
,并且对复选框的选择状态具有相同的效果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)