Toon posts:

[VB.NET] Datagrid runtime opbouwen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste mensen,

Ik ben momenteel bezig met het maken van een eigen Enterprize Managers functie. Namelijk het ophalen van een volledige tabel uit een database en dat de gegevens gewijzigd kunnen worden in het datagrid waar de records in worden geladen.

Nu werkt dit allemaal wel alleen zit ik met het volgende probleem.

De gebruiker kan door middel van een lijst kiezen uit een tabel in een database. Als deze tabel gekozen worden wordt de datagrid (Autogeneratecolumns=true) runtime gecreerd. De data van de dataview wordt gebind met de datagrid en nu word de tabel weergeven zoals verwacht. Ik heb echter een template columns nodig om er 2 knoppen in te hangen om de gegevens in de tabel te wijzigen en op te slaan. Deze kolommen kan ik maken met de juiste functionaliteiten alleen had ik graag gezien dat deze 2 colommen aan het eind staan. Dus de laatste 2 kolommen. Als ik de lege data grid bind met de dataview en er daarna (na de bind) nog die 2 kolommen aan toevoeg op de positie column.count dan worden deze 2 kolommen standaard vooraangezet.

Ik weet ook wat het probleem is: Het is namelijk zo dat de datagrid gebruik maakt van late binding. Hierdoor wordt de bind pas echt uitgevoerd na de postback. Als ik dus na de bind van het datagrid met de dataview de column.count opvraag van de tabel dan zal deze nog steeds de oude waarden bevatten en dat is dan 0. Indien ik een postback doe en daarna nog een keer vraag wat de column.count dan krijg ik pas de echte waarden. Ik zou het op kunnen lossen door een postback te generen en daarna de extra colommen pas toe te voegen aan de tabel alleen ik vind dit niet de mooiste oplossing en ik vraag me af of iemand hier een andere wat nettere oplossing voor heeft.

Ik weet ook niet of het zonder extra postback uberhaupt wel mogelijk is.

Indien er onduidelijkheden in dit verhaal zitten dan hoor ik het graag.

Mvg,
Perry

Verwijderd

Je kunt bij het binden van de datagrid het aantal kolommen in de table toch ook opvragen? Dan zou het niet zo moeilijk zijn...

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 28 september 2005 @ 09:47:
Je kunt bij het binden van de datagrid het aantal kolommen in de table toch ook opvragen? Dan zou het niet zo moeilijk zijn...
Dat is nu net wat ik probeer. Als er een bind is uitgevoerd staan de count van de kolommen nog steeds op 0. Dit door het late binding verhaal. Er wordt pas echt gebind op het moment dat je pagina word gedisplayed. Dan ben ik al te laat. Er zal dan een postback moeten plaatsvinden om nog een keer het juiste aantal kolommen op te halen, maar dat wil ik nu juist niet.

[ Voor 15% gewijzigd door Verwijderd op 28-09-2005 11:22 ]


Verwijderd

Topicstarter
Waar ik wel achter ben gekomen is dat de data wel aanwezig is. Als ik bij de items van de datagrid kijk na de bound dan kan ik de volledige inhoud wel terug vinden in het datagrid object. Het vreemde is alleen dat hij geen columns heeft. Ik kan dus ook geen column toevoegen op opsitie column.count.

Verwijderd

Verwijderd schreef op woensdag 28 september 2005 @ 11:21:
[...]


Dat is nu net wat ik probeer. Als er een bind is uitgevoerd staan de count van de kolommen nog steeds op 0. Dit door het late binding verhaal. Er wordt pas echt gebind op het moment dat je pagina word gedisplayed. Dan ben ik al te laat. Er zal dan een postback moeten plaatsvinden om nog een keer het juiste aantal kolommen op te halen, maar dat wil ik nu juist niet.
Hmms ik snap het ongeveer. Het probleem is dus dat je autogeneratecolumns gebruikt. Anders zou je runtime alle kolommen met data kunnen toevoegen aan de datagrid en vervolgens de 2 kolommen met de buttons. Je kunt nl. wel het aantal kolommen in de table opvragen. Dus autogeneratecolumns op false en handmatig alle kolommen met data toevoegen.

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 28 september 2005 @ 12:29:
[...]
Dus autogeneratecolumns op false en handmatig alle kolommen met data toevoegen.
Het probleem is dat ik niet weet hoeveel kolommen de geselecteerde tabel heeft. Ik weet verder niets van die tabel die ik ophaal. Het mag elke willekeurige tabel zijn. Als ik vaste kolommen had gehad dan was dit inderdaad het verhaal. Zo pas ik het al toe bij tabellen waarvan ik van te voren weet hoe die eruit ziet.

Handmatig alle kolommen vullen zonder DataView bound is ook uitgesloten aangezien een bound met een pionter naar de DataView werkt. De gegevens die in het grid moeten worden aangepast worden dan ook automatisch aangepast in je DataView waarna je vervolgens save data makkelijk de wijzigingen kan laten saven.

[ Voor 24% gewijzigd door Verwijderd op 28-09-2005 12:38 ]


Verwijderd

Je kan toch het aantal velden van je data opvragen = aantal kolommen in datagrid.

Overigens kun je ook de events van de datagrid eens bekijken, zoals de OnItem* events. Deze treden op op het moment dat je record gemaakt word in de grid.

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 28 september 2005 @ 12:37:
Je kan toch het aantal velden van je data opvragen = aantal kolommen in datagrid.

Overigens kun je ook de events van de datagrid eens bekijken, zoals de OnItem* events. Deze treden op op het moment dat je record gemaakt word in de grid.
Ik kan inderdaad het aantal velden opvragen. Ok dan heb ik het aantal kolommen wat ik zou moeten hebben. Maar hoe voeg ik dan een TemplateColumn toe op de juiste positie. De column count is namelijk niet bekend. Deze staat nog steeds op de oude waarde. Voeg ik een volledige Template Column toe dan zal ik toch echt de column.count moeten gebruiken en niet de items.cell.count en deze 2 verschillen van waarde omdat de Columns pas worden gemaakt nadat je pagina gerunt is.

[ Voor 7% gewijzigd door Verwijderd op 28-09-2005 12:42 ]


Verwijderd

Verwijderd schreef op woensdag 28 september 2005 @ 12:37:
Je kan toch het aantal velden van je data opvragen = aantal kolommen in datagrid.

Overigens kun je ook de events van de datagrid eens bekijken, zoals de OnItem* events. Deze treden op op het moment dat je record gemaakt word in de grid.
Inderdaad, bij ItemCreated zijn als het goed is alle kolommen gecreate. Kijk daar eens of daar het aantal kolommen wel bekend is.

Mijn manier werkt ook wel, je kunt gewoon itereren over het aantal kolommen, iets in de trend van:

foreach (column c in Table.Columns) {
dataGrid.AddColumn(...)
}

Verwijderd

Verwijderd schreef op woensdag 28 september 2005 @ 12:41:
[...]


Ik kan inderdaad het aantal velden opvragen. Ok dan heb ik het aantal kolommen wat ik zou moeten hebben. Maar hoe voeg ik dan een TemplateColumn toe op de juiste positie. De column count is namelijk niet bekend. Deze staat nog steeds op de oude waarde. Voeg ik een volledige Template Column toe dan zal ik toch echt de column.count moeten gebruiken en niet de items.cell.count en deze 2 verschillen van waarde omdat de Columns pas worden gemaakt nadat je pagina gerunt is.
Dat is wel vreemd idd.. Als je de waarde van table.Columns.Count gebruikt en je voegt op die plaats in de dataGrid.Columns array die templatecolumns toe, krijg je vast een exception.

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 28 september 2005 @ 12:42:
[...]

Inderdaad, bij ItemCreated zijn als het goed is alle kolommen gecreate. Kijk daar eens of daar het aantal kolommen wel bekend is.

Mijn manier werkt ook wel, je kunt gewoon itereren over het aantal kolommen, iets in de trend van:

foreach (column c in Table.Columns) {
dataGrid.AddColumn(...)
}
Humm. Dit zou wel kunnen maar hoe Bind je de data uit de DataView dan. Dit is niet mee mogelijk met een .DataBind() funtie. Ik wil wel dat ik de functionaliteit van de bind namelijk dat als er iets veranderd in de grid dat het ook meteen veranderd in de dataview. Is dit dan mogelijk?

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 28 september 2005 @ 12:43:
[...]

Dat is wel vreemd idd.. Als je de waarde van table.Columns.Count gebruikt en je voegt op die plaats in de dataGrid.Columns array die templatecolumns toe, krijg je vast een exception.
Precies die bestaat namelijk nog niet

  • BertS
  • Registratie: September 2004
  • Laatst online: 13-02 08:33
... sorry, moet voortaan eerst ff refreshen na een kwartier wat anders te hebben gedaan ...

[ Voor 80% gewijzigd door BertS op 28-09-2005 12:47 ]


Verwijderd

Verwijderd schreef op woensdag 28 september 2005 @ 12:44:
[...]


Humm. Dit zou wel kunnen maar hoe Bind je de data uit de DataView dan. Dit is niet mee mogelijk met een .DataBind() funtie. Ik wil wel dat ik de functionaliteit van de bind namelijk dat als er iets veranderd in de grid dat het ook meteen veranderd in de dataview. Is dit dan mogelijk?
Gewoon op dezelfde manier? Als de table die geselecteerd is veranderd, roep je toch ook een functie aan? In die functie kun je dan dataGrid.DataSource = dataView en vervolgens dataGrid.DataBind() aanroepen.

Heb je al gekeken naar die ItemCreated event? Daarin zou het aantal kolommen vd datagrid wel bekend moeten zijn.

Verwijderd

Topicstarter
bee-es schreef op woensdag 28 september 2005 @ 12:46:
Maar je kunt toch wel het aantal kolommen uit de dataview opvragen?
Tja maar wat doe ik daar dan vervolgens mee? Zie latebinding verhaal

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 28 september 2005 @ 12:47:
[...]

Heb je al gekeken naar die ItemCreated event? Daarin zou het aantal kolommen vd datagrid wel bekend moeten zijn.
Waar kan ik dat Event vinden.?

[ Voor 8% gewijzigd door Verwijderd op 28-09-2005 12:51 ]


  • BertS
  • Registratie: September 2004
  • Laatst online: 13-02 08:33
Verwijderd schreef op woensdag 28 september 2005 @ 12:44:
[...]


Humm. Dit zou wel kunnen maar hoe Bind je de data uit de DataView dan. Dit is niet mee mogelijk met een .DataBind() funtie. Ik wil wel dat ik de functionaliteit van de bind namelijk dat als er iets veranderd in de grid dat het ook meteen veranderd in de dataview. Is dit dan mogelijk?
Als je de columns in het grid als key de veldnaam uit de dataview meegeeft moet de binding volgens mij gewoon werken?

Verwijderd

Verwijderd schreef op woensdag 28 september 2005 @ 12:47:
[...]


Tja maar wat doe ik daar dan vervolgens mee? Zie latebinding verhaal
Ja, maar als je autogeneratecolumns uitzet, kun je daarmee alle kolommen toevoegen :). Maar ik vermoed dat het met het ItemCreated-event wel gaat werken.

Verwijderd

bee-es schreef op woensdag 28 september 2005 @ 12:51:
[...]

Als je de columns in het grid als key de veldnaam uit de dataview meegeeft moet de binding volgens mij gewoon werken?
Inderdaad, ik heb ook hier (een poging gewaagd) een datagrid runtime op te bouwen. Het is nog best wel lastig, dus ik raad het ook niet aan :) Zijn wel genoeg voorbeelden te vinden waarmee het wel lukt.

Verwijderd

Verwijderd schreef op woensdag 28 september 2005 @ 12:48:
[...]


Waar kan ik dat Event vinden.?
Eeuh al gezocht?? Je hebt 1 minuut gekeken... In VS staat hij gewoon bij Events. Event heet ItemCreated en zo voeg je hem toe:

code:
1
DataGrid.ItemCreated += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid_ItemCreated);

Dit had je zelf ook wel uit kunnen zoeken...

Als ik het goed heb, wordt deze event na het createn van de datagrid aangeroepen... Anders, shoot me.

[ Voor 11% gewijzigd door Verwijderd op 28-09-2005 12:55 ]


Verwijderd

Topicstarter
Verwijderd schreef op woensdag 28 september 2005 @ 12:51:
[...]

Ja, maar als je autogeneratecolumns uitzet, kun je daarmee alle kolommen toevoegen :). Maar ik vermoed dat het met het ItemCreated-event wel gaat werken.
Het itemsCreated event wordt als eerste aangeroepen. Dit is zelfs nog voor de bind. Ook hier heb ik nog geen columns.

Verwijderd

Verwijderd schreef op woensdag 28 september 2005 @ 12:55:
[...]


Het itemsCreated event wordt als eerste aangeroepen. Dit is zelfs nog voor de bind. Ook hier heb ik nog geen columns.
Probeer je het met ItemDataBound event. Vraag je elke keer het aantal kolommen op en als dit overeenkomt met het aantal kolommen in je dataset, weet je dat hij totaal gebound is. Beetje smerige oplossing, maar ik zou het anders ook niet weten.

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 28 september 2005 @ 12:54:
[...]

Dit had je zelf ook wel uit kunnen zoeken...
Ja klopt was even een stomme vraag.. Maar ben met zoveel tegelijk bezig.. Nou ja ik heb hem dus al gevonden. En helemaal uit mezelf. |:(

[ Voor 37% gewijzigd door Verwijderd op 28-09-2005 13:01 ]


Verwijderd

Topicstarter
Verwijderd schreef op woensdag 28 september 2005 @ 12:57:
[...]

Probeer je het met ItemDataBound event. Vraag je elke keer het aantal kolommen op en als dit overeenkomt met het aantal kolommen in je dataset, weet je dat hij totaal gebound is. Beetje smerige oplossing, maar ik zou het anders ook niet weten.
Ook deze oplossing werkt helaas niet. Hij roept dit event echt vaak aan alleen hij blijft 0 retourneren voor de column count.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
dat je 0 terug krijgt voor je column count klopt. Dit staat ook gewoon in de msdn
Note Explicitly declared columns may be used in conjunction with auto-generated columns. When using both, explicitly declared columns will be rendered first, followed by the auto-generated columns. Auto-generated columns are not added to the Columns collection.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Dan wordt het wel vrij lastig denk ik :)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik heb het ooit eens opgelost door zelf gewoon de columns aan de hand van je datasource te generenen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

rwb schreef op woensdag 28 september 2005 @ 13:07:
Ik heb het ooit eens opgelost door zelf gewoon de columns aan de hand van je datasource te generenen.
Ja, dat had ik hem ook als tip gegeven :) Is denk ik de enige oplossing.

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 28 september 2005 @ 13:18:
[...]

Ja, dat had ik hem ook als tip gegeven :) Is denk ik de enige oplossing.
Nou ja dan gaan we dat maar eens doen. Eens kijken of dat dan wil werken. Het is wel een omslachtige manier..

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 28 september 2005 @ 13:26:
[...]

Nou ja dan gaan we dat maar eens doen. Eens kijken of dat dan wil werken. Het is wel een omslachtige manier..
Nou ik heb het gemaakt zoals jullie zeiden, alleen nu loop ik tegen een zelfde probleem aan.
Zoals al in de msdn beschreven staat bestaan er geen columns in het geval van runtime column toevoegen. Ik heb dit dus nu per column gedaan en ik kan inderdaad nu de edit knop als laatste row hebben. Nu kom ik bij mijn update command en wat blijkt:................... De count van mijn e.item.Cells is 1! Tja nu kan ik nog niets updaten. In de datagrid staan er eerst een aantal columns met dan in de laatste Cell de knoppen, en toch bestaat alleen deze laatste Cell in mijn update command. Ik kan nu dus ook niet terug vinden waar ik mijn data (rest van de cellen) heb staan.

Is er nog een andere manier dan die van e.items.Cells om de data uit je datagrid te halen?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik snap niet helemaal wat je nou bedoeld maar als je bijvoorbeeld de volgende class maakt
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyDataGrid : System.Web.UI.WebControls.DataGrid
{
    public MyDataGrid(){}

    public void CreateColumnsFromTable( DataTable table )
    {
        foreach( DataColumn dataColumn in table.Columns )
        {
            BoundColumn boundColumn = new BoundColumn();
            boundColumn.DataField = dataColumn.ColumnName;
            boundColumn.HeaderText = dataColumn.ColumnName;
            Columns.Add( boundColumn );
        }
    }
}

en je doet in je page_load het volgende
C#:
1
2
3
4
5
6
7
8
9
private void Page_Load(object sender, System.EventArgs e)
{
    myDataGrid.CreateColumnsFromTable( myDataSource );
    if( !IsPostback )
    {
        myDataGrid.DataSource = myDataSource;
        myDataGrid.DataBind();
    }
}

Dan zou dat toch goed moeten werken? Zou je mischien even met een code voorbeeldje kunnen laten zien wat je nou precies wilt doen?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

Je hebt toch een Databind method welke je kan overriden?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
gorgi_19 schreef op donderdag 29 september 2005 @ 14:22:
Je hebt toch een Databind method welke je kan overriden?
Daar kan je idd ook nog iets mee doen. Maar dan zul je er volgens mij ook nog voor moeten zorgen dat in de CreateChildControls() die Columns ook toegevoegd worden voor de PostBacks waarvoor geen DataBind wordt uitgevoerd.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op donderdag 29 september 2005 @ 14:19:
Ik snap niet helemaal wat je nou bedoeld maar als je bijvoorbeeld de volgende class maakt
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyDataGrid : System.Web.UI.WebControls.DataGrid
{
    public MyDataGrid(){}

    public void CreateColumnsFromTable( DataTable table )
    {
        foreach( DataColumn dataColumn in table.Columns )
        {
            BoundColumn boundColumn = new BoundColumn();
            boundColumn.DataField = dataColumn.ColumnName;
            boundColumn.HeaderText = dataColumn.ColumnName;
            Columns.Add( boundColumn );
        }
    }
}

en je doet in je page_load het volgende
C#:
1
2
3
4
5
6
7
8
9
private void Page_Load(object sender, System.EventArgs e)
{
    myDataGrid.CreateColumnsFromTable( myDataSource );
    if( !IsPostback )
    {
        myDataGrid.DataSource = myDataSource;
        myDataGrid.DataBind();
    }
}

Dan zou dat toch goed moeten werken? Zou je mischien even met een code voorbeeldje kunnen laten zien wat je nou precies wilt doen?
Dit is precies wat ik doe..

Als ik nu doormiddel van een update command data in het datagrid wil wijzigen en opslaan naar de database, blijken de colommen niet te bestaan. Ik kan dus ook niets uit de textboxen halen om het vervolgens aan te passen in mijn dataset.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Weet je zeker dat je elke postback de Columns ook weer toevoegd? ( Je hoeft niet opnieuw te databinden )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op donderdag 29 september 2005 @ 14:40:
Weet je zeker dat je elke postback de Columns ook weer toevoegd? ( Je hoeft niet opnieuw te databinden )
Ja deze voeg ik elke keer toe.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op donderdag 29 september 2005 @ 15:56:
[...]

Ja deze voeg ik elke keer toe.
En voeg je ze ook goed toe is nu de vraag :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Probeer de columns eens al in de Page_Init toe te voegen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op donderdag 29 september 2005 @ 16:04:
Probeer de columns eens al in de Page_Init toe te voegen.
Dit maakt geen verschil.
Wat ik wel merk is dat ik de Cell wel heb als ik autogeneration = True zet.
Alleen heb ik dan weer geen columns en ik wil mijn edit knop aan het eind en niet aan het begin!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kijk anders even in dit topic [rml][ asp.net]DataGrid met custom Columns[/rml]. Ik had hetzelfde probleem en bij mij werkte het uiteindelijk allemaal.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op donderdag 29 september 2005 @ 16:30:
Kijk anders even in dit topic [rml][ asp.net]DataGrid met custom Columns[/rml]. Ik had hetzelfde probleem en bij mij werkte het uiteindelijk allemaal.
Het probleem is verholpen

AutogenerateColumns = true en vervolgens kan je wel je columns aanspreken.
Dit gaat dan niet via de column.count maar je kan er wel bij via het Datagrid_ItemDataBound event
met e.Item.Cells.count Deze geeft wel het aantal columns weer.

Gevonden via http://www.datagridgirl.com/

Verwijderd

Topicstarter
[edit]

Nou ja dan toch maar opgelost door de primary key in de tabel te zetten.

[ Voor 120% gewijzigd door Verwijderd op 03-10-2005 15:09 ]

Pagina: 1