2009-07-07 10 views
0

Je suis à la recherche de créer un sondage dynamique tel que posté dans Get User Input From Dynamic Controls, mais avec un environnement différent.AIDE! Obtenez la valeur du bouton radio de contrôle dynamique!

est inférieur à ce que je suis en train de faire:

Tout d'abord lorsque l'utilisateur clique sur le bouton, il remplira un tableau dynamique avec le bouton radio pour le questionnaire d'enquête dans un espace réservé. Cependant, je n'ai pas pu obtenir sa valeur (pour le calcul du score) après avoir cliqué sur le bouton Soumettre. Tous les contrôles dynamiques avaient disparu. A côté de moi j'utilise une extension ajax (updatePanel) pour le développement et J'ai regardé dans viewstate mais je n'en ai aucune idée.

Quelqu'un a-t-il des idées?

Ici, je compris une partie de mon code:


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> 

Créer dynamique Table fonction

* v_dtTable et v_dtTable2 contient les données de base de données

 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 

Calculer Score fonction

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 

Voir la source de la table générée dynamique

<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> 

Répondre

0

Merci Jacob pour sa solution.

Je suis capable de calculer le score en apportant quelques modifications pour l'attribution d'ID.

j'ajouté sa valeur à l'arrière de l'identifiant puisque la valeur générée est la même chose avec l'ID comme indiqué dans la vue source de

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

Puis, je l'ai utilisé sous-chaîne pour obtenir et calculer le score comme indiqué dans la fonction subCalculateScore ci-dessous:

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 

.. Haha son comme une façon moche de le faire: p

encore une fois, merci pour votre aide, Jacob.

toujours les bienvenus pour toute autre solution ^^

0

Si les noms des groupes de boutons radio générés sont assez prévisibles, vous pourriez obtenir leurs valeurs en inspectant la collection Request.Form . En supposant que les noms de groupes sont rBtn1, rBtn2, etc., les données de publication ressembleront à quelque chose comme rBtn1 = 6 & rBtn2 = 7. Cela signifie que vous pouvez faire ceci:

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

Cela vous aidera à travailler autour du fait que les contrôles qui ont été générés avant existent sans plus. Vous devriez fouiller dans le débogueur et inspecter la collection Request.Form afin de vous familiariser avec ce qui s'y trouve.

(mes excuses si mon VB.NET est incorrecte, je suis habitué à C#)

+0

Salut Jacob. Merci pour votre réponse. Je comprends ce que vous voulez dire là-bas. Comme vous pouvez le voir dans ma fonction Populate Dynamic Table, j'essayais de lui attribuer une valeur en utilisant inputAttributes. Toutefois, cela ne fonctionne pas et la valeur trouvée dans le débogueur est identique à son ID, car nous pouvons le trouver dans la source de vue en tant que publication modifiée. Pouvez-vous me donner une idée pour définir la valeur pour le bouton radio généré dynamiquement? Je serais très apprécié pour votre aide et votre suggestion/solution. Merci beaucoup :) –

0

je me suis dit hier que vous pouvez réellement faire fonctionner l'application normale comme en chargeant l'arbre de commande juste après le loadviewstateevent est tiré. Si vous remplacez l'événement loadviewstate, appelez mybase.loadviewstate, puis placez votre propre code pour régénérer les contrôles juste après, les valeurs de ces contrôles seront disponibles au chargement de la page. Dans l'une de mes applications, j'utilise un champ viewstate pour contenir l'ID ou l'information de tableau qui peut être utilisée pour recréer ces contrôles.

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