Можно ли использовать счетчик цикла for в VB для изменения переменных, на которые ссылаются каждый раз? - PullRequest
2 голосов
/ 11 января 2010

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

Опрос кодируется в VB.NET. Данные отправляются в базу данных SQL. Все переключатели имеют одинаковое название, поэтому в вопросе меняется только номер - думая, что это облегчит кодирование на стороне сервера. В коде позади я надеялся сделать что-то для эффекта:

For i = 1 To 21
    If rbLWHFQ_Q(i)A1.Checked Then
        myCommand.Parameters.AddWithValue("@LWHFQ_Q(i)", rbLWHFQ_Q(i)_A1.Value)
    ElseIf rbLWHFQ_Q(i)_A2.Checked Then
        myCommand.Parameters.AddWithValue("@LWHFQ_Q(i)", rbLWHFQ_Q(i)_A2.Value)
    ElseIf rbLWHFQ_Q(i)_A3.Checked Then
        myCommand.Parameters.AddWithValue("@LWHFQ_Q(i)", rbLWHFQ_Q(i)_A3.Value)
    ElseIf rbLWHFQ_Q(i)_A4.Checked Then
        myCommand.Parameters.AddWithValue("@LWHFQ_Q(i)", rbLWHFQ_Q(i)_A4.Value)
    ElseIf rbLWHFQ_Q(i)_A5.Checked Then
        myCommand.Parameters.AddWithValue("@LWHFQ_Q(i)", rbLWHFQ_Q(i)_A5.Value)
    ElseIf rbLWHFQ_Q(i)_A6.Checked Then
        myCommand.Parameters.AddWithValue("@LWHFQ_Q(i)", rbLWHFQ_Q(i)_A6.Value)
    ElseIf rbLWHFQ_Q(i)_A7.Checked Then
        myCommand.Parameters.AddWithValue("@LWHFQ_Q(i)", rbLWHFQ_Q(i)_A7.Value)
    ElseIf rbLWHFQ_Q(i)_A8.Checked Then
        myCommand.Parameters.AddWithValue("@LWHFQ_Q(i)", rbLWHFQ_Q(i)_A8.Value)
    ElseIf rbLWHFQ_Q(i)_A9.Checked Then
        myCommand.Parameters.AddWithValue("@LWHFQ_Q(i)", rbLWHFQ_Q(i)_A9.Value)
    ElseIf rbLWHFQ_Q(i)_A10.Checked Then
        myCommand.Parameters.AddWithValue("@LWHFQ_Q(i)", rbLWHFQ_Q(i)_A10.Value)
    End If
Next i

Мое исследование говорит мне, что без какого-либо специального кодирования невозможно делать то, что я хочу. Я встречал упоминания о массивах в связи с этими типами вопросов в других местах, но я недостаточно знаком с массивами, чтобы понять, как они будут работать в этом случае.

Должен ли я создать 21 набор утверждений If ... Else? (

Вот как выглядит HTML для вопроса, если это имеет значение:

<tr class="statement220">
    <th><label for="rbLWHFQ_Q1_A1">1. Causing swelling in your ankles or legs?</label></th>
    <td title="0" >
        <input id="rbLWHFQ_Q1_A1" name="rbLWHFQ_Q1" type="radio" value="0" runat="server" />
    </td>
    <td title="1" >
        <input id="rbLWHFQ_Q1_A2" name="rbLWHFQ_Q1" type="radio" value="1" runat="server" />
    </td>
    <td title="2" >
        <input id="rbLWHFQ_Q1_A3" name="rbLWHFQ_Q1" type="radio" value="2" runat="server" />
    </td>
    <td title="3" >
        <input id="rbLWHFQ_Q1_A4" name="rbLWHFQ_Q1" type="radio" value="3" runat="server" />
    </td>
    <td title="4" >
        <input id="rbLWHFQ_Q1_A5" name="rbLWHFQ_Q1" type="radio" value="4" runat="server" />
    </td>
    <td title="5" >
        <input id="rbLWHFQ_Q1_A6" name="rbLWHFQ_Q1" type="radio" value="5" runat="server" />
    </td>
</tr>

Кроме того, я знаю о RadioButtonLists, но в этом случае мне нужно по-особому стилизовать переключатели и не могу заставить их работать, когда ASP отображает элементы списка.

Обновлено, чтобы показать, что я использовал его в своем коде Я не уверен, как StackOverflow работает, чтобы показать, как что-то работает для вас, но я просто хотел добавить это на случай, если другие придут сюда в поисках ответа. В основном, я использовал код ниже:

Dim radioButtons()() As HtmlInputRadioButton = { _
    New HtmlInputRadioButton() {rbLWHFQ_Q1_A1, rbLWHFQ_Q1_A2, rbLWHFQ_Q1_A3, rbLWHFQ_Q1_A4, rbLWHFQ_Q1_A5, rbLWHFQ_Q1_A6}, _
    New HtmlInputRadioButton() {rbLWHFQ_Q2_A1, rbLWHFQ_Q2_A2, rbLWHFQ_Q2_A3, rbLWHFQ_Q2_A4, rbLWHFQ_Q2_A5, rbLWHFQ_Q2_A6}, _
    ...
    }

Я создал массив с именами групп переключателей:

Dim radioButtonGroupNames() As String = { _
    "@LWHFQ_Q1", _
    "@LWHFQ_Q2", _
    ...
    }

Тогда в моем цикле For ... я использовал:

For i = 0 To 20
    If radioButtons(i)(0).Checked Then
        myCommand.Parameters.AddWithValue(radioButtonGroupNames(i), radioButtons(i)(0).Value)
    ElseIf radioButtons(i)(1).Checked Then
        myCommand.Parameters.AddWithValue(radioButtonGroupNames(i), radioButtons(i)(1).Value)
    ElseIf radioButtons(i)(2).Checked Then
        myCommand.Parameters.AddWithValue(radioButtonGroupNames(i), radioButtons(i)(2).Value)
    ElseIf radioButtons(i)(3).Checked Then
        myCommand.Parameters.AddWithValue(radioButtonGroupNames(i), radioButtons(i)(3).Value)
    ElseIf radioButtons(i)(4).Checked Then
        myCommand.Parameters.AddWithValue(radioButtonGroupNames(i), radioButtons(i)(4).Value)
    ElseIf radioButtons(i)(5).Checked Then
        myCommand.Parameters.AddWithValue(radioButtonGroupNames(i), radioButtons(i)(5).Value)
    End If
Next i

Ответы [ 2 ]

1 голос
/ 11 января 2010

Чтобы ответить на ваш вопрос напрямую, вы можете получить доступ к каждому элементу переключателя, если вы знаете элемент управления контейнера, в который они вложены, используя метод FindControl

((RadioButton)MyContainerControl.FindControl("rblWHQ_Q " + i + "_A2")).Checked

Однако для этого потребуется проверить все 210 элементов управления, чтобы найти 21 ответ. Лучшим способом было бы зациклить результаты коллекции Form:

For i As Integer = 1 To 21
 myCommand.Parameters.AddWithValue("@LWHFQ_Qi" + i, Request.Form("rblWHQ_Q" + i.ToString()))
Next

Извините, если есть ошибки, код выше, я в первую очередь C # Dev.

1 голос
/ 11 января 2010

Вам нужно создать массив массивов, содержащих ваши радиокнопки, например:

Dim radioButtons()() As HtmlInputRadioButton = { _
    New HtmlInputRadioButton { rbLWHFQ_Q1_A1, rbLWHFQ_Q1_A2, rbLWHFQ_Q1_A3, rbLWHFQ_Q1_A4, rbLWHFQ_Q1_A5 },
    New HtmlInputRadioButton { rbLWHFQ_Q2_A1, rbLWHFQ_Q2_A2, rbLWHFQ_Q2_A3, rbLWHFQ_Q2_A4, rbLWHFQ_Q2_A5 }, _
    ...
}

Обратите внимание, что массивы начинаются с нуля.

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