Ik zit nu al 2 dagen tegen het volgende probleem aan te hinken: In Delphi.net ben ik bezig om een datagrid webcontrol te schrijven waarbij het paging, sorting, delete kolommen en andere dingen die je anders steeds een zou moeten stellen ingebouwd zijn.
Enkel heb ik heel de tijd problemen met het dynamisch toevoegen van kollommen.
De twee hoofdproblemen zijn:
*Dat ik het niet voor elkaar krijg om (Bound)kollomen toe te voegen op naar, waarmee later nog mee kan worden gesorteerd.
*Dat ik het niet voor elkaar krijg om Template/Link/Edit/Delete kollomen achter het datagrid toe te voegen.
Ik denk zelf dat deze problemen met elkaar samen hangen. De eerste lukt wel als ik autogeneratecolumns op true zet alleen dan krijg ik 1. te veel kollomen en 2. kan ik die extra kollomen er niet achter gezet. Ik wil namelijk de volgende indeling:
[Checkbox kolom][DataKolom1][DataKolomN][EditKolom][DeleteKolom]
De control heeft de volgende functies en variabelen (met eventueele relevante code).
* oDataTable: propertie dan kan worden geset van buiten af.
* FirstSortingField:propertie dan kan worden gezet voor het sorteren.
* Create Hier in wordt AutoGeneratieColumns op false gezet en wordt FirstSortingField op '' gezet
* OnInit Worden de events gekoppeld en extra kolloms worden getoond (op de verkeerde plek)
* BWDataGrid_Load Waar er sort informatie in de viewstate wordt gezet en uit eindelijk de CreateDataGridColumns functie wordt aangeroepen (Deze werkt op de extrakolom plaats na)
* BWDataGrid_Paging (Deze werkt op de extrakolom plaats na))
* BWDataGrid_Sorting Er wordt niet eens lang deze functie gegaan als AutogenerateColumsn op false staat
* CreateDataGridColumns Als test wordt er de arraylist (names) meegegeven. Dit is het enige punt waar wordt ge-DataBind. Daartussen wordt de datasource geset (vanuit deen DataTable.DefaultView met sort informatie en worden daar onder de DataColumns toegevoegd
* CreateDataSet Hier wordt de datasource aangemaakt in de vorm van een view met sort informatie die is geset als zo (voorbeeld) en wordt als een ICollection terug gegeven
* AddDataTableColumns Hier wordt enkel een loop waar elke names van de arraylist in wordt bekenen
* AddDataTableColumn Krijgt een name binnen door loopt een loop om de kollomen te bounden en de sort expression toe te voegen, ik denk dus zelf dat het hier ergens in zit. Maar waarom zou hij er moeilijkheden mee hebben?
Als er dus wordt gesorteerd worden enkel de extra kollomen zoals bv de checkboxkolom en de delete kolom weergegeven.
Ik hoop dat ik hiermee genoeg informatie gegeven. Nog even visueel:
In het geval van page_load en of paging (dus de extra kolommen verkeerd)

In het geval van sorteren (en op knoppen klikken die nog niets doen).
Ik zie net dat ik ben vergeten om een sub topic titel er bij te zetten
@Belle: Ehm het probleem is nogal irritant te omschrijven, Dynamische Kollomen?
Enkel heb ik heel de tijd problemen met het dynamisch toevoegen van kollommen.
De twee hoofdproblemen zijn:
*Dat ik het niet voor elkaar krijg om (Bound)kollomen toe te voegen op naar, waarmee later nog mee kan worden gesorteerd.
*Dat ik het niet voor elkaar krijg om Template/Link/Edit/Delete kollomen achter het datagrid toe te voegen.
Ik denk zelf dat deze problemen met elkaar samen hangen. De eerste lukt wel als ik autogeneratecolumns op true zet alleen dan krijg ik 1. te veel kollomen en 2. kan ik die extra kollomen er niet achter gezet. Ik wil namelijk de volgende indeling:
[Checkbox kolom][DataKolom1][DataKolomN][EditKolom][DeleteKolom]
De control heeft de volgende functies en variabelen (met eventueele relevante code).
* oDataTable: propertie dan kan worden geset van buiten af.
* FirstSortingField:propertie dan kan worden gezet voor het sorteren.
* Create Hier in wordt AutoGeneratieColumns op false gezet en wordt FirstSortingField op '' gezet
* OnInit Worden de events gekoppeld en extra kolloms worden getoond (op de verkeerde plek)
C:
1
2
3
4
5
6
7
8
9
| procedure BWDataGrid.OnInit(e: System.EventArgs); begin Include(self.PageIndexChanged, self.BWDataGrid_Paging); Include(self.SortCommand, self.BWDataGrid_Sorting); Include(self.Load, self.BWDataGrid_Load); if CheckBoxDeleteColumn then self.Columns.Add( addCheckBoxDeleteColumn); if EditColumn then self.Columns.Add( addEditColumn ); if DeleteColumn then self.Columns.Add( addDeleteColumn ); end; |
* BWDataGrid_Load Waar er sort informatie in de viewstate wordt gezet en uit eindelijk de CreateDataGridColumns functie wordt aangeroepen (Deze werkt op de extrakolom plaats na)
* BWDataGrid_Paging (Deze werkt op de extrakolom plaats na))
C:
1
2
3
4
5
| procedure BWDataGrid.BWDataGrid_Paging(sender : System.Object; e : DataGridPageChangedEventArgs); begin self.CurrentPageIndex := e.NewPageIndex; self.CreateDataGridColumns(); end; |
* BWDataGrid_Sorting Er wordt niet eens lang deze functie gegaan als AutogenerateColumsn op false staat
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| procedure BWDataGrid.BWDataGrid_Sorting(sender : System.Object; e : DataGridSortCommandEventArgs ); begin self.ViewState['orderBy'] := e.SortExpression.ToString; if self.ViewState['orderType'].ToString = 'ASC' then begin self.ViewState['orderType'] := 'DESC'; end else if ( self.ViewState['orderType'].ToString()= 'DESC') then begin self.ViewState['orderType'] := 'ASC'; end; self.CurrentPageIndex := 0; self.CreateDataGridColumns(); end; |
* CreateDataGridColumns Als test wordt er de arraylist (names) meegegeven. Dit is het enige punt waar wordt ge-DataBind. Daartussen wordt de datasource geset (vanuit deen DataTable.DefaultView met sort informatie en worden daar onder de DataColumns toegevoegd
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
| procedure BWDataGrid.CreateDataGridColumns(); var names : ArrayList; begin names := ArrayList.Create; names.Add('ID'); names.Add('Omschrijving'); names.Add('Naam'); names.Add('EenhedenID'); Self.DataSource := self.CreateDataSet(); self.AddDataTableColumns(names); self.DataBind; end; |
* CreateDataSet Hier wordt de datasource aangemaakt in de vorm van een view met sort informatie die is geset als zo (voorbeeld) en wordt als een ICollection terug gegeven
code:
1
| self.oDataTable.DefaultView.Sort := ViewState['orderBy'].ToString + ' DESC'; |
* AddDataTableColumns Hier wordt enkel een loop waar elke names van de arraylist in wordt bekenen
* AddDataTableColumn Krijgt een name binnen door loopt een loop om de kollomen te bounden en de sort expression toe te voegen, ik denk dus zelf dat het hier ergens in zit. Maar waarom zou hij er moeilijkheden mee hebben?
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| procedure BWDataGrid.AddDataTableColumn( name : String ); var I : integer; oBoundColumn : BoundColumn; begin for I := 0 to self.oDataTable.Columns.Count - 1 do begin if name = self.oDataTable.Columns[I].ColumnName then begin oBoundColumn := BoundColumn.Create; oBoundColumn.DataField := self.oDataTable.Columns[I].ColumnName; self.Columns.Add( oBoundColumn ); self.Columns[self.Columns.Count - 1].HeaderText := self.oDataTable.Columns[I].ColumnName; self.Columns[self.Columns.Count - 1].ItemStyle.Width := 125; self.Columns[self.Columns.Count - 1].SortExpression := self.oDataTable.Columns[I].ColumnName; end; end; end; |
Als er dus wordt gesorteerd worden enkel de extra kollomen zoals bv de checkboxkolom en de delete kolom weergegeven.
Ik hoop dat ik hiermee genoeg informatie gegeven. Nog even visueel:
In het geval van page_load en of paging (dus de extra kolommen verkeerd)
In het geval van sorteren (en op knoppen klikken die nog niets doen).
Ik zie net dat ik ben vergeten om een sub topic titel er bij te zetten
@Belle: Ehm het probleem is nogal irritant te omschrijven, Dynamische Kollomen?
[ Voor 9% gewijzigd door Verwijderd op 01-04-2005 14:33 ]