[C#/Asp.NET]Gridview verdwijnt na selecteren row

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:03

Haan

dotnetter

Topicstarter
Ik heb een Gridview met als eerste column een select column en verder twee columns met data. Tijdens debuggen vanuit Visual Studio werkt het selecteren van een rij in de grid prima, maar als de pagina op een server staat, verdwijnt de grid bij het selecteren van een rij :/

Het schijnt te maken hebben met dat je de data moet rebinden, maar ik kan niet vinden hoe je dat moet doen in C#. De persoon op deze pagina heeft volgens mij precies hetzelfde probleem, maar gebruik VB.Net en dat werkt blijkbaar net wat anders.

Ik heb geprobeerd om de databind methode aan te roepen in SelectedIndexChang(ed/ing), maar het enige dat ik daarmee bereik is dat de grid ook tijdens het debuggen verdwijnt :P Ook viewstate uitzetten helpt niet.

Het is volgens mij geen rocket-science dit, maar ik komt er niet uit ;(

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 11-09 14:44
Doe je databinding eens in Page_Init ipv (waarschijnlijk) Page_Load.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:03

Haan

dotnetter

Topicstarter
creator1988 schreef op vrijdag 09 oktober 2009 @ 10:12:
Doe je databinding eens in Page_Init ipv (waarschijnlijk) Page_Load.
_/-\o_

Stom dat dat niet te vinden was zeg.. Dankjewel!

Maar toch wel raar dat debuggen vanuit Visual Studio dan wel goed werkt :?

[ Voor 13% gewijzigd door Haan op 09-10-2009 10:25 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:03

Haan

dotnetter

Topicstarter
Ok dat probleem is nu opgelost, maar ik heb er nog een die niet op dezelfde manier op te lossen is volgens mij :P

Ik heb namelijk ook nog een grid dat gevuld wordt op basis van een zoekopdracht adv velden die eerst door een user zijn ingevuld. Dat betekent dat ik niet in de Page_Init kan databinden en dus verdwijnt m'n grid weer :( Hierbij ook een probleem dat het wisselen van pagina in de grid een klik achterloopt, dat heb ik eerder ook gehad bij een ListView die je dan moest binden in de PreRender.

Wat ik nu probeer is de data (een DataTable) in de ViewState te stoppen en deze in de PreRender van de gridview opnieuw te binden, maar de grid verdwijnt nog steeds :(

Iemand nog een idee hoe je deze situatie aanpakt?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

* gorgi_19 vermoedt dat je moet spelen met RowCreated events van je grid, naast je RowBound.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Kun je wat meer informatie geven want ik vermoed dat het meer dan alleen een simpele pagina is waarop een grid staat.

Het databinden van je gridview in de page init zou namelijk helemaal niet hoeven, sterker nog dat WIL je helemaal niet. Maar daar ben je zelf ook al tegen aangelopen toen je die zoekvelden wou gaan gebruiken :P.

Ik neem aan dat je het default Select command methode gebruikt. Indien je viewstate aan staat zou je dan dus niet opnieuw hoeven te databinden, je data wordt immers opnieuw toegekend in de page init vanuit je viewstate. (merk op, dit doet het webforms framework)

Je laatste reactie over dat je in de PreRender opnieuw doet databinden maar dat je grid nog steeds verdwijnt getuigd dat je ergens iets goed fout aan het doen bent.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:03

Haan

dotnetter

Topicstarter
Het is opzich wel een simpele pagina, met daarop een aantal zoekvelden en een knop 'Zoeken'. Na klikken op die knop wordt data opgevraagd uit een web service, in een datatable gestopt, en aan een gridview gebind:

C#:
1
2
3
4
5
DataTable data = new DataTable();
// creeër columns en voeg datarows toe

GridView1.DataSource = data;
GridView1.DataBind();


De gridview ziet er als volgt uit in de aspx file:
ASP:
1
2
3
4
5
6
7
8
<asp:GridView ID="GridView1" runat="server"
    CellPadding="4" AllowPaging="True"         
        onpageindexchanging="GridView1_PageIndexChanging" 
        onselectedindexchanged="GridView1_SelectedIndexChanged" >
          <Columns>              
              <asp:CommandField SelectText="Selecteer" ShowSelectButton="True" />              
          </Columns>
        </asp:GridView>

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 01-09 22:18
Probeer dit eens:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)
   {
      BindGrid();
   }
}

private void BindGrid()
{
    DataTable data = new DataTable(); 
    // creeër columns en voeg datarows toe 
    GridView1.DataSource = data; 
    GridView1.DataBind();
}

[ Voor 56% gewijzigd door Mastermind op 09-10-2009 12:31 ]


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
@Haan: Vaag. Weet je zeker dat je niet ergens opnieuw een lege datasource aan je grid bind ?

[ Voor 3% gewijzigd door D-Raven op 09-10-2009 12:34 ]


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Mastermind schreef op vrijdag 09 oktober 2009 @ 12:12:
Na een DataBind wordt de Page_Load weer aangeroepen, dus moet je kijken of er een postback is. Zoja, dan moet je de grid opnieuw binden.
...
Dat klopt niet. Als je op je Grid DataBind aanroept dan triggert dat echt niet een call op je Page_Load.
De IsPostBack geeft alleen maar aan of het een initiele load van je pagina is of dat het een postback vanuit een element in je pagina is.

M.a.w. Genereer je clientside een postback dan zal je IsPostBack true zijn, anders niet.

[ Voor 38% gewijzigd door D-Raven op 09-10-2009 12:18 ]


Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 01-09 22:18
D-Raven schreef op vrijdag 09 oktober 2009 @ 12:16:
[...]


Dat klopt niet. Als je op je Grid DataBind aanroept dan triggert dat echt niet een call op je Page_Load.
Probeer maar, zet er eens een breakpoint neer :)

Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Gedaan en het klopt nog steeds niet wat jij zegt :)

Wat er gebeurd is het volgende. Je drukt op de knop. Postback gebeurd. Pagina wordt geladen.
Dan gebeurd er het volgende:

Page-Init
Page-Load
Event handlers
OnPrerender

Zie ook: http://msdn.microsoft.com/en-us/library/ms178472.aspx

Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 01-09 22:18
Ja klopt je hebt gelijk, de knop zelf veroorzaakt de postback, was even in de war. Ik heb het bericht al gewijzigd om verwarring te voorkomen.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:03

Haan

dotnetter

Topicstarter
Mastermind schreef op vrijdag 09 oktober 2009 @ 12:12:
Probeer dit eens:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)
   {
      BindGrid();
   }
}

private void BindGrid()
{
    DataTable data = new DataTable(); 
    // creeër columns en voeg datarows toe 
    GridView1.DataSource = data; 
    GridView1.DataBind();
}
Dat doe ik liever niet, dan moet ik weer de data ophalen, of kan ik de datatable wel in de Viewstate (of ergens anders) opslaan?
D-Raven schreef op vrijdag 09 oktober 2009 @ 12:14:
@Haan: Vaag. Weet je zeker dat je niet ergens opnieuw een lege datasource aan je grid bind ?
Ik bind de data maar 1x, nadat de data is opgehaald na klikken op de zoek knop.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Dan gebeurd er toch ergens nog iets waardoor je grid niet getoond wordt. Visibility van het grid zelf die op false wordt gezet? of de container waar het grid inzit? div of ander element?

Als je namelijk in de eventhandler van je zoekknop opnieuw de data toekent aan je grid en daarna weer databind aanroept dan zou het wel degelijk moeten werken. :)

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Zo een datatable in een viewstate stoppen ga je niet blij van worden. Als je de boel serverside wilt houden, kan je de boel cachen in HttpRuntime.Cache, Sessions, whatever. Je kan ook overwegen om de service call clientside te laten uitvoeren met bijvoorbeeld JQuery/Ajax. Je bent nu met veel pijn en moeite een serverside wrapper om een webservice aan het bouwen en om serverside calls te voorkomen (en tijd te winnen), lijk je zo veel mogelijk data te willen ophalen en ergens cachen :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:03

Haan

dotnetter

Topicstarter
Ik begin er zo langzamerhand doodmoe van te worden. Steeds als ik iets heb dat tijdens lokaal debuggen perfect werkt, geeft het fouten als de pagina op de server draait :(

Werken met Session/Cache werkt opzich wel om de data in de GridView PreRender opnieuw te binden, zodat de grid niet meer verdwijnt. De Page_Init hoeft dan niet meer gebruikt te worden.

Maar dan, als ik de data ergens anders op wil slaan door op een button te klikken, krijg ik een
Sys.WebForms.PageRequestManagerServerErrorException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index'
Na veel zoekwerk de updatepanel en updateprogress verwijderd die ik op de pagina had staan, blijkt dat de SelectedRow van de grid leeg is en het dus fout gaat als je SelectedRow.Cells[0] wilt opvragen 8)7 sterker nog, de hele gridview is 'undefined'

Wat een gek*t om zoiets simpels aan de praat te krijgen zeg :/

[ Voor 3% gewijzigd door Haan op 11-10-2009 15:55 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 11-09 14:44
Paging dien je te implementeren in je DAO of in je webservice.

Wil of kan dit niet, dan moet je dat in je cache gaan stoppen; en met Skip() en Take() de juiste waardes binden aan je datasource.
Pagina: 1