asp.net循环复选框获取要发送到另一个页面的值

时间:2011-08-10 17:38:26

标签: asp.net vb.net checkbox

我正在尝试遍历我在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变量检查这些值,并从中构建一个列表视图。 (报告页面,基本上允许用户选择他们希望在报告中看到的列的复选框)

非常感谢任何帮助或方向! 谢谢!

4 个答案:

答案 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"。然后,您可以直接将此值在查询字符串中传递到下一页,您可以将值拆分为数组并使用每个值。