【问题标题】:How to dynamically generate textbox and collect data entered by user?如何动态生成文本框并收集用户输入的数据?
【发布时间】:2011-12-22 20:23:10
【问题描述】:

我会感谢 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 = "<br />" + (Session("Item").ToString) + " " + itemname + " " + "<br />"

        Me.Form.Controls.Add(ItemNamelabel)
        Me.Form.Controls.Add(ItemNameBox)



    Next
End Sub

数据采集表单加载后,页面是这样的

和“查看页面源”显示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>

 </title></head>
<body>
<form method="post" action="Default.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"     value="/wEPDwUKLTI0NTA5MDI3NGRkUb8sl0uZpLbvUN/GSmHgjYxS9xqGR7rmcMBR3Ufhz4w=" />
</div>

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWCQLf7PXOCQKM54rGBgK7q7GGCALF9vKRBQLs7+btDALs7+LtDALs797tDALs79rtDALs79btDDHrb+Vhkcph8brtCJP9//5IH57FFoImey2PApARP+k1" />

<input type="submit" name="Button1" value="LoadCRF" id="Button1" style="width:85px;" />
<br />
<br />
<input type="submit" name="Button2" value="InsertData" id="Button2" style="width:85px;" />
<br />
<br />

MRN
<input name="MRNtxt" type="text" id="MRNtxt" />
<br />
<br />
<span id="L1"><br />Item1 Diagnosis <br /></span><input name="T1" type="text" id="T1" /><span id="L2"><br />Item2 Treatment Protocol <br /></span><input name="T2" type="text" id="T2" /><span id="L3"><br />Item3 Initial CSF <br /></span><input name="T3" type="text" id="T3" /><span id="L4"><br />Item4 Location <br /></span><input name="T4" type="text" id="T4" /><span id="L5"><br />Item5 Consultant <br /></span><input name="T5" type="text" id="T5" /></form>

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

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

当我点击“插入”时,错误信息是这样的

【问题讨论】:

  • 当您说“它不起作用”时,您希望它具体和详细地做什么,而它到底在做什么?如果显示任何异常或错误消息,它们是什么?
  • 我编辑了我的问题@MerlynMorgan-Graham
  • 更好的细节。我无法阅读页面源截图。如果没关系,我建议你删除它。如果它确实重要,我建议您将代码粘贴到问题中而不是屏幕截图中。异常消息在文本中也会更好。
  • 我无法告诉您如何解决它,因为我是 asp.net 的菜鸟,但我可以告诉您,您没有将控件推送到会话数据中。你在推弦。而且我不确定您可以将控件推入。如果可以的话,我认为当用户编辑文本时它们不会改变,因为它只是控件的文本表示,而不是控件本身。会话数据存储为文本,而不是对象,即使您最终可以将该文本转换回对象。
  • 感谢@MerlynMorgan-Graham,我需要一个解决方案来将输入的数据输入数据库。你能建议另一种方法吗

标签: c# asp.net vb.net dynamic textbox


【解决方案1】:

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

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

ASP.NET Page Life Cycle Overview

View State and Dynamically Added Controls

Dynamic Web Controls, Postbacks, and View State

基于这引入的复杂性,我建议采用更直接的方法,即页面上已有许多标签和文本框,但被 CSS 属性隐藏 (display: none; visibility: hidden)。

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

Table of Contents: GridView Examples for ASP.NET 2.0

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我需要一个解决方案来将输入的数据输入数据库。你能修复我的代码吗?
    • 如果您需要更多详细信息,请告诉我
    猜你喜欢
    • 2015-06-01
    • 2010-10-12
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多