[asp.net] Dynamische table achteraf vullen

Pagina: 1
Acties:

  • Predje
  • Registratie: December 2002
  • Laatst online: 03-03-2025
Hey Allemaal.

Ik maak m.b.v. een for each loop een dynamische tabel aan in vb.net.
Dit gaat allemaal goed, maar omdat ik niet in elke for each loop een connectie met m`n database wil maken wil ik deze dus na de for each loop gaan vullen.
Ik geef dus netjes elke cell een id.
Maar ik krijg echt nergens gevonden hoe ik een zojuist aangemaakt cell weer kan "selecteren" om er een .text of .cssclass aan toe te kennen.
Ik ben al uren de namespaces en objecten van .net aan het doorkijken, maar het lijkt me nu of dit gewoon niet mogelijk is.
Weet iemand hoe het wel kan? Misschien i.c.m. findcontrol?
Ik dacht het dus simpel te doen met;
tabel.row.cell("id").text = bla
Maar doe wil ie niet.

p.s. Wat is trouwens sneller een for each loop of For i = 0 To 10?

Alvast bedankt!

  • cowgirl
  • Registratie: November 2000
  • Laatst online: 18-12-2025
Je hebt een datatable waar je kolommen aan hebt toegevoegd en nu wil je rijen gaan toevoegen? In jouw voorbeeld tabel.row.cell("id") mis ik in elk geval de rowidentifier. Maak dus eerst een nieuwe datarow, vul daarin de velden en voeg tenslotte je row toe aan je datatable.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 20:41

mulder

ik spuug op het trottoir

oogjes open, snaveltjes dicht


  • Predje
  • Registratie: December 2002
  • Laatst online: 03-03-2025
cowgirl schreef op maandag 13 maart 2006 @ 20:58:
Je hebt een datatable waar je kolommen aan hebt toegevoegd en nu wil je rijen gaan toevoegen? In jouw voorbeeld tabel.row.cell("id") mis ik in elk geval de rowidentifier. Maak dus eerst een nieuwe datarow, vul daarin de velden en voeg tenslotte je row toe aan je datatable.
Neen, de colommen en rijen zijn er al.
Ik wil gewoon een bepaalde kolom achteraf nog een text kunnen geven.

  • cowgirl
  • Registratie: November 2000
  • Laatst online: 18-12-2025
Predje schreef op maandag 13 maart 2006 @ 21:49:
[...]
Neen, de colommen en rijen zijn er al.
Ik wil gewoon een bepaalde kolom achteraf nog een text kunnen geven.
Geef dan eens de (relevante) code waar je mee bezig bent en geef aan waar het niet lukt. Doordat je het beschrijvend verteld, begrijp ik niet waar dan je probleem zit.

  • Predje
  • Registratie: December 2002
  • Laatst online: 03-03-2025
cowgirl schreef op maandag 13 maart 2006 @ 22:00:
[...]

Geef dan eens de (relevante) code waar je mee bezig bent en geef aan waar het niet lukt. Doordat je het beschrijvend verteld, begrijp ik niet waar dan je probleem zit.
Het leek me duidelijk genoeg maar hier heb je de relevantie code

vb.net
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
            'nu voor elke geselecteerde medewerker de afspraken ophalen
            Dim TijdStapRow As New TableRow

            'de nummers van de Medewerkers uit de array halen
            Dim MwNummer As String

            For Each MwNummer In MwNumArray

                Dim tijdStapCell As New TableCell

                'cssclass aan de cell toevoegen
                tijdStapCell.CssClass = "scheduleTd"

                'id aan de cell geven zodat we deze terug kunnen vinden
                tijdStapCell.ID = MwNummer & "-" & Format(StartTijd, "H:mm")

                'cellen aan TijdStapRow toevoegen
                TijdStapRow.Cells.Add(tijdStapCell)

            Next
            'naar de volgende geselecteerde medewerker

            'TijdStapRow in table voegen
            scheduleTable.Rows.Add(TijdStapRow)

Na de loop moet ik dus weer de ID van de zojuist aangemaakte cell kunnen aanspreken. Maar geen idee hoe dat moet en nu het lange zoeken zelfs het idee dat het niet kan.

Verwijderd

niets

[ Voor 97% gewijzigd door Verwijderd op 13-03-2006 23:00 ]


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 16:58
Predje schreef op maandag 13 maart 2006 @ 22:36:
[...]

Na de loop moet ik dus weer de ID van de zojuist aangemaakte cell kunnen aanspreken. Maar geen idee hoe dat moet en nu het lange zoeken zelfs het idee dat het niet kan.
Kan je niet gewoon je laatste rij oppakken ?
iets van
code:
1
2
id = scheduleTable.rows.count -1
scheduleTable.row(id).cell("id").text = "bla"

of zo....

The best thing about UDP jokes is that I don't care if you get them or not.


  • Predje
  • Registratie: December 2002
  • Laatst online: 03-03-2025
Mmh, de DataGrid lijkt inderdaad heel veel te kunnen.
Maar in mijn geval gaat het op een dag-overzicht. Ik heb een dynamische starttijd, bijv 08:30, en een dynamische aantal uren, bijv 8 uur, met deze twee gegevens maakt ik een tabel met een soort van "tijdGrid" door er telkens 5 minuten aan de starttijd toe te voegen tot ik bij 08:30 + 8 uur ben aangekomen.
Dan haal ik uit een Array de medewerker namen en zet ik bovenaan in de tabel neer (als een soort header).
Dan krijg ik dus een tabel zoals ik deze wil hebben, voor de duidelijkheid heb ik een afbeelding toegevoeg;
Afbeeldingslocatie: http://www.request-design.nl/dayGrid.jpg
Je ziet dus een grid voor de werknemers voor de dag.. als ik nu op een dag zou klikken waarop afspraken zijn dan moet ik deze grid kunnen vullen.

  • Predje
  • Registratie: December 2002
  • Laatst online: 03-03-2025
Remc0 schreef op dinsdag 14 maart 2006 @ 10:31:
[...]

Kan je niet gewoon je laatste rij oppakken ?
iets van
code:
1
2
id = scheduleTable.rows.count -1
scheduleTable.row(id).cell("id").text = "bla"

of zo....
Ik hoef niet de laatse rij te hebben, ik moet een rij (en cell) hebben die al bestaat.
Ik moet toch gewoon in een tabel naar de juist rij en cell gaan d.m.v. hun id`s op te geven?
Echt raar dat je in ASP.NET wel makkelijk dynamisch een tabel kunt aanmaken maar er vervolgens niet makkelijk dynamisch weer iets aan kunt toevoegen (behalve dan een nieuwe rij achteraan af na een bepaald aantal rijen)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 20:41

mulder

ik spuug op het trottoir

Misschien moet je anders om gaan beredeneren: ik teken nu 16:00 op 10 maart, is er data?

Anders zou je kunnen kiezen om de dataview goed op te bouwen, dwz voor elke (tijd)regel in je dag-overzicht een row en met gebruikers als columns.

oogjes open, snaveltjes dicht


  • Predje
  • Registratie: December 2002
  • Laatst online: 03-03-2025
Don Facundo schreef op dinsdag 14 maart 2006 @ 11:59:
Misschien moet je anders om gaan beredeneren: ik teken nu 16:00 op 10 maart, is er data?
Dat is dus wat ik niet wil, want dan moet ik ook voor elke regel zoeken in de database.
Ik wil gewoon 1 keer alles uit de database halen en dan achteraf de dataset doorlopen voor elke afspraak schrijf ik dan iets in de table cell die de tijd van deze afspraak als ID heeft.


Anders zou je kunnen kiezen om de dataview goed op te bouwen, dwz voor elke (tijd)regel in je dag-overzicht een row en met gebruikers als columns.
Zo`n idee kreeg ik dus na het doorlezen van het artikel van in dit topic werd opgegeven over het dataGrid component. Echter moet ik dan mijn hele tabel opnieuw maken (geen probleem), maar ben ik ook bang dat ik niet de vrijheid heb die ik nu heb omdat ik de tabel helemaal zelf (laat) ma(a)k(en).
Bovendien zie ik niet hoe ik de 1 column met de tijden (die dus dynamisch zijn) kan opnemen in mijn dataGrid tabel

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 20:41

mulder

ik spuug op het trottoir

Je haalt natuurlijk alleen de data op van vandaag, tijd x tot y. Bovendien kun je een resultset ook filteren.

[ Voor 4% gewijzigd door mulder op 14-03-2006 12:24 ]

oogjes open, snaveltjes dicht


  • Predje
  • Registratie: December 2002
  • Laatst online: 03-03-2025
Ik kan natuurlijk ook eerst mijn gegevens uit de database halen en deze plaatsen in een dataSet.
code:
1
2
3
myConnection.Open()
'gegevens ophalen, dataSet vullen
myConnection.Close()

Zolang in de dataSet dan niet Clear() blijven de gegevens toch bewaard?
Dan kan ik dus tijdens het dynamisch maken van de tableCell telkens door de dataSet lopen en als ik een hit heb (tijd voor dayGrid en tijd van DataRow in DataSet) de tableCell.Text aanpassen.

Weet iemand of ik goed denk?

  • cowgirl
  • Registratie: November 2000
  • Laatst online: 18-12-2025
Je kan inderdaad vooraf je data ophalen en bij elke cell in je dataset kijken (m.b.v. findrow bijvoorbeeld) of er data is om in de cell te plaatsen.

  • Predje
  • Registratie: December 2002
  • Laatst online: 03-03-2025
cowgirl schreef op dinsdag 14 maart 2006 @ 12:50:
Je kan inderdaad vooraf je data ophalen en bij elke cell in je dataset kijken (m.b.v. findrow bijvoorbeeld) of er data is om in de cell te plaatsen.
Haha, nu bedenkt ik dat wel mooi, maar na het lezen van een paar artikelen ben ik niet meer blij met de dataSet en wil ik mijn hele code weer opnieuw gaan schrijven op gebruik van de DataReader 8)7
Dit omdat de pagina waar ik het in de topic over heb alleen maar hoeft te lezen (niet delete, update, insert) en snelheid belangrijk voor me is.

artikelen;
http://www.devx.com/vb2themax/Article/19887/1954?pf=true
http://aspnet.4guysfromrolla.com/articles/050405-1.aspx

Eigelijk dus weer terug bij af.. en kan ik pas NA het maken van de tabel de cellen proberen te updaten met een datareader.

code:
1
2
3
4
5
6
7
8
9
'maak tabel, geef cellen een id

'connectie met database

While myReader.Read()
  'cell pakken a.h.v. zijn id HOE MOET DIT :P
End While

'sluit connectie

Verwijderd

Je stuit met dit stuk script hetzelfde probleem als script helemaal bovenaan. dynamisch ID ophalen kan natuurlijk wel maar ik weet niet hoe (dat moet ik straks ook weten, ben bezig met dynamsiche CMS)

Als ik het weet zal ik hier posten ;)

  • Predje
  • Registratie: December 2002
  • Laatst online: 03-03-2025
Verwijderd schreef op dinsdag 14 maart 2006 @ 16:19:
Je stuit met dit stuk script hetzelfde probleem als script helemaal bovenaan. dynamisch ID ophalen kan natuurlijk wel maar ik weet niet hoe (dat moet ik straks ook weten, ben bezig met dynamsiche CMS)

Als ik het weet zal ik hier posten ;)
Nee toch? Want bovenaan heb ik toch mijn dynamische ID`s nog niet aangemaakt?
Ik dacht dat ik ze pas kon gaan vullen via een DataReader (blijkbaar veel sneller in de geval dan een dataSet) als ik ze aangemaakt had.

  • cowgirl
  • Registratie: November 2000
  • Laatst online: 18-12-2025
Kan je niet in het lezen van je datareader ook je table aanmaken, dus ongeveer zo:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Dim scheduleTable As New Table
Dim TijdStapRow As New TableRow
Dim MwNummer As String

'connectie met database
while myReader.Read()
       Dim tijdStapCell As New TableCell

       'cssclass aan de cell toevoegen
       tijdStapCell.CssClass = "scheduleTd"

       'id aan de cell geven zodat we deze terug kunnen vinden
       tijdStapCell.ID = MwNummer & "-" & Format(StartTijd, "H:mm")

       'CELL VULLEN MET DATA UIT READER

       'cellen aan TijdStapRow toevoegen
       TijdStapRow.Cells.Add(tijdStapCell)

End While

'naar de volgende geselecteerde medewerker

'TijdStapRow in table voegen
scheduleTable.Rows.Add(TijdStapRow)

En dan met name op regel 15 je ding met je reader doen.

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
Kan geen VB maar wel C#.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String[] MwNumArray = new String[] {"0", "1", "2", "3", "4"};
        TableRow tijdStapRow = new TableRow();
        foreach (String MwNummer in MwNumArray)
        {
            TableCell tijdStapCell = new TableCell();
            tijdStapCell.CssClass = "scheduleID";
            tijdStapCell.ID = MwNummer + "-" + "tijd";
            tijdStapRow.Cells.Add(tijdStapCell);
        }


        int gewensteId = 3;
        TableCell myCell = tijdStapRow.Cells[gewensteId];

        // etc.


Succes..
En als je per se op die rare MwNummer + tijd als ID wil selecteren moet je er met een foreach-lus door de tijdStapRow collection.
C#:
1
2
3
4
5
6
7
8
9
String ikzoek = MwNummer + "-" + "tijd";
TableCell myCell;
        foreach (TableCell cell in tijdStapRow.Cells)
        {
            if (cell.ID == ikzoek)   { 
            myCell = cell;//gevonden!!
            break; 
            }
        }

[ Voor 70% gewijzigd door Mastermind op 14-03-2006 18:42 . Reden: typefouten eruit gehaald ]


  • Predje
  • Registratie: December 2002
  • Laatst online: 03-03-2025
Oplossing

Ik ben er eindelijk uit :*)
aangezien je echt met geen mogelijkheid tableCells kunt ophalen a.d.h.v. hun id loop ik maar door hun idexen heen, dus blijkt nu heel snel en trefzeker te werken.
Ik moet wel wat tellertje enzo laten meelopen om te zorgen dat het allemaal goed gaat, maarja dan heb ik ook wat :P
Nu heb ik iig m`n eigen tabel draaien met daarbij mijn eigen vrijheid(blijheid)
Voor geintresseerden hoor de code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
        '/////////////////////////// DayGrid vullen moet de afspraken /////////////////////////////////////////

        'het aantal kollomen ophalen, -1 omdat de eerste kollom geen medewerker is maar de tijd vertegenwoordigd.
        Dim CellsCount As Integer = scheduleTable.Rows.Item(0).Cells.Count - 1

        'beginnen bij ID 0 als eerste kolom / werknemer
        'CellStartID wordt met 1 verhoogt na elke kolom / werknemer
        Dim CellID As Integer = 0

        'het aantalRows tellen - het totaal aan tijdVlakken en de headerRow
        Dim RowsCount As Integer = scheduleTable.Rows.Count - TotaalTijdVlakken
        'de RowsCount om mee te werken
        Dim RowCountTemp As Integer = RowsCount

        'door alle medewerkers heenlopen
        For Each MwNummer In MwNumArray

            'de begintijd van de geselecteerde dag ophalen
            Dim BeginTijd = StartTijd

            'de eerste row vastleggen, ID 1 zijn de headers
            Dim RowsID As Integer = 2

            'Rows die geweest zijn tellen zodat wel om de zoveel rows de rowspan kunnen overslaan
            Dim RowsDone As Integer = 0

            'SQL query opbouwen
            Dim mySelectQuery As String = "Select StartDatumTijd, EindDatumTijd, MedewerkerNr from tblafspraken WHERE (StartDatumTijd >= '" & SeldayStartNew & "' AND StartDatumTijd < '" & SelDayEindNew & "') AND MedewerkerNr ='" & MwNummer & "';"
            'SQL query in de connectie zetten
            Dim myCommand As New MySqlCommand(mySelectQuery, myconnection)
            'database openen
            myconnection.Open()
            'dataReader declareren, ik gebruik dat datareader voor de performance
            Dim myReader As MySqlDataReader
            myReader = myCommand.ExecuteReader()

            'controleren of de datareader wel resultaten heeft
            If myReader.HasRows Then

                'Altijd eerst READ aanroepen voor data ophalen
                While myReader.Read()
                    'start en eindtijd van de afspraak ophalen en omzetten naar het juiste formaat voor vergelijking
                    Dim AfspraakBegin As DateTime = Format(myReader.GetDateTime(0), "H:mm")
                    Dim AfspraakEind As DateTime = Format(myReader.GetDateTime(1), "H:mm")

                    'door alle rows loopen in scheduleTable
                    Do While RowsID <= RowCountTemp

                        'als BeginTijd eerder is dan AfspraakBegin moeten we de tussenliggende rows overslaan
                        If BeginTijd < AfspraakBegin Or BeginTijd >= AfspraakEind Then
                            'WAAROM || If BeginTijd > AfspraakBegin Or BeginTijd <= AfspraakEind Then || HET NIET DOET IS EEN RAADSEL!
                        Else

                            'de cell de juiste CssClass geven
                            scheduleTable.Rows.Item(RowsID).Cells(CellID).CssClass = "VolleUren"

                            'einde tijdcontrole
                        End If

                        'ook de BeginTijd verhogen met de eerder opgegeven tijdstappen
                        BeginTijd = BeginTijd.AddMinutes(TijdStappen)

                        'RowsDone optellen
                        RowsDone = RowsDone + 1

                        'de RowId verhogen zodat we naar de volgende row gaan
                        If RowsDone = (TijdWeergave / TijdStappen) Then
                            RowsID = RowsID + 2
                            RowsDone = 0
                            RowCountTemp = RowCountTemp + 1
                        Else
                            RowsID = RowsID + 1
                        End If

                    Loop
                    'einde door rows loopen

                    'Alle tellers legen om naar de volgende afspraak te kunnen gaan
                    RowsDone = 0
                    RowsID = 2
                    RowCountTemp = RowsCount
                    BeginTijd = StartTijd

                End While

            End If

            'dataReader sluiten
            myReader.Close()
            'database connectie sluiten
            myconnection.Close()

            'voordat we naar de volgende MedeWerker gaan verhogen we ook nog de CellID
            CellID = CellID + 1

        Next

Voor mensen die hier iets aan kunnen toevoegen, heel graag!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
Predje schreef op donderdag 16 maart 2006 @ 14:30:
Oplossing

Ik ben er eindelijk uit :*)
aangezien je echt met geen mogelijkheid tableCells kunt ophalen a.d.h.v. hun id loop ik maar door hun idexen heen, dus blijkt nu heel snel en trefzeker te werken.
Kan wel, heb je mijn post wel gelezen? :Z

  • Predje
  • Registratie: December 2002
  • Laatst online: 03-03-2025
Mastermind schreef op donderdag 16 maart 2006 @ 18:11:
[...]


Kan wel, heb je mijn post wel gelezen? :Z
Je ik heb je post zeker gelezen. Ik ben nu dus ook van je eerste optie uitgegaan, maar zie nu dat ik over veel "drempels" van mijn tabel heen moet staan -lees meerdere tellertjes laten meelopen om alleen de juiste cellen te nemen-.
Ik denk nu dat je tweede optie een "cleanere" oplossing is en eigelijk niet andersom.
Nu loop ik door alle cellen heen en kijk ik per cell of de tijd die ook meeloopt hetzelfde is, jouw tweede optie neemt gewoon de tijd en loop dan door alle cellen om de bijhorende ID te vinden.
Ik snelheid maakt het niet veel uit denk ik maar ik code kan het wel meer dan de helft schelen.
Ik ga het vandaag eens op die manieren maken en kijken wat de beste prestatie leverd.
Bedankt iig! _/-\o_
Pagina: 1