2009-07-07 2 views
0

Я занимаюсь созданием динамического обзора, размещенного в разделе «Ввод данных пользователя с помощью динамических элементов управления», но с некоторой другой средой.ПОМОЩЬ! Получите значение переключателя динамического управления!

Ниже то, что я пытаюсь сделать:

Во-первых, когда пользователь нажимает на кнопку, она заполнит динамическую таблицу с радио-кнопки для анкетирование внутри заполнителя. Однако после нажатия кнопки «Отправить» я не смог получить ее ценность (для расчета счета). Все динамические элементы управления исчезли. Кроме того, я использую расширение ajax (updatePanel) для разработки и Я искал viewstate, но я понятия не имею.

У кого-нибудь есть идеи?

Здесь я включил некоторые из моего кода:


Page

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:Button ID="btnTest" runat="server" Text="Take Test" OnClick="btnTest_Click" Visible="False" /> 
      <asp:Label ID="lblTestErrMsg" runat="server" 

ForeColor="Red"></asp:Label><br /> 
       <table id="tblTest" runat="server" style="width: 100%"> 
        <tr> 
         <td> 
         <asp:PlaceHolder ID="phQuestionnaire" runat="server"></asp:PlaceHolder> 
          <br /> 
          </td> 
        </tr> 
        <tr> 
         <td> 
          </td> 
        </tr> 
        <tr> 
         <td> 
          <asp:Label ID="lblResult" runat="server"></asp:Label></td> 
        </tr> 
        <tr> 
         <td> 
         </td> 
        </tr> 
       </table> 
      </ContentTemplate> 
     </asp:UpdatePanel> 

Создание динамической функции Таблица

* v_dtTable и v_dtTable2 содержит данные из базы данных

 Private Sub CreateDynamicTable(ByVal v_dtTable As Data.DataTable, ByVal v_dtTable2 As Data.DataTable) 
    Me.phQuestionnaire.Controls.Clear() 
    Dim cols As Integer = v_dtTable.Rows.Count + 2 
    Dim rows As Integer = v_dtTable2.Rows.Count + 1 
    Dim mid As Integer = v_dtTable.Rows.Count/2 

    Dim tbl As Table = New Table() 
    tbl.ID = "tblQs" 
    tbl.BorderWidth = 1 
    tbl.CellPadding = 0 
    tbl.CellSpacing = 0 
    tbl.Width = 500 
    tbl.EnableViewState = True 

    Me.phQuestionnaire.Controls.Add(tbl) 
    For i As Integer = 0 To rows - 1 
     Dim tr As TableRow = New TableRow() 
     Dim rowCnt As Integer = 1 
     Dim colCnt As Integer = 0 

     For j As Integer = 0 To cols - 1 
      Dim tc As TableCell = New TableCell() 
      tc.BorderWidth = 1 
      Dim lbl As Label = New Label() 
      Dim bol As Boolean = False 

      If i = 0 Then  
       If j = 0 Then 
        tc.Text = "No." 

       ElseIf j = 1 Then 
        tc.Text = "Question" 

       Else 
        tc.Text = v_dtTable.Rows(j - 2).Item("scoreName") 
        tc.HorizontalAlign = HorizontalAlign.Center 
       End If 
       tc.BackColor = Drawing.Color.DeepSkyBlue 
       tc.ForeColor = Drawing.Color.White 
      Else 
       If v_dtTable2.Rows(i - 1).Item("isHeader") Then 
        bol = True 
        tc.Text = v_dtTable2.Rows(i - 1).Item("TestQuestion") 
        tc.Style("font-weight") = "bold" 

       ElseIf j = 0 Then 
        tc.Text = rowCnt 
        rowCnt += 1 

       ElseIf j = 1 Then 
        tc.Text = v_dtTable2.Rows(i - 1).Item("TestQuestion") 

       Else 
        Dim rBtn As RadioButton = New RadioButton 
        rBtn.GroupName = "rBtn" & rowCnt 
        rBtn.ID = "rBtn_" & rowCnt & "_" & colCnt 
        rBtn.InputAttributes("value") = v_dtTable.Rows(j - 2).Item("scoreValue") 
        colCnt += 1 
        If j = mid + 2 Then 
         rBtn.Checked = True 
        End If 

        tc.Controls.Add(rBtn) 
        tc.HorizontalAlign = HorizontalAlign.Center 
       End If 
      End If 

      If bol Then 
       tc.ColumnSpan = cols - 1 
       tr.Cells.Add(tc) 
       Exit For 
      Else 
       tr.Cells.Add(tc) 
      End If 
     Next j 

     tbl.Rows.Add(tr)       
    Next i 
End Sub 

Вычислить функцию Score

Private Sub subCalculateScore() 
    Dim tblQs As Table = CType(Me.phQuestionnaire.FindControl("tblQs"), Table) 
    Dim rb As New RadioButton 
    Dim score As Integer = 0 

    If Me.phQuestionnaire.FindControl("tblQs") Is Nothing Then 
    Else 
     For Each tr As TableRow In tblQs.Rows 
      For Each tc As TableCell In tr.Cells 
       For Each c As Control In tc.Controls 
        If c.GetType.ToString = rb.GetType.ToString Then 
         Dim rBtn As RadioButton = CType(c, RadioButton) 
         If rBtn.Checked Then 
          Dim strScore As String = rBtn.InputAttributes("value") 
          score += CInt(strScore) 
         End If 
        End If 
       Next 
      Next 
     Next 
    End If 

    Me.Label1.Text = score 
End Sub 

Просмотр для динамического сгенерированной таблицы

<table id="tblQs" cellspacing="0" cellpadding="0" border="0" style="border-width:1px;border-style:solid;width:500px;border-collapse:collapse;"><tr>   
<td style="border-width:1px;border-style:solid;"><span>No.</span></td> 
<td style="border-width:1px;border-style:solid;"><span>Question</span></td> 
<td style="border-width:1px;border-style:solid;"><span>dislike</span></td> 
<td style="border-width:1px;border-style:solid;"><span>normal</span></td> 
<td style="border-width:1px;border-style:solid;"><span>like</span></td> 
<td style="border-width:1px;border-style:solid;"><span>vry likes</span></td></tr><tr> 
<td style="border-width:1px;border-style:solid;"><span>1</span></td> 
<td style="border-width:1px;border-style:solid;"><span>question 1</span></td> 
<td style="border-width:1px;border-style:solid;"> 
    <input id="rBtn_1_0" type="radio" name="rBtn1" value="rBtn_1_0" value="0" /></td> 
<td style="border-width:1px;border-style:solid;"> 
    <input id="rBtn_1_1" type="radio" name="rBtn1" value="rBtn_1_1" value="1" /></td> 
<td style="border-width:1px;border-style:solid;"> 
    <input id="rBtn_1_2" type="radio" name="rBtn1" value="rBtn_1_2" checked="checked" value="2" /></td> 
<td style="border-width:1px;border-style:solid;"> 
    <input id="rBtn_1_3" type="radio" name="rBtn1" value="rBtn_1_3" value="3" /></td></tr></table> 

ответ

0

Спасибо Джейкоба за его решение.

Я могу рассчитать счет, внеся некоторые изменения для присвоения идентификатора.

Я добавил его значение в задней части идентификатора, так как значение, генерируемое то же самое с ID, как показано в источнике вида

rBtn.ID = "rBtn[" & rowCnt & "][" & colCnt & "]_" & value (eg. rBtn[1][0]_2) 

Затем я использовал подстроку, чтобы получить и вычислить оценку, как показано в функции subCalculateScore ниже:

Private Function subCalulateScore() As Integer 
    Dim score As Integer = 0 
    Dim expectedNumRows As Integer = Me.qsNum.Text 
    For i As Integer = 1 To expectedNumRows 
     Dim strBtn As String = Request.Form("rBtn" & i) 
     If Not strBtn Is Nothing Then 
      If strBtn.LastIndexOf("_") <> -1 Then 
       Dim strScore As String = strBtn.Substring(strBtn.LastIndexOf("_") + 1) 
       score += CInt(strScore) 
      End If 
     End If 
    Next 

    Return score 
End Function 

ха-ха .. звук как паршивый способ сделать это: р

Еще раз спасибо за вашу помощь, Яковом.

Всегда приветствуются любое другое решение ^^

0

Если имена сгенерированных группы кнопок радио достаточно предсказуемыми, вы можете получить их значения, проверяя коллекцию Request.Form , Предполагая, что имена групп: rBtn1, rBtn2 и т. Д., Данные post будут выглядеть примерно так: rBtn1 = 6 & rBtn2 = 7. Это означает, что вы можете сделать это:

Dim i as Integer 
Dim score as Integer = 0 
For i = 1 To expectedNumRows 
    score += CInt(Request.Form("rBtn" & i)) 
Next 

Это поможет вам обойти тот факт, что элементы управления, которые были созданы, прежде чем не-уже существует. Вы должны совать в отладчике и проверять коллекцию Request.Form, чтобы вы могли ознакомиться с тем, что там есть.

(мои извинения, если мой VB.NET неверности; я привык к C#)

+0

Hi Jacob. Спасибо за ваш ответ. Я понимаю, что вы имеете в виду. Как вы можете видеть, что в моей функции динамической таблицы Populate я пытался присвоить значение для нее с помощью inputAttributes. Однако это не работает, и значение, найденное в отладчике, было одинаковым с его идентификатором, поскольку мы можем быть найдены в источнике просмотра в качестве отредактированного сообщения. Можете ли вы дать мне какую-либо идею установить значение для динамически созданного переключателя? Я был бы очень признателен за вашу помощь и ваше предложение/решение. Спасибо большое :) – 2009-07-07 15:35:52

0

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

Protected Overrides Sub LoadViewState(ByVal savedState As Object) 
    MyBase.LoadViewState(savedState) 
    If IsPostBack Then 
     CreateMyControls() 
    End If 
End Sub