ASP.Net Repeater:复选框已选中状态不会在表单提交时持续存在
ASP.Net Repeater: Checkboxes checked status not persisting on form submission
我在代码隐藏中绑定了一个复选框重复器:
<asp:Repeater runat="server" ID="rptOpenJobs" OnItemDataBound="rptOpenJobs_ItemDataBound">
<ItemTemplate>
<asp:CheckBoxList ID="lstOpen" runat="server"></asp:CheckBoxList>
</ContentTemplate>
</asp:Repeater>
代码隐藏(VB.Net):
Protected Sub rptOpenJobs_ItemDataBound(sender As Object, e As RepeaterItemEventArgs)
Dim jobsTable As New DataTable
Dim conn As String = "[hidden]" 'Connection String to retrieve data table values
If e.Item.ItemType.Equals(ListItemType.AlternatingItem) Or e.Item.ItemType.Equals(ListItemType.Item) Then
Dim cboxlist As CheckBoxList = e.Item.FindControl("lstOpen")
If cboxlist.Items.Count = 0 Then
cboxlist.DataSource = jobsTable
cboxlist.DataTextField = "job_title"
cboxlist.DataValueField = "job_title"
cboxlist.DataBind()
End If
End If
End Sub
提交表单时,选中的框不会保持选中状态。我一直在寻找解决方案,但没有找到列表在代码隐藏中的数据绑定位置。
我已经尝试在转发器和 CheckBoxList 周围添加一个 UpdatePanel,但选中状态仍然不会在提交表单时持续存在。
您的页面加载事件是什么样的?
您只能在 If IsPostBack = False 代码存根中第一次加载内容。
99%(如果不是 100%)的页面将使用该代码块。对我来说,来自 Access、VB6、vb.net?那么一个表单加载,我们有表单加载事件。
但是,单击该页面上的任何旧按钮也会触发 post 返回,加载事件将 运行 每次(然后按钮单击或任何事件代码将 运行).
所以,所有的网页都是这样的:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
' the REAL first time load event!!!
LoadGrid()
End If
End Sub
Sub LoadGrid()
Using cmdSQL As New SqlCommand("SELECT ID, FirstName, LastName, HotelName, City from tblHotels",
New SqlConnection(My.Settings.TEST3))
cmdSQL.Connection.Open()
GridView1.DataSource = cmdSQL.ExecuteReader
GridView1.DataBind()
End Using
End Sub
请注意我们是如何处理第一个页面加载事件的 - 我们加载了一个网格。但是,如果我们不将该代码放入 IsPostBack = False 部分,那么我们的设置代码和加载代码将 运行 每次整页 post 返回。
您拥有的复选框应该会为您保留,并且应该会在 post 返回的页面后继续存在。
我看不出你在哪里(如何)坚持作业 table,但是一旦加载中继器,它们应该在 post 返回后继续存在。我的意思是,数据绑定事件仅在您重新绑定转发器时才会触发。但是,如果您说由于添加新行或类似行,并且您再次触发 (need/want) 数据绑定事件,那么 jobsTable 确实需要存在并在您重新绑定转发器时保持不变。
因此,在您的代码中,您在页面加载时加载了 Repeater。上面的代码是一样的,例如:
并且由于 table 被 OVER 和 OVER 用于每个项目数据绑定事件,因此我们不应该在项目数据绑定事件中每次都重新拉取 table。我们应该在我们的 LoadGrid 例程中设置(加载)table 一次。
因此,在页面级别 class,我们将声明一个范围为 form/page 级别的 table 变量。这将在每个项目绑定事件期间持续足够长的时间,以便转发器填写复选框列表。
我们假设您有 hte repeter 的数据源 - 它会重复很多次。对于每个转发器,我们都有一个复选框列表,它还有一组我们要从选项的复选框列表中填充的值。
不是 100% 清楚每个新的复选框列表是否要从一个 table 驱动,当然每个重复的行确实有一个来自 table 的每一行的值表示所选复选框值的重复列表。
或者,每个重复项的复选框值列表是否不同?这个问题必须解决。
为我解决最后一个问题,然后我 post 更多关于它如何工作的代码。
Sub LoadGrid()
Using cmdSQL As New SqlCommand("SELECT ID, FirstName, LastName, HotelName, City from tblHotels",
New SqlConnection(My.Settings.TEST3))
cmdSQL.Connection.Open()
rptOpenJobs.DataSource = cmdSQL.ExecuteReader
rptOpenJobs.DataBind()
End Using
End Sub
我在代码隐藏中绑定了一个复选框重复器:
<asp:Repeater runat="server" ID="rptOpenJobs" OnItemDataBound="rptOpenJobs_ItemDataBound">
<ItemTemplate>
<asp:CheckBoxList ID="lstOpen" runat="server"></asp:CheckBoxList>
</ContentTemplate>
</asp:Repeater>
代码隐藏(VB.Net):
Protected Sub rptOpenJobs_ItemDataBound(sender As Object, e As RepeaterItemEventArgs)
Dim jobsTable As New DataTable
Dim conn As String = "[hidden]" 'Connection String to retrieve data table values
If e.Item.ItemType.Equals(ListItemType.AlternatingItem) Or e.Item.ItemType.Equals(ListItemType.Item) Then
Dim cboxlist As CheckBoxList = e.Item.FindControl("lstOpen")
If cboxlist.Items.Count = 0 Then
cboxlist.DataSource = jobsTable
cboxlist.DataTextField = "job_title"
cboxlist.DataValueField = "job_title"
cboxlist.DataBind()
End If
End If
End Sub
提交表单时,选中的框不会保持选中状态。我一直在寻找解决方案,但没有找到列表在代码隐藏中的数据绑定位置。
我已经尝试在转发器和 CheckBoxList 周围添加一个 UpdatePanel,但选中状态仍然不会在提交表单时持续存在。
您的页面加载事件是什么样的?
您只能在 If IsPostBack = False 代码存根中第一次加载内容。
99%(如果不是 100%)的页面将使用该代码块。对我来说,来自 Access、VB6、vb.net?那么一个表单加载,我们有表单加载事件。
但是,单击该页面上的任何旧按钮也会触发 post 返回,加载事件将 运行 每次(然后按钮单击或任何事件代码将 运行).
所以,所有的网页都是这样的:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
' the REAL first time load event!!!
LoadGrid()
End If
End Sub
Sub LoadGrid()
Using cmdSQL As New SqlCommand("SELECT ID, FirstName, LastName, HotelName, City from tblHotels",
New SqlConnection(My.Settings.TEST3))
cmdSQL.Connection.Open()
GridView1.DataSource = cmdSQL.ExecuteReader
GridView1.DataBind()
End Using
End Sub
请注意我们是如何处理第一个页面加载事件的 - 我们加载了一个网格。但是,如果我们不将该代码放入 IsPostBack = False 部分,那么我们的设置代码和加载代码将 运行 每次整页 post 返回。
您拥有的复选框应该会为您保留,并且应该会在 post 返回的页面后继续存在。
我看不出你在哪里(如何)坚持作业 table,但是一旦加载中继器,它们应该在 post 返回后继续存在。我的意思是,数据绑定事件仅在您重新绑定转发器时才会触发。但是,如果您说由于添加新行或类似行,并且您再次触发 (need/want) 数据绑定事件,那么 jobsTable 确实需要存在并在您重新绑定转发器时保持不变。
因此,在您的代码中,您在页面加载时加载了 Repeater。上面的代码是一样的,例如:
并且由于 table 被 OVER 和 OVER 用于每个项目数据绑定事件,因此我们不应该在项目数据绑定事件中每次都重新拉取 table。我们应该在我们的 LoadGrid 例程中设置(加载)table 一次。
因此,在页面级别 class,我们将声明一个范围为 form/page 级别的 table 变量。这将在每个项目绑定事件期间持续足够长的时间,以便转发器填写复选框列表。
我们假设您有 hte repeter 的数据源 - 它会重复很多次。对于每个转发器,我们都有一个复选框列表,它还有一组我们要从选项的复选框列表中填充的值。
不是 100% 清楚每个新的复选框列表是否要从一个 table 驱动,当然每个重复的行确实有一个来自 table 的每一行的值表示所选复选框值的重复列表。
或者,每个重复项的复选框值列表是否不同?这个问题必须解决。
为我解决最后一个问题,然后我 post 更多关于它如何工作的代码。
Sub LoadGrid()
Using cmdSQL As New SqlCommand("SELECT ID, FirstName, LastName, HotelName, City from tblHotels",
New SqlConnection(My.Settings.TEST3))
cmdSQL.Connection.Open()
rptOpenJobs.DataSource = cmdSQL.ExecuteReader
rptOpenJobs.DataBind()
End Using
End Sub