2011-11-05 7 views
5

będę docenić odpowiedzi w VB lub C#Jak dynamicznie generować pole tekstowe i zbierać dane wprowadzane przez użytkownika?

używamy bazy danych do tworzenia formularzy zbierania danych z dynamicznych elementów

enter image description here

Kiedyś ten kod, aby wygenerować etykiety i pola tekstowe z tabeli w bazie danych (gdy użytkownik kliknie przycisk "CRF obciążenie")

enter image description here

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 

gdy formularz do zbierania danych jest załadowany, strona wygląda tak

enter image description here

i "Wyświetl źródło strony" pokazuje

<!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> 

, gdy użytkownik wypełni formularz i kliknie przycisk wstawiania, chcę zapisać wprowadzony tekst do innej tabeli w bazie danych za pomocą tego kodu. to nie działa. czy możesz mi powiedzieć, gdzie jest mój błąd?

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 

komunikat o błędzie wygląda to po kliknięciu "insert"

enter image description here

+0

Kiedy mówisz „nie działa”, co ty spodziewałem się zrobić konkretnie i w niektórych szczegółach i co dokładnie robi to zamiast tego? Jeśli są wyświetlane wyjątki lub komunikaty o błędach, jakie są one? –

+0

Edytowałem moje pytanie @ MerlynMorgan-Graham –

+0

Znacznie lepiej szczegółowo. Nie mogę odczytać zrzutu strony ze strony. Jeśli to nie ma znaczenia, proponuję usunąć go. Jeśli to ma znaczenie, proponuję wkleić kod do pytania zamiast zrzutu ekranu. Komunikat o wyjątku byłby lepszy także w tekście. –

Odpowiedz

0

To jest twój ... = Session("FUt").Text i ... = Session("FUDt").Text.

Są struny, a .Text próbuje zadzwonić właściwość, która nie istnieje.

+0

Potrzebuję rozwiązania, aby wprowadzić wprowadzone dane do bazy danych. czy możesz naprawić mój kod, żeby to zrobić? –

+0

jeśli potrzebujesz więcej informacji, proszę powiedz –

0

Gdzie jest zdefiniowana sesja? Czy sprawdziłeś poziom dostępu do właściwości Text (musi być publicznie, bo inaczej zostanie rzucony wyjątek)?

+0

Potrzebuję rozwiązania, aby wprowadzić wprowadzone dane do bazy danych. czy możesz naprawić mój kod, żeby to zrobić? jeśli potrzebujesz więcej szczegółów, proszę mi powiedzieć –

2

Musisz pobrać rzeczywiste elementy sterujące, które zostały utworzone w Button1_click zamiast ich identyfikatorów, które przechowujesz w stanie sesji.

Jednakże, ponieważ te kontrole są tworzone dynamicznie w czasie wykonywania, Twój kod będzie znacznie bardziej skomplikowana, ponieważ trzeba będzie dodać wszystkie elementy sterujące do strony za każdym razem Page Init jest tzw. Zobacz następujące artykuły o dodatkowe informacje:

ASP.NET Page Life Cycle Overview

View State and Dynamically Added Controls

Dynamic Web Controls, Postbacks, and View State

oparciu o złożoności, który wprowadza to, chciałbym zaproponować bardziej bezpośrednie podejście, gdzie masz liczbę etykiet i pola tekstowe już na stronie, ale ukryte przez atrybuty CSS (display: none; visibility: hidden).

Jeszcze lepszym podejściem jest użycie kontrolki siatki, która idealnie nadaje się do tego rodzaju zachowania. Istnieje wiele przykładów tutaj:

Table of Contents: GridView Examples for ASP.NET 2.0

+0

+1 o kontroli siatki. Myślałem, że pamiętam, że jest to prostsze ... –

Powiązane problemy