Toon posts:

[ASP.NET/DataGrid] Dynamisch toevoegen kolommen *

Pagina: 1
Acties:

Verwijderd

Topicstarter
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)
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:
Afbeeldingslocatie: http://members.home.nl/shedfire/aliswell.JPG
In het geval van page_load en of paging (dus de extra kolommen verkeerd)
Afbeeldingslocatie: http://members.home.nl/shedfire/sorteren.JPG
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 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 08:09

gorgi_19

Kruimeltjes zijn weer op :9

Ik zie net dat ik ben vergeten om een sub topic titel
Dat zag ik ook :) Maar heb je een suggestie voor een goede titel? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 08:09

gorgi_19

Kruimeltjes zijn weer op :9

Maar wil je niet gewoon een aantal kolommen toevoegen tijdens het Init-event van je Page door middel van je datagrid.columns.add ?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Belle schreef op vrijdag 01 april 2005 @ 15:02:
Maar wil je niet gewoon een aantal kolommen toevoegen tijdens het Init-event van je Page door middel van je datagrid.columns.add ?
Dat kan volgens mij niet, omdat ik namelijk die oDataTable later vult in de code, like this:
C:
1
2
3
4
5
6
7
8
9
10
procedure TWebForm1.OnInit(e: EventArgs);
var
  oBlaat : BLProducten;
begin
  InitializeComponent;
  inherited OnInit(e);
  oBlaat := BLProducten.Create;
  oBlaat.selectProducten;
  BWDataGrid1.oDataTable := oBlaat.getDataTable;
end;


Dus hij is al ge-create. Daar heb ik zelf wel eens eerder moeilijkheden mee gehad namelijk :).