webForumDet fria alternativet

varje id-värde får varsin kolumn i datagrid

.NET

9 svar · 766 visningar · startad av bbquearen

Medlem sedan feb. 200630 inlägg
Frågan#1

Hur kan jag ta t ex 3 poster från min databas:

test_id, medlem, datum
test_id, medlem, datum
test_id, medlem, datum

och lägga varje test_id (= tre olika värden, t ex 2, 4 och 8) i varsin kolumn på en datagrid? Går det?

- använder asp.net, vb och ms access...

//mvh Björn

Medlem sedan sep. 2005673 inlägg
#2

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!

Medlem sedan feb. 200630 inlägg
#3

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

Medlem sedan sep. 2005673 inlägg
#4

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?

Medlem sedan feb. 200630 inlägg
#5

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

Medlem sedan sep. 2005673 inlägg
#6

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).

Medlem sedan feb. 200630 inlägg
#7

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

Medlem sedan feb. 200630 inlägg
#8

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

Medlem sedan juli 200568 inlägg
#9

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

Medlem sedan feb. 200630 inlägg
#10

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

513 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
376 ms — ändringar (db)