asp.net - 如何根据调查应用程序的数据库字段添加不同的控件?
问题描述
我正在创建一个调查系统。创建者必须能够创建一个问题来决定什么样的控件会给出答案(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: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 控件添加条件来解决!
推荐阅读
- c++ - 如何计算在数组中找到元素的次数
- python - JSON 文本格式不正确。在位置 1 发现了意外的字符 '''
- javascript - ReactJS setState doesn't work with a parameter/argument from a method/function
- node.js - TypeError:无法分配给对象的只读属性“导出”
- asynchronous - 如何在 Lua 中执行异步功能?
- javascript - Web 电池 API 在 Android 上运行非常缓慢
- android-studio - How to view this missing toolbar/window in android studio?
- c - 是否可以将 mmap() 用于整个地方的 4Kb 块,还是一次将整个文件 mmap() 更好?
- c# - 您如何发布或部署您的 C# 桌面应用程序?
- .htaccess - htaccess not redirecting all not found page or URL on site to 404 pages