Hej,Flera problem = en kolumn per id och id i toppen på kolumn
Så här är sidan tänkt att fungera:
1. Användaren fyller i ett Textfält om "Vad testade ni?"
2. Användaren gör ett val ur en Dropdownlist, mellan 1 och 10, för "Hur många produkter testades"
3. Användaren trycker på knappen Skapa boxar
4. Nu ska en datagrid komma fram, där antalet rader avgörs av valet i Dropdownlist:en ovan.
5. I datagriden finns första kolumnen fylld med textboxar för att skriva i produktnamnen
6. Övriga kolumner ska skapas on-the-fly, lika många som var närvarande den kvällen (finns lagrat i databastabell). Och varje kolumn ska motsvara en närvarandes. Alltså var medlem_id = 1 närvarande så får han kolumn 1 och var även medlem_id = 3 närvarande får han en kolumn också. Header-text på dessa kolumner ska vara deras medlem_id. Cellerna i kolumnerna är textboxar där användaren ska fylla i vad de olika medlemmarna röstade.
Ok! Mycket information på en gång. Men så är det tänkt att fungera. Men det gör det inte. Punkterna 1-4 fungerar bra.
Däremot blir antalet kolumner (exkl. produktnamnskolumnen) dubbelt så många som det är tänkt (var 3 närvarande blir det 6 kolumner osv). Detta kanske har något med IsPostback att göra (vild gissning!).
Dessutom kan jag inte få att medlem_id-värdet att stå överst i varje kolumn. Eller rättare sagt inte alla värden, utan samma värde skrivs över alla kolumner! Och detta är ett stort problem, vet inte hur jag kan liksom stega mig igenom min datareader och skriva ut aktuellt id för varje loop.
Bifogar min asp.net-kod. Det är rena spaghetti-koden, tar gärna emot tips på hur jag kan göra det bättre.
Någon som kan hjälpa mig lite??? Har försökt läsa mig till lösning men klurar inte ut det!
Stort tack på förhand!
<%@ Page Language="VB" Debug="true" ContentType="text/html" ResponseEncoding="iso-8859-1"%>
<!--#include file="inkluderingsfiler/globalt.inc.aspx" -->
<%@ Import Namespace="System.data" %>
<%@ Import Namespace="System.data.oledb" %>
<%@ Import Namespace="system.web.mail" %>
<script language="VB" runat="server">
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'// kolla så att är inloggad, om inte redirect till logon.aspx
Dim medlem_id as integer = Session("medlem_id")
If medlem_id <=0 then
response.redirect("log_on.aspx")
else
end if
'************************DATAGRIDEN*************************
Dim kvall_id=Request.QueryString("kvallens_id")
'// Anslut till databasen.
Dim Con as new OLEDBConnection(db)
'Metoden open öppnar anslutningen
Con.open()
Dim sql7 as string
sql7="SELECT count(*) as antal FROM tblNarvarande WHERE tblNarvarande.kvall_id=" & kvall_id
'// Hämta data från databasen med hjälp av funktionen datareader_data
Dim Dr7 as OLEDBDatareader = datareader_data(sql7)
Dr7.read()
'*************************************************************
'// skapa en ny templatecolumn för varje loop-genomgång (upp till lika många som var närvarande)
dim i as integer
For i=0 To Dr7("antal") -1
Dim tc1 As New TemplateColumn()
'// Anslut till databasen.
Dim Con8 as new OLEDBConnection(db)
Con8.open()
Dim sql8 as string
sql8="SELECT tblNarvarande.medlem_id as Test FROM tblNarvarande WHERE tblNarvarande.kvall_id=" & kvall_id
'// Hämta data från databasen med hjälp av funktionen datareader_data
Dim Dr8 as OLEDBDatareader = datareader_data(sql8)
Dr8.read()
tc1.HeaderTemplate = New DataGridTemplate(ListItemType.Header, Dr8("Test"))
tc1.ItemTemplate = New DataGridTemplate(ListItemType.Item, "betyg")
dg_medverkande2.Columns.Add(tc1)
Next
end sub
'**************************************************************************************************************
' En class för hur jag vill att mina kolumner ska se ut
'**************************************************************************************************************
Private Class DataGridTemplate
Implements ITemplate
Dim templateType As ListItemType
Dim columnName As String
Sub New(ByVal type As ListItemType, ByVal ColName As String)
templateType = type
columnName = ColName
End Sub
Sub InstantiateIn(ByVal container As Control) _
Implements ITemplate.InstantiateIn
Dim lc As New Literal()
Select Case templateType
Case ListItemType.Header
lc.Text = columnName
container.Controls.Add(lc)
Case ListItemType.Item
Dim tb As New TextBox()
tb.cssclass = "formtext"
tb.Text = ""
container.Controls.Add(tb)
End Select
End Sub
End Class
'**************************************************************************************************************
'**************************************************************************************************************
'Hur många rader ska det vara i vår datagrid
'**************************************************************************************************************
function antalBoxar(antalboxes as integer) as integer
dim antalboxes2 as integer
antalboxes2 = antalartiklar.selecteditem.value
return antalboxes2
end function
'**************************************************************************************************************
'**************************************************************************************************************
'När användaren skrivit in vad de testat och valt antal testprodukter trycker han på Okej och då körs nedan kod.
'**************************************************************************************************************
sub make_boxes(sender As Object, e As EventArgs)
'// när vi skapar betygsformuläret gör tidigare kontroller oaktiverade
txtTestav.enabled = false
antalArtiklar.enabled = false
okej.enabled = false
lblVad.enabled = false
lblHur.enabled = false
'************************DATAGRIDEN*************************
Dim kvall_id=Request.QueryString("kvallens_id")
'// Anslut till databasen.
Dim Con2 as new OLEDBConnection(db)
Con2.open()
Dim sql2 as string
sql2="SELECT tblNarvarande.* FROM tblNarvarande"
Dim Ad as new OLEDBDataAdapter(sql2 ,Con2)
'// Dataset förvarar data i minnet (precis som en datareader). Fördel dataset: sidbläddring.
Dim Ds as new Dataset
Ad.fill(Ds,"dg_medverkande2")
'****************************************************************************************
'// Datagridens datakälla ska vara objektet Ds
dg_medverkande2.DataSource=Ds
'// Det är nu innehållet visas i datagriden
dg_medverkande2.DataBind()
'// Stäng anslutningen.
Con2.close()
Registrera.visible = true
'*************************************************************************
end sub
'**************************************************************************************************************
'***************************************************************************************
'Funktion för att hämta data från databasen
'***************************************************************************************
'Anropas så här:
' Dim Dr as OLEDBDatareader
' Dr = datareader_data("sql-satsen här")
function datareader_data(sql as String) as OLEDBDatareader
'// Deklarera och öppna anslutning
Dim Con as new OLEDBConnection(db)
Con.open()
'// Hämta info från databasen med hjälp av sql-satsen och anslutnings-objektet
Dim Cmd as New OLEDBCommand(sql,Con)
'// Skapa en datareader att lägga information i
Dim Dr as OLEDBDatareader
'// Knyt info från command-objekt till vår datareader
Dr = Cmd.executeReader(Commandbehavior.closeConnection)
'// Returnera datareader
return Dr
'// stäng anslutningen
con.close()
'// stäng datareadern
dr.close()
end function
'***************************************************************************************