2009-07-07 3 views
0

Ich bin dabei, eine dynamische Umfrage zu erstellen, wie in Get User Input von Dynamic Controls, aber mit einer anderen Umgebung.HILFE! Holen Sie sich den Wert der dynamischen Kontrolle Radio Button!

Unten ist das, was ich zu tun versucht:

Zuerst, wenn der Benutzer auf die Schaltfläche klicken, wird es eine dynamische Tabelle mit Optionsfeld für den Fragebogen in einem Platzhalter zu füllen. Allerdings konnte ich den Wert (für die Berechnung der Punkte) nach dem Klicken auf die Schaltfläche "Senden" nicht abrufen. Alle dynamischen Kontrollen waren weg. Neben ich verwende eine Ajax-Erweiterung (updatePanel) für die Entwicklung und Ich habe in ViewState, aber ich habe keine Ahnung damit.

Hat jemand irgendwelche Ideen?

Hier enthalten ich einige meinen Code:


Seite

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

Erstellen von dynamischer Tabellenfunktion

* v_dtTable und v_dtTable2 enthalten die Daten aus der Datenbank

 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 

berechnen Score Funktion

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 

anzeigen Quelle für die dynamisch generierte Tabelle

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

Antwort

0

Danke Jacob für seine Lösung.

Ich bin in der Lage, die Punktzahl durch einige Änderungen für die ID-Zuordnung zu berechnen.

Ich habe seinen Wert auf der Rückseite der ID, da die das gleiche mit dem ID generierten Wert wie in der Ansicht Quelle

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

Dann gezeigt ist, i String verwendet, um die Punktzahl zu bekommen und zu berechnen, wie gezeigt in der subCalculateScore Funktion unten:

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 .. klingen wie ein lausiger Weg, es zu tun: p

Noch einmal vielen dank für Ihre Hilfe, Jacob.

immer willkommen für jede andere Lösung ^^

0

Wenn die Namen der erzeugten Radiobutton-Gruppen sind genug vorhersagbar, Sie ihre Werte durch Überprüfen der Request.Form Sammlung bekommen könnte . Unter der Annahme, dass die Gruppennamen rBtn1, rBtn2 usw. sind, sehen die Post-Daten ungefähr wie rBtn1 = 6 & rBtn2 = 7 aus. Das heißt, Sie können dies tun:

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

Dies wird Ihnen helfen, um die Tatsache arbeiten, dass die Kontrollen, die vor nicht-mehr erzeugt wurden existieren. Sie sollten im Debugger herumstöbern und die Request.Form-Sammlung überprüfen, damit Sie sich mit den darin enthaltenen Informationen vertraut machen können.

(meine Entschuldigung, wenn mein VB.NET ist falsch, ich bin zu C# verwendet)

+0

Hallo Jacob. Danke für Ihre Antwort. Ich verstehe, was du meinst. Wie Sie sehen können, habe ich in meiner Populate Dynamic Table-Funktion versucht, Wert dafür mit InputAttributes zuweisen. Dies funktioniert jedoch nicht und der vom Debugger gefundene Wert war identisch mit seiner ID, da wir ihn in der Ansichtsquelle als bearbeiteten Post finden. Können Sie mir eine Idee geben, Wert für den dynamisch generierten Radio-Button zu setzen? Ich wäre sehr dankbar für Ihre Hilfe und Ihren Vorschlag/Lösung. Vielen Dank :) –

0

ich gestern herausgefunden, dass Sie tatsächlich Ihre Anwendung arbeiten wie normale durch das Laden des Steuerbaum direkt nach dem loadviewstateevent abgefeuert wird machen können. Wenn Sie das Ereignis loadviewstate überschreiben, rufen Sie mybase.loadviewstate auf und fügen Sie anschließend Ihren eigenen Code ein, um die Steuerelemente unmittelbar danach neu zu generieren. Die Werte für diese Steuerelemente stehen beim Laden der Seite zur Verfügung. In einer meiner Apps verwende ich ein Viewstate-Feld, um die ID oder die Array-Informationen zu speichern, die zum Erstellen dieser Steuerelemente verwendet werden können.

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