[asp.net]DataGrid met custom Columns

Pagina: 1
Acties:

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Ik ben bezig met een datagrid op een Asp.net webform ( in c# maar dat is niet echt belangrijk ). Ik wil hier zelf mijn columns aan toevoegen dus ik heb AutoGenerateColumns op false gezet.

In mijn Page_Load heb ik het volgende staan

C#:
1
2
3
CreateColumns();
if( !IsPostBack )
    FillDataGrid();

Ik creeer dus elke Request de benodigde columns. Dit wordt ook goed uitgevoerd als ik er met de debugger door heen loop. Ik doe dit elke request omdat je normaal gesproken je Control tree altijd weer op moet bouwen. Nou weet ik niet zeker of dit ook met de Columns van een datagrid moet maar als ik het alleen de eerste Request doet dan blijft het probleem ( wat ik zo even zal beschrijven ) ook.

Ik wil ook dat het datagrid gesorteerd kan worden dus ik heb AllowSorting op true staan en in mijn Page_Init heb ik het volgende staan
C#:
1
myDataGrid.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.myDataGrid_SortCommand);

en heb natuurlijk ook die eventhandler aangemaakt.

Nou het probleem. De eerste Request wordt alles netjes getoond zoals ik will. De data is goed gevuld en alle Columns zijn netjes aangemaakt. Echter als ik op een van de headers druk om te sorteren dan krijg ik alleen een lege pagina te zien. In mijn Sort EventHandler heb ik alleen een nieuwe FillDataGrid() staan maar daar komt hij niet eens als ik er een breakpoint zet.
Als ik in mijn Page_Load altijd mijn FillDataGrid() uit laat voeren dan wordt het event wel netjes uitgevoerd en werkt het allemaal wel. Het is toch echter de bedoeling dat de data in de ViewState ( die staat gewoon aan )komt te staan en dat ik niet elke round trip mijn data opnieuw moet binden. Dit is namenlijk nogal zonde als ik het later in mijn request ook alweer opnieuw bind.

Ik heb het gevoel dat ik iets heel simpels over het hoofd zie of dat ik gewoon verkeerd aan het denken ben maar ik zie het op dit moment even niet. Ik hoop dat iemand ziet wat ik verkeerd doe.

ps:
Ik heb ook geprobeerd om AutoGenerateColumns op true te zetten en dan nadat de Columns gegenereerd zijn daar de properties die ik wil wijzigen te wijzigen, maar zelf in het Pre_Render event is de Columns collectie dan nog leeg dus dan kan ik er ook niks aan wijzigen.

“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.”


  • whoami
  • Registratie: December 2000
  • Nu online
Volgens mij moet je je datagrid wel bij iedere postback opnieuw binden, want, je hebt 'm opnieuw gecreeërd.
Het ophalen van de data 'moet' je niet iedere keer opnieuw doen.

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Nee tuurlijk ga ik niet iedere keer mijn data opnieuw ophalen :).

Maar als ik bijvoorbeeld zelf 3 TextBoxen aan mijn WebForm toevoeg en daar alleen in mijn eerste request Data inzet. Dan hoef ik bij de PostBack alleen maar de TextBoxen toe te voegen en dan zorgt ASP.NET er zelf voor dat na de Page_Load de data weer gevuld wordt aan de hand van de ViewState en de Post data en zorgt hij dat alle events daarvan uitgevoerd worden. Zo werkt dit ook bij Custom controls die je zelf toevoegt. Ik zou het vreemd vinden dat ik dan alsnog weer zelf de Data aan mijn DataGrid moet toevoegen. Wat heeft het anders voor nut dat hij dit in de ViewState zet?

[ Voor 19% gewijzigd door Woy op 07-06-2005 11:31 ]

“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.”


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Het werkt nou wel zoals het hoort. In plaats van de CreateColumns in de Page_Load te laten gebeuren gebeurt het nu in de Page_Init.

Op zich vindt ik dit wel vreemd want voor alle andere controls wordt de ViewState volgens mij wel pas na de Page_Load weer terug gezet. Mischien iemand die weet hoe dit komt?

“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

rwb schreef op dinsdag 07 juni 2005 @ 12:05:
Het werkt nou wel zoals het hoort. In plaats van de CreateColumns in de Page_Load te laten gebeuren gebeurt het nu in de Page_Init.

Op zich vindt ik dit wel vreemd want voor alle andere controls wordt de ViewState volgens mij wel pas na de Page_Load weer terug gezet. Mischien iemand die weet hoe dit komt?
Page_Load is te laat; controls horen aangemaakt te worden in Page_Init, anders kan de bijbehorende viewstate gek worden.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
gorgi_19 schreef op dinsdag 07 juni 2005 @ 12:27:
[...]

Page_Load is te laat; controls horen aangemaakt te worden in Page_Init, anders kan de bijbehorende viewstate gek worden.
Op zich ben ik het er mee eens dat het netter is in de Page_Init. Maar als ik in de Page_Load een TextBox dynamisch toevoeg dan werkt het wel gewoon. Wat is het verschil tussen een TextBox en een DataGrid in dit geval.

Maar wat ik eerst had was dat ik het in de CreateChildControls deed. Maar op een of andere manier leek dit ook niet te werken. Terwijl dit mij eigenlijk de perfecte plek lijkt om het te doen.

[edit]
Nog even ter aanvulling waarom het niet werkt met AutoGenerateColumns. In de MSDN staat dit
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.
Dus de columns worden niet toegevoegd aan de Columns collection. Staat dus wel gewoon gedocumenteerd maar had er even over heen gelezen. Ik vindt het echter wel vreemd dat ze niet toegevoegd worden.

[ Voor 32% gewijzigd door Woy op 07-06-2005 12:43 ]

“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.”

Pagina: 1