login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Generic List(Of T) als Datagridview.Datasource (Opgelost)

Offline Ontani - 18/12/2008 11:52
Avatar van OntaniGouden medailleGouden medailleGouden medailleGouden medaille

-1
Hey,

Ik probeer voor een framework op het werk een duidelijke structuur op te zetten voor verbindingen naar de database toe.

Ik heb mijn eigen databasemodel gemaakt met behulp van een List(Of T).

Het model vindt je op:
http://www.pastebin.be/15518

Wanneer ik in m'n frmMain bijvoorbeeld
  1. Dim obj as New Entiteiten()
  2. obj.SelectAll()
  3. Datagridview.DataSource = obj.items


Doe dan wordt m'n datagridview opgevuld met alle records uit de database, en alle kolommen komen overeen met de kolommen in de Class EntiteitenColumns.

Maar nu zou ik graag ook het volgende kunnen doen:
http://www.pastebin.be/15517

Dus een beperkt aantal gegevens opvragen en deze weergeven in de datagridview.

Als ik die code uitvoer wordt er idd maar 1 regel uit de database gehaald. En zoals je kan zien in de Entiteiten Class bij de functie SelectById() wordt alleen het naam en omschrijving veld ingevuld.

Maar de andere kolommen Id, Gebruiker, Aangemaakt, Gewijzigd, Delete_Tabel, Delete_Cascade worden in de datagridview ook toegevoegd. Terwijl ik die absoluut niet nodig heb.

Ik zoek dus een manier om te bepalen welke properties uit mijn EntiteitenColumns moeten opgevuld worden en weergegeven in mijn datagridview.

Ik hoop dat je een beetje de structuur kan vinden van de applicatie.

Bijhorende variabelen zitten hier:
http://www.pastebin.be/15519
Maar zijn niet echt van belang.

Alvast bedankt.

14 antwoorden

Gesponsorde links
Offline Ultimatum - 18/12/2008 11:56
Avatar van Ultimatum PHP expert Kan je niet de column namen in een array zetten en de keys zijn dan de tabel velden en dan kijken welke velden je in je query ophaalt en dmv die array haal je alleen die values uit de array op. Dit is het makkelijkste wat ik zo kan bedenken.
Offline Ontani - 18/12/2008 11:59 (laatste wijziging 18/12/2008 12:00)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Er worden ook enkel maar de waardes opgehaald die ik definieer. Maar omdat het allemaal properties zijn van EntiteitenColumns worden toch al die columnheadings weergegeven. Ik zou die graag automatiseren en dus niet meer code in mijn frmMain krijgen.

Want je kan natuurlijk manueel alle kolommen verwijderen die je niet nodig hebt, maar zo wil ik het niet doen.
Offline Ultimatum - 18/12/2008 12:05
Avatar van Ultimatum PHP expert Maar kan je niet alles wat tussen SELECT en FROM staat en dan in je array gooien als keys, en wat je terug krijg gooi je in een methode die columnheaders maakt. Zo worden de headers aangemaakt als je de methode SelectById gebruikt.
Offline Abbas - 18/12/2008 12:07
Avatar van Abbas Gouden medaille

Crew .NET
Heb je in je DataGridView de kolommen vast gedefinieerd? Want als je gewoon een DataGridView plaatst zonder deze al kolommen te geven, krijgt hij maar het aantal kolommen afhankelijk van de DataSource.

Je zou eventueel ervoor kunnen zorgen dat je vanuit je Class de DataGridView kan aanroepen om ook eventueel andere properties nog toe te passen hierop.

Of zie ik het verkeerd?
Offline Ontani - 18/12/2008 12:30
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
De kolommen zijn niet vast gedefinieerd. Het is door de items as List(Of EntiteitenColumns) dat hij de kolomheader meekrijgt. Op een of andere manier zou ik moeten kunnen zeggen dat bepaalde properties niet getoond mogen worden. Als ik <Browsable(False)>_ voor m'n property zet dan wordt deze niet getoond in de datagrid view. Maar dit is een property die je niet kan instellen. Die False heb ik al geprobeerd te vervangen door een variabele, maar die kan enkel een Const zijn.
Offline Abbas - 18/12/2008 12:43
Avatar van Abbas Gouden medaille

Crew .NET
Misschien een beetje omslachtig en niet de mooiste code dan, maar kan je dan niet ofwel:
- kolomeigenschap Visible = False zetten
- DataGridView.Columns.Remove(teVerwijderenKolom)

En anders werken met een DataSet en die dan toewijzen aan de DataGridView.
Offline Ontani - 18/12/2008 12:49
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Dat is wat ik dus op dit moment moet doen, die visible false of Columns.RemoveAt(Index).
Offline Abbas - 18/12/2008 12:53
Avatar van Abbas Gouden medaille

Crew .NET
En lukt dat of niet? Waarom anders niet met de DataSet werken? 
Offline Ontani - 18/12/2008 12:55
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Omdat ik nu via een datareader werk wat opzich sneller is dan een dataset. Ook als ik met een dataset werk moet ik toch op voorhand gaan definiëren welke kolommen ik wil zien als dit het geval is zou ik dat graag met mijn List proberen, alleen weet ik gewoon niet hoe.
Offline nemesiskoen - 18/12/2008 13:21
Avatar van nemesiskoen Gouden medaille

PHP expert
Je kan ook gewoon je EntiteitenColumns klasse weglaten aangezien die niets doet, en elke keer als je dus:
  1. _items.Add(New EntiteitenColumns With { _
  2. .Id = CInt(sqlReader("id")), _
  3. .Naam = CStr(sqlReader("naam")), _
  4. .Omschrijving = CStr(sqlReader("omschrijving")), _
  5. .Gebruiker = CStr(sqlReader("gebruiker")), _
  6. .Aangemaakt = CDate(sqlReader("aangemaakt")), _
  7. .Gewijzigd = CDate(sqlReader("gewijzigd")), _
  8. .Delete_Tabel = CStr(sqlReader("delete_tabel")), _
  9. .Delete_Cascade = CStr(sqlReader("delete_cascade")) _
  10. })


Doet ipv New Entiteiten... gewoon New Object doen.
Hetzelfde bij:
  1. .Naam = CStr(sqlReader("naam")), _
  2. .Omschrijving = CStr(sqlReader("omschrijving")) _
Offline Ontani - 18/12/2008 13:38
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Die EntiteitenColumns klasse wordt gebruikt zodat ik in mijn frmMain intelisense kan gebruiken. Als ik daar typ:
entiteit.items.

Krijg ik een lijst met mogelijke kolomwaardes.

- Aangemaakt
- Delete_Cascade
- Delete_Tabel
- Gebruiker
- Gewijzigd
- Id
- Naam
- Omschrijving
Offline nemesiskoen - 18/12/2008 13:44 (laatste wijziging 18/12/2008 13:46)
Avatar van nemesiskoen Gouden medaille

PHP expert
Dan kan je een method/property toevoegen (met een betere naam dan de onderste):

  1. Public ReadOnly Property SmallerVersion() As Object
  2. Get
  3. Return new Object With { .Naam = ..., .Omschrijving = ... };
  4. End Get
  5. End Property

En dan bij SelectbyId:

  1. EntiteitenColumns ec;
  2. While SqlReader.Read
  3. Try
  4. ec= New EntiteitenColumns With { _
  5. .Naam = CStr(sqlReader("naam")), _
  6. .Omschrijving = CStr(sqlReader("omschrijving")) _
  7. }
  8. _items.Add(ec.SmallerVersion)
  9. ...


You get the picture

Het is krom, het is lelijk, maar je hebt geen gezeik in je forms, als het werkt natuurlijk. I hope so:-)
Offline Ontani - 18/12/2008 13:54 (laatste wijziging 19/12/2008 09:13)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Ik heb het opgelost en het was simpeler als ik dacht:
Zoals je kan zien op: http://www.pastebin.be/15518
Staat er de Function items

  1. Public Function Items() As List(Of EntiteitenColumns)
  2. Return Me._items
  3. End Function


Omdat Me._items een instance is van EntiteitenColumns zal deze al altijd alle kolommen terug geven ook al worden niet alle kolommen ingevuld.

Als je dit vervangt door het volgende:

  1. Public Function Items() As IList
  2. Return (From columns In Me._items Select columns.Id, columns.Naam).ToList
  3. End Function


Dit werkt enkel in een .NET Framework waar LINQ ondersteund wordt.
Offline Abbas - 19/12/2008 10:01
Avatar van Abbas Gouden medaille

Crew .NET
LinQ for the win! 
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.199s