asp.net перебирает флажки, получая значения для отправки на другую страницу - PullRequest
0 голосов
/ 10 августа 2011

Я пытаюсь перебрать несколько флажков, которые я создал на моей странице aspx.Я хотел бы получить все значения и проанализировать их в строку для отправки на другую страницу в качестве переменных записи.Это то, что у меня есть:

Страница 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 ]

2 голосов
/ 10 августа 2011

Вы можете пройтись по элементам управления страницей и узнать (мой 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 голос
/ 10 августа 2011

Вы можете перебрать коллекцию элементов управления страницы, но тогда вы не найдете CheckBox, которые находятся внутри элементов управления контейнера, таких как Table или GridView.

Это найдет все Флажки:

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
1 голос
/ 10 августа 2011

Не является прямым ответом на ваш вопрос, но если у вас нет особых причин не делать этого, вы просто должны отправить форму непосредственно на другую страницу. Не связывайтесь с кодом, который будет хрупким и подверженным ошибкам.

Используйте свойство 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

0 голосов
/ 10 августа 2011

Другой вариант, основанный на том, что вы сказали сделать с этим, - полностью пропустить элемент управления Checkbox и использовать вместо него обычные флажки. Я предлагаю это, потому что с этим легче иметь дело.

Например, вы бы добавили в ваш html следующее (главное, чтобы вы указали одинаковое значение атрибута name для всех из них и присвоили этому значению что-то значимое):

<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", если вы отметите эти два поля. передайте это значение непосредственно в строке запроса на следующую страницу, где вы можете разбить значение на массив и работать с каждым значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...