我正在尝试遍历我在aspx页面上创建的一堆复选框。我想获取所有值,并将它们解析为一个字符串,作为post变量发送到另一个页面。这就是我到目前为止所做的:
aspx页面:
<div class="ReportsCustomBox"><asp:CheckBox ID="CheckBox0" runat="server" /> Name</div>
<div class="ReportsCustomBox"><asp:CheckBox ID="CheckBox1" runat="server" /> Training Year</div>
<div class="ReportsCustomBox"><asp:CheckBox ID="CheckBox2" runat="server" /> Continuity Clinic</div>
etc...
aspx.vb文件:
Protected Sub Submit_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Submit.Click
Dim targetURL As String
targetURL = "report.aspx?"
' This is the part i can't figure out.
' For Each checkbox on page
'if checkbox is checked
'targetURL &= checkboxid & "=true&"
End Sub
我的目标是构建另一个页面,然后使用Querystring变量检查这些值,并从中构建一个列表视图。 (报告页面,基本上允许用户选择他们希望在报告中看到的列的复选框)
非常感谢任何帮助或方向! 谢谢!
答案 0 :(得分:2)
你可以循环浏览页面控件并找出答案(我的vb.net很生疏,但希望这能让你明白):
For Each ctrl As Control In Page.Controls
If TypeOf ctrl Is CheckBox AndAlso CType(ctrl, CheckBox).Checked Then
targetURL &= CType(ctrl, CheckBox).Id & "=true&"
End If
Next
答案 1 :(得分:1)
不直接回答您的问题,但除非您有特殊原因,否则您应该直接将表单发布到其他页面。不要乱用后面的代码,这些代码将是脆弱的,容易出错。
使用Button.PostbackUrl属性更改您要发布的页面
<asp:Button id="Submit" Text="Submit!" PostbackUrl="~/other-page.aspx"/>
在其他页面的代码隐藏中,使用Request.Form
来访问已发布的值。
根据您的具体情况,您甚至可以强力键入上一页,以便更轻松地访问属性和值。 http://dotnettipoftheday.org/tips/strongly-typed-access-to-previous-page.aspx
答案 2 :(得分:1)
你可以遍历页面的控件集合,但是你找不到像Table或GridView这样的容器控件里面的CheckBox。
这会找到所有复选框:
Public Module ExtensionMethods
<Runtime.CompilerServices.Extension()> _
Public Sub GetControlsRecursively(ByVal parentControl As System.Web.UI.Control, ByVal type As Type, ByRef controlCollection As List(Of Control))
If parentControl.GetType = type Then
controlCollection.Add(parentControl)
End If
For Each c As System.Web.UI.Control In parentControl.Controls
c.GetControlsRecursively(type, controlCollection)
Next
End Sub
End Module
您可以这样称呼它:
Dim allCheckboxes As New List(Of Control)
Me.Page.GetControlsRecursively(GetType(CheckBox), allCheckboxes)
以这种方式循环它们:
Dim txt As New System.Text.StringBuilder()
For Each chk As CheckBox In allCheckboxes
If chk.Checked Then txt.Append(chk.ID).Append("=true&")
Next
If txt.Length <> 0 Then txt.Length -= 1
Dim url = txt.ToString
答案 3 :(得分:0)
另一个选项,基于你所说的你想做的事情,将完全跳过整个Checkbox控件,而是选择正常的复选框。我建议这样做,因为它可以更容易处理。
例如,您可以在html中添加以下内容(主要是您为所有这些设置了相同的名称属性值,并将值设置为有意义的值):
<div class="ReportsCustomBox"><input type="checkbox" name="reportColumns" value="Name" /> Name</div>
<div class="ReportsCustomBox"><input type="checkbox" name="reportColumns" value="TrainingYear" /> Training Year</div>
<div class="ReportsCustomBox"><input type="checkbox" name="reportColumns" value="ContinuityClinic" /> Continuity Clinic</div>
然后,它将在Form集合中作为一个变量以逗号分隔的已检查值列表(例如,如果您选中这两个框,Request.Form("reportColumns")
将返回"Name,TrainingYear"
。然后,您可以直接将此值在查询字符串中传递到下一页,您可以将值拆分为数组并使用每个值。