20. maj 2004 - 14:43Der er
15 kommentarer og 1 løsning
Instans mangler
Hej Kyndige.
Jeg har nu bøvler med dette problem i 6 timer, så nu vil jeg gerne videre, så håber i kan hjælpe mig. Situation er den at jeg har en side hvorpå der er 6 listboxe hvor man kan vælge ting, når man så trykker ok så er det meningen at tingene fra listboxene skal gemmes i et datagrid. Når man vælger nye ting, bliver det så også smidt i datagrided i en ny række. Dette er ententionen men det virker ikke, enten så kan jeg ikke arbejde på referencen(den mangler) ellers så initialiserer jeg den datatable som jeg arbejder på hver gang, sådan at jeg overskriver den første række hver gang. Her er et udsnit af noget kode for at gøre det nemmere at overskue
public abstract class CP_GetGamingtypeAndSubtype : System.Web.UI.UserControl { public DataTable dt;
if (!IsPostBack) { // HER HAR JEG LAGT INITALISERINGEN DA JEG SÅ VILLE MENE // AT DEN KUN BLIVER OPRETTET 1. GANG MAN BESØGER SIDEN dt = new DataTable(); }
}
private void Button1_Click(object sender, System.EventArgs e) { // HER PRØVER JEG SÅ AT ARBEJDE PÅ OBJECTET MEN FÅR SÅ // FEJLEN NEDERST I DOKUMENTET DataRow dtRow; dtRow = dt.NewRow(); }
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion }
/////////////// FEJLEN //////////////////// Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error: Line 131: { Line 132: DataRow dtRow; Line 133: dtRow = dt.NewRow();
hvis du gerne vil have at din DataTable skal blive oprettet automatisk igen skal du gemme den i viewstate og loade den igen når siden indlæses på serveren
Den er jeg nok til at have uddybet, da jeg aldrig har arbejdet med viewstate før.
Det jeg gerne vil have er at jeg første gange controllen loades, bliver der oprettet en datatable, som jeg kan kan tilføje rækker til indtil brugeren er færdig med at vælge det antal elementer som ønskes. Dette sker i flere omgange. Når brugeren har valgt første gang, så skal der laves en ny række i datatable, denne bindes så til datagriden som brugeren kan se. Derefter kan brugeren igen vælge, og en ny række bliver lavet.
hvis jeg skriver dt. har jeg ingen muligheder der hedder viewstate eller lignende, er også i tvivl om hvordan det hjælper min situation med ikke at kunne arbejde på objectet ?
Hvis du ser kilden på din ASP.NET-side når den vises i browseren, kan du se nær toppen et område der hedder "ViewState" som indeholder nogle spøjse tegn. Ved at sætte EnableViewState = True gemmer du din DataTable inde i de spøjse tegn, om man så må sige :) alternativet er at du skal re-initialisere den ved hvert pageload.
dette er hermed gjort, men det gør intet forskel, da det er arbejdet på min datatable som er problemet. Er det det rigtige sted jeg opretter den. Jeg kan godt bruge den hvis jeg smider den udenfor if (!IsPostBack), men så opretter den bare en ny hver gang siden loades(tror jeg) og derfor bliver datatable ved med kun at have en række.
Ja det er rigtigt. Som cyberfessor siger, du skal have den lagt i ViewState ... det kan jeg ikke helt se hvordan man umiddelbart kan gøre, uden at skulle lave en masse krumspring.
Hvis jeg sad i situationen ville jeg nok gøre noget i den retning i stedet:
if (!IsPostBack) { Session["dt"] = null; dt = new DataTable(); Session["dt"] = dt; } else { dt = (DataTable)Session["dt"]; }
Det kan du ikke fordi klienten ikke kan gemme på et objekt. Websider er stateless, hvilket vil sige at en webside principielt ikke kan huske en døjt om hvad den lavede lige før.
Det er ret upraktisk, hvilket er grunden til at Microsoft har fundet på ViewState.
I øvrigt skal du ikke være så ked af at bruge Session. Det er selvfølgelig bedst at undgå, men performancemæssigt er det såmænd helt acceptabelt.
Session er i øvrigt langt bedre end at putte store mængder informationer i ViewState. Nu ved jeg ikke hvor meget du har tænkt dig at putte i din DataTable, men du skal ikke putte særligt meget i, før det bliver tungt med ViewState.
Man kan åbenbart sætte ViewState på præcis samme måde som man sætter Session.
ViewState["dt"] = dt; osv.
Jeg tror dog ikke du kan vinde noget specielt på det.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.