首页 > 解决方案 > 如何根据调查应用程序的数据库字段添加不同的控件?

问题描述

我正在创建一个调查系统。创建者必须能够创建一个问题来决定什么样的控件会给出答案(RadioButtonList、TextBox 等...)

我有一个存储问题的数据表(SQL)和所需答案的类型(dbo.Questions):

ID (int - PK)
IdForm (int - FK to dbo.Forms)
Question (varchar)
TypeOfAnswer (int)

还有另一个存储用户答案的​​数据表(dbo.Answers)

ID (int - PK)
QuestionId (int - FK to dbo.Questions.ID)
Answer (varchar)
UserId (int - FK to dbo.Users.ID)
Date (datetime)

因此,问题的一个示例是:

ID     Question                               TypeOfAnswer
-----------------------------------------------------
1      What color do you like the most?       1
2      Are you happy with your bike?          2
3      What's your favorite ice cream flavor? 3

所以问题 ID.1 应该有一个 RadioButtonList,它将根据用户的选择显示 Blue、Yellow、Green 作为标签并存储 1、2 或 3 作为值。

问题 ID.2 应该是 RadioButtonList,只有两个答案,是的,标签是否,存储值是 1,2。

问题 ID3。应该是一个文本框。

在将控件打印到视图(在 ASP.Net 表单上)时,我遇到了很大的困难。

到目前为止,我已经创建了一个数据集,根据每一行,它应该打印问题的标签,以及将存储答案的用户控件,这是我到目前为止的代码:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    Dim ptipo As Integer = 2



    Dim tcontrol1 As Control
    tcontrol1 = LoadControl("/WebUSerControl.ascx")



    Dim dt As New DataTable()
    Dim connection As New SqlConnection(enchufalo1)
    connection.Open()
    Dim sqlCmd As New SqlCommand("SELECT * FROM [BORRAR_CL_Preguntas] WHERE ([IdFormato] = @IdFormato)", connection)
    Dim sqlDa As New SqlDataAdapter(sqlCmd)

    sqlCmd.Parameters.AddWithValue("@IdFormato", Request.QueryString("iform"))

    sqlDa.Fill(dt)


    Dim ctipo As Integer
    For Each Row As DataRow In dt.Rows

        ctipo = Row("TypeOfAnswer")

        If ctipo = 1 Then
            Dim rbl As RadioButtonList = New RadioButtonList()
            rbl.ID = "rbl_prg1"
            rbl.Items.Add("1")
            rbl.Items.Add("2")
            rbl.Items.Add("3")

            ph_print.Controls.Add(rbl)

            lit_prg.Text += Row("Question")
            lit_prg.Controls.Add(tcontrol1)

        End If
    Next



End Sub

现在 ph_print 占位符正在打印单选按钮,但跳过了第一个问题!!而且我无法添加问题标签或 HTML 样式

任何帮助,将不胜感激!

标签: asp.netvb.net

解决方案


我想出了一个解决这个问题的办法......

这是前面的代码:

<asp:Repeater ID="rpt_preguntas" runat="server" DataSourceID="DS01">
                        <ItemTemplate>
                            <div class="Col100">
                                <div class="Col60">
                                    <%#Eval("Pregunta") %>
                                </div>
                                <div class="Col5"></div>
                                <div class="Col35">
                                    <div runat="server" visible='<%# (Eval("Tipo").ToString() = "1") %>'>
                                        <asp:RadioButtonList ID="resp_tipo1_rbl" runat="server" RepeatDirection="Horizontal" RepeatColumns="6" ValidationGroup="valrspX">
                                            <asp:ListItem Value="1">1</asp:ListItem>
                                            <asp:ListItem Value="2">2</asp:ListItem>
                                            <asp:ListItem Value="3">3</asp:ListItem>
                                            <asp:ListItem Value="4">4</asp:ListItem>
                                            <asp:ListItem Value="5">5</asp:ListItem>
                                            <asp:ListItem Value="6">NS/NR</asp:ListItem>
                                        </asp:RadioButtonList>
                                    </div>
                                    <div runat="server" visible='<%# (Eval("Tipo").ToString() = "2") %>'>
                                        <asp:TextBox ID="tb_tipo2" runat="server"></asp:TextBox>
                                    </div>
                                    <div runat="server" visible='<%# (Eval("Tipo").ToString() = "3") %>'>
                                        <asp:DropDownList ID="ddl_perros" runat="server">
                                            <asp:ListItem></asp:ListItem>
                                            <asp:ListItem Value="A">Azul enfermo</asp:ListItem>
                                            <asp:ListItem Value="B">Blanco nigga</asp:ListItem>
                                            <asp:ListItem Value="C">Café popó</asp:ListItem>
                                            <asp:ListItem Value="D">Dorado blin blin</asp:ListItem>
                                        </asp:DropDownList>
                                    </div>
                                </div>
                            </div>

                            <br /><br />

                            <asp:Label ID="pregid" runat="server" Text='<%#Eval("ID") %>' Visible="false"></asp:Label>
                        </ItemTemplate>
                    </asp:Repeater>

和后面的代码:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btn_enviar.Click


    Try

        Dim spregid As Integer
        Dim spregrs As String

        For Each elemento As RepeaterItem In rpt_preguntas.Items

            Dim prg_id As Label = DirectCast(elemento.FindControl("pregid"), Label)

            Dim stipo As Integer
            Dim SqlCon0 As SqlConnection
            Dim SqlCom0 As SqlCommand
            Dim SqlDR0 As SqlDataReader
            SqlCon0 = New SqlConnection(ConfigurationManager.ConnectionStrings("EnchufeUNICOC").ToString())
            SqlCom0 = New SqlCommand("SELECT * FROM [dbo].[BORRAR_CL_Preguntas] WHERE([ID] = '" & prg_id.Text & "')", SqlCon0)
            SqlCom0.CommandType = CommandType.Text
            If SqlCon0.State = ConnectionState.Closed Then
                SqlCon0.Open()
                'Dim p0 As New SqlParameter("@cc", SqlDbType.VarChar)
                'p0.Direction = ParameterDirection.Input
                'p0.Value = num_cc
                'SqlCom0.Parameters.Add(p0)
            End If
            SqlDR0 = SqlCom0.ExecuteReader()
            While SqlDR0.Read()

                stipo = SqlDR0("tipo")

            End While
            SqlDR0.Close()
            SqlCon0.Close()

            Dim respuesta As String

            If stipo = 1 Then

                Dim control_t1 As RadioButtonList = DirectCast(elemento.FindControl("resp_tipo1_rbl"), RadioButtonList)



                respuesta = control_t1.SelectedValue

            End If

            If stipo = 2 Then

                Dim control_t2 As TextBox = DirectCast(elemento.FindControl("tb_tipo2"), TextBox)

                respuesta = control_t2.Text

            End If

            If stipo = 3 Then

                Dim control_t3 As DropDownList = DirectCast(elemento.FindControl("ddl_perros"), DropDownList)

                respuesta = control_t3.SelectedValue

            End If

            resultados.Text += "Pregunta ID: " & prg_id.Text & "<br/>Respuesta: " & respuesta & "<br/><br/>"

        Next


    Catch ex As Exception
        resultados.Text = "La cagamos mano:<br/><br/>" & ex.ToString
    End Try

End Sub

所以它通过在它的 ItemTemplate 中向 Repeater 控件添加条件来解决!


推荐阅读