如何动态生成文本框并收集用户输入的数据?

我将欣赏VB或C#中的答案

我们使用数据库来创建带有动态项的数据收集表单

在此处输入图像描述

我使用此代码从数据库中的表生成标签和文本框(当用户点击按钮“加载CRF”时)

在此处输入图像描述

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim CRFgrid As New GridView CRFgrid.DataSource = CRFds CRFgrid.DataBind() Dim ItemCount As Integer = CRFgrid.Rows.Count Session("Itemcount") = CRFgrid.Rows.Count For I = 0 To (ItemCount - 1) Dim itemname As String = CRFgrid.Rows(0 + I).Cells(1).Text.ToString Session("Item") = "Item" + (I + 1).ToString Dim ItemNamelabel As New Label Dim ItemNameBox As New TextBox ItemNamelabel.ID = "L" + (I + 1).ToString Session("FU" + I.ToString) = ItemNamelabel.ID.ToString ItemNameBox.ID = "T" + (I + 1).ToString ItemNamelabel.Text = "
" + (Session("Item").ToString) + " " + itemname + " " + "
" Me.Form.Controls.Add(ItemNamelabel) Me.Form.Controls.Add(ItemNameBox) Next End Sub

加载数据收集表单时,页面如下所示

在此处输入图像描述

和“查看页面源”显示

       

   



MRN


Item1 Diagnosis

Item2 Treatment Protocol

Item3 Initial CSF

Item4 Location

Item5 Consultant

一旦用户填写表单并单击插入,我想使用此代码将输入的文本保存到数据库中的另一个表格中。 这是行不通的。 你能告诉我我的错误在哪里吗?

 Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click Dim mydb As New OleDbConnection mydb = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= |datadirectory|openclinica.mdb;Persist Security Info=True") mydb.Open() Dim Y As Integer = Session("Itemcount") For M = 1 To Y Session("FUt") = "L" + M.ToString Session("FUDt") = "T" + M.ToString Dim sqlstring = "INSERT INTO [Followup] ([MRN], [FU], [FUData]) VALUES (@MRNtxt, @" + Session("FUt") + ", @" + Session("FUDt") + ");" Dim mydbcommand As New OleDbCommand(sqlstring, mydb) mydbcommand.Parameters.Add("@MRNtxt", OleDbType.VarChar).Value = MRNtxt.Text mydbcommand.Parameters.Add("@" + Session("FUt"), OleDbType.VarChar).Value = Session("FUt").Text mydbcommand.Parameters.Add("@" + Session("FUDt"), OleDbType.VarChar).Value = Session("FUDt").Text mydbcommand.ExecuteNonQuery() Next mydb.Close() End Sub 

当我点击“插入”时,错误消息看起来像这样

在此处输入图像描述

您需要检索在button1_click中创建的实际控件,而不是它们存储在会话状态中的ID。

但是,因为这些控件是在运行时动态创建的,所以您的代码将变得非常复杂,因为每次调用Page Init时都必须将所有控件添加到页面中。 有关其他信息,请参阅以下文章:

ASP.NET页面生命周期概述

查看状态和动态添加的控件

动态Web控件,回发和视图状态

基于这引入的复杂性,我建议采用一种更简单的方法,在页面上已经有许多标签和文本框,但是CSS属性隐藏了( display: none; visibility: hidden )。

更好的方法是使用网格控件,这非常适合这种行为。 这里有很多例子:

目录:ASP.NET 2.0的GridView示例

请查看这篇文章

创建动态用户友好的基于Web的数据收集表单

这是你的... = Session("FUt").Text... = Session("FUDt").Text

这些是字符串,而.Text正在尝试调用不存在的属性。

会话定义在哪里? 您是否检查了Text属性的访问级别(它需要公开,否则将引发您获得的exception)?