Gå til innhold

LØST. Problem med gridview event firing


Anbefalte innlegg

Hei. Jeg har en gridview. Når jeg klikker på en rad blir ikke GridView1_SelectedIndexChanged eventen kalt direkte men istedenfor blir hele "code behind" kjørt helt fra toppen av der hvor klassen begynner etterfulgt av Page_Load hvor jeg da har databind funksjonen og når Page_Load er kjørt ferdig da kjører denGridView1_SelectedIndexChanged. Med andre ord jeg databinder 2 ganger samme data noe som jeg taper masse tid på. Er dette noe slags bug i .net eller?

 

Please jeg trenger virkelig hjelp med denne.

Endret av evgeny
Lenke til kommentar
Videoannonse
Annonse

Ja det har jeg funnet ut men da får jeg et annet problem. Jeg har noen variabler som jeg henter fra basen i Page_Load metoden. Disse bruker jeg i GridView1_SelectedIndexChanged metoden. I dette tilfellet har jeg 2 problemer. Hvis jeg henter variablene i if (!Page.IsPostBack) da er variablene lik 0 når jeg skal jobbe med de i GridView1_SelectedIndexChanged. Hvis jeg henter de utenfor if (!Page.IsPostBack) da gjør jeg jobben 2 ganger noe som jeg taper ytelse på.

 

Noen forslag?

 

EDIT: Kanskje jeg kan putte de variablene inn i session objekter? Kan man putte arraylist i session objekter?

Endret av evgeny
Lenke til kommentar

Hvis du vil lagre en variabel mellom postbacks er det flere måter å gjøre det på, avhenging av hvordan variablene brukes og hvor statiske de er.

 

Hvis det er variabler som sjelden endrer seg og som er felles for alle brukere kan du lagre de i Cache eller i Application[] objektet. Forskjellen er at ting du legger i Cachen kan "gå ut på dato" mens ting i Application[] blir værende der så lenge applikasjonen din kjører.

 

Hvis det er variabler som er brukerspesifikke men som sjelden endrer seg kan du legge de i Session[] objektet. Den er separat for hver bruker og varer så lenge brukeren er på siden din (som regel i 20 minutter etter siste sidelasting).

 

Hvis det er ting som bare er gyldige på den siden du er på er det ikke en smart idé å legge ting i Session[], de blir nemlig liggende lenge og dermed bruker du unødvendig mye minne på serveren din. Da er det noen ganger bedre å bruke ViewState. Når du legger ting i ViewState blir det enkodet og lagt med, skjult, på websiden som blir levert til klienten. Ulempen med ViewState er at hvis du legger store objekter i ViewState blir det tilsvarende mer data som skal leveres til nettleseren. Den egner seg derfor best til enkle variabler eller små lister. Aldri legg store og komplekse objekter inn i ViewState (helst ikke Session heller med mindre du vet/tenker over hva du holder på med).

 

Når det gjelder UpdatePanel så er det ett verktøy som kan brukes og misbrukes. Den er veldig kjapp og enkel å bruke (som utvikler) men du får fremdeles en full postback hvor page_load kjøres og i hele siden blir evaluert på serveren, selv om bare noe av dataene sendes tilbake til klienten. Sånn sett vil den ikke hjelpe deg med problemet ditt. Et updatepanel kan og gi deg noen rare effekter på siden din pga rekkefølgen ting evalueres på, det er en fordel å sørge for at siden fungerer fint uten updatepanel først og så legge det på.

 

I tillegg skal du være oppmerksom på at et UpdatePanel er "pratsomt". Det sender mye data frem og tilbake når det oppdateres. I mange tilfeller er det ikke noe problem men med mye innhold skalerer det dårlig og kan bli et ytelseproblem.

 

Hiver meg på Manfred sitt spørsmål, hvorfor bruker du ArrayList isteden for List<T>?

Lenke til kommentar

Jeg får ikke lagt arraylist som returneres fra webservice til session objektet.

 

Session["mfromList"] = lmresp.fromList as ArrayList;

Denne gir meg Cannot convert type 'object[]' to 'System.Collections.ArrayList' via a built-in conversion

 

Session["mfromList"] = (ArrayList)lmresp.fromList;

Denne gir meg Cannot convert type 'object[]' to 'System.Collections.ArrayList'

 

Please hjelp

 

EDIT: Object obj = lmresp.fromList;

ArrayList myArrayList = obj as ArrayList;

Denne gir ikke feil men myArrayList = null

 

Denne er vrien asa.

Endret av evgeny
Lenke til kommentar

Jeg fikk til object to arraylist konvertering. Slik ser det ut:

 

Session["mfromList"] = new ArrayList(lmresp.fromList); //lagrer i session

ArrayList fromList = new ArrayList((ArrayList)Session["mfromList"]); //tilbake fra session inn i arraylist

Endret av evgeny
Lenke til kommentar
Jeg fikk til object to arraylist konvertering. Slik ser det ut:

 

Session["mfromList"] = new ArrayList(lmresp.fromList); //lagrer i session

ArrayList fromList = new ArrayList((ArrayList)Session["mfromList"]); //tilbake fra session inn i arraylist

Du bør bruke as i typecasten tilbake.

 

Session["mfromList"] = minArrayList;

(...)

ArrayList minArrayList = Session["mfromList"] as ArrayList;

 

Men igjen: Se på List<T> i stedet for å bruke ArrayList. Det er stort sett bare gamle java-utviklere som bruker ArrayList av gammel vane :p

Lenke til kommentar

as brukes når en skal caste reference type (altså klasser og interfaces)

(*) brukes når en skal caste primitiver eller klasser som implementerer operators for konvertering.

 

edit:

Merk at "as" returnerer null dersom konverteringen ikke var vellykket.

Endret av GeirGrusom
Lenke til kommentar

Hva hvis du skal caste fra decimal til double da?

 

Eller hvis du lager denne klassen:

 

public struct SomeType
{
 public byte a;
 public byte b;
 public static operator short(SomeType val)
 {
return val.a | (val.b << 8);
 }
}

int main()
{
 SomeType tp;
 tp.a = 100;
 tp.b = 500;
 SomeFunctionThatTakesShort((short)tp);
}

 

:)

 

Begge to har sin funksjon mener jeg.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...