I am looking into create a dynamic survey as posted in Get User Input From Dynamic Controls but with some different environment
Below is what i am trying to do:
First when the user click the button, it will populate a dynamic table with radio button for the survey questionnaire
However, i was unable to get its value (for score calculation) after clicking the submit button
Beside i am using an ajax extension (updatePanel) for the development
I have been look into viewstate but i hv no idea with it.
Does anyone have any ideas?
Here i included some of my code:
part of code in page
Expand|Select|Wrap|Line Numbers
- <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 and v_dtTable2 contains the data from database
Expand|Select|Wrap|Line Numbers
- 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
Expand|Select|Wrap|Line Numbers
- 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