Allt går. :) Vet inte om det är den bästa lösningen men hämta dina data och stoppa dem i exempelvis en datatable. Lägg till tre kolumner i din datatable. Sen får du loopa igenom varje rad i din datatable, dela ditt id (med substring() eller vad du nu vill använda) och stoppa in respektive id i de nya kolumnerna på samma rad. Sedan är det bara att fylla din datagrid med din datatable!
varje id-värde får varsin kolumn i datagrid
9 svar · 766 visningar · startad av bbquearen
Hej ispiro,
Tack för ditt svar. Får kolla upp dessa saker. Är datatable något liknande datareader? Kan jag använda datareader istället? Är mer van vid datareader...
Och vad menar du med "dela ditt id (med substring())...? Varför vill jag dela på mitt id? Eller menar du att jag ska dela upp de tre id:na?
Återigen tack! //mvh Björn
En datareader läser ju data medan en datatable är en collection med data. Visst kan du använda en reader men du måste ju ändå stoppa datan du läser ut i något. Det går säkert att fylla en datagrid direkt men det vet jag inte riktigt hur man löser.
Jag kanske missförstod dig, jag tolkade det som att "test_id" innehåller ett id som ser ut så här "2,4,8" men det var kanske inte så du menade? Alltså att du i så fall får dela test_id med substring, split eller någon annan metod till tre separata id:n som sedan ska ligga i en varsin kolumn?
Jag vill lägga varje posts test_id i toppen på varsin kolumn:
(så här har jag tänkt ungefär, siffrorna under medlem_id är vad de personerna gav för betyg på produkterna)
produkt/betyg medlem_id1 medlem_id2 medlem_id3
chips 3 2 1
jordnötter 5 3 3
SKICKA
>> Syftet är alltså att visa ett formulär där en ensam användare ska skriva in vad olika medlemmar gav för betyg på olika produkter i ett test. Sedan när användaren trycker på SKICKA så ska uppgifterna lagras i en ms access-databas. Och då ska ju självklart lagras vem som röstade vad på vad!
Har du några fortsatta tips? Vad är skillnaden på datareadern: "läser data" och datatablen: "collection av data"?
Tack på förhand,
hoppas det blev klarare nu!
//mvh Björn
Du måste bygga din datagrid dynamiskt eftersom antalet kolumner varierar. Läs den här artikeln, den kan nog ge dig en ledtråd:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbtskcreatingtemplatesprogrammaticallyindatagridcontrol.asp
Du får skapa en datagrid, sedan en kolumn för varje användare, typ (pseudokod):
DataGrid myDataGrid = new DataGrid();
DataGridColumn dgc;
dgc = new DataGridColumn();
dgc.HeaderText = "Produkt/betyg";
myDataGrid.Columns.Add(dgc);
for(varje användare) {
dgc = new DataGridColumn();
dgc.HeaderText = användare;
myDataGrid.Columns.Add(dgc);
}
Sen får du iterera för varje produkt och lägga till textboxar i varje cell på varje rad (item).
Tack. Känns som att vi börjar komma någonstans nu!
Känns rätt. Förstår inte allt direkt här men på det stora hela.
Återkommer säkert med felmeddelanden sen! Men det här borde ju funka till slut!
Hur svårt kommer det bli att sedan lagra de inskrivna värdena till rätt produkt och rätt medlem? (då menat om datagriden är uppbyggt så här, mina tabeller är uppbyggda med rätt relationer så det är ju lugnt)
//mvh Björn
Försöker och försöker...
Hej igen,
Tänkte berätta hur det ligger till. Mål och status. Hoppas kanske du kan hjälpa mig vidare lite.
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 ...
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) ...
Sub New(ByVal type As ListItemType, ByVal ColName As String)
templateType = type
columnName = ColName
End Sub
Sub InstantiateIn(ByVal container As Control) _ ...
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 ...
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) ...
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 ...
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
'***************************************************************************************
//mvh Björn
Om jag inte minns fel finns det en funktion som heter TRANSFORM i Access för att skapa Pivot tabeller. Hade du använt SQL Server så har jag ev. ett litet ess i rockärmen som du kan prova :i
Hej och tack för svaren!
Jag har dock valt att börja om. Arbetar med en asp:table istället där jag skapar celler, rader och textboxar dynamiskt! Har fått det hyfsat på plats. Kändes som lösningen jag försökte mig på härovan var lite utanför min liga.
Tack iaf! //mvh Björn