27. januar 2006 - 23:16Der er
30 kommentarer og 1 løsning
Hent data ind i en repeater
Hej,
Jeg har et problem med at hente data ind i min repeater
Når jeg prøver for jeg den fejl der hedder: Object reference not set to an instance of an object
Hvad betyder denne fejl helt præcis ?
Jeg har skrevet flg. kode public void bindOver(string strDSN) { myConn = new OleDbConnection(strDSN); string query = "Select * From PollQ where PollId = 14"; adp1 = new OleDbDataAdapter(query, myConn); DataSet ds = new DataSet(); adp1.Fill(ds, "PollQ"); myConn.Open(); foreach(DataRow dr in ds.Tables[0].Rows) { spg.Text = dr["PollQ"].ToString(); start.Text = dr["start"].ToString(); slut.Text = dr["slut"].ToString(); } myConn.Close();
Som regel skyldes fejlen at du benytter et objekt der ikke er initialiseret (har en værdi).
ds bliver initialiseret til et tomt dataset ved adp1.fill, så vidt jeg kan se (har ikke kompileret for at tjekke). Du åbner ikke dataforbindelsen før bagefter og du henter ikke data mellem fill og din foreach løkke.
Du kan tjekke det ved at sætte en if sætning ind omkring foreach konstruktionen. Der kan du tjekke om første element er eksisterer...
hvis du i din template har f.eks. en tekstboks med id spg, så kan du ikke få fat på den på den måde du gør - når den ligger i en repeater, og selvom du kunne - ville denne kode her:
foreach(DataRow dr in ds.Tables[0].Rows) { spg.Text = dr["PollQ"].ToString(); start.Text = dr["start"].ToString(); slut.Text = dr["slut"].ToString(); }
ikke give megen mening.
for hver række i din tabel vil du sætte en Text-property på det samme objekt?
du må enten benytte dig af databinding, eller bygge dit ui manuelt - dvs:
1) Behold dine kontroller i din template (som jeg gætter på at du har), og angiv databindingsudtryk på dine Text-properties.
2) Drop repeateren, og byg din side dynamisk op udfra data i din tabel, hvilket så vil medføre at du skal skrive lidt mere kode end du har nu.
Hej Jeg kigger lige svarne igennem, min internet forbindelse kommer og går meget for tiden, så det kan være der lige går lidt før jeg kan svare, men i hvertfald tak for hjælpen
Snepnet -> Jeg er blevet lidt forvirret, hvordan mener du jeg skal databinde min textproperties? Mit problem er at jeg først henter det der skal stå i mit headertemplate, og udfra hvilket id der skal være der så henter jeg det der så i min itemtemplate. ?
Hvad er ideen med: private void BindRepeater() { PersonList personer = new PersonAccess().GetAllPersons(); repeater.DataSource = personer; repeater.DataBind(); } ??
Hummm det ser ikke ud til min anden kommentar kom igennem (satans internet :D)
Ideen er at sidste gang lykkes det os at få selve svar mulighederne ind i radiolist, nu mangler jeg bare at få selve sprørgsmålet ind, samt start og slut.
Ideen er at det står i header template (spørgsmålet, start og slut) har en værdi, udfra denne værdi skal den hente itemtemplate hvor så selve svar mulighederne står.
private void BindRepeater() { PersonList personer = new PersonAccess().GetAllPersons(); repeater.DataSource = personer; repeater.DataBind(); }
var bare konceptuel... altså at du har et eller andet du kan hente dine data fra (et datalag af en art).
mht. dit spørgsmål, så kan jeg ikke forstå idéen med repeateren, hvis du vil ændre header for hvert item.... det giver ikke så meget mening synes jeg. desuden kan du ikke databinde til din header, så der er nogle tekniske detaljer omkring at benytte den som et item på lige fod med dine reelle items. og.... hvis du du bruger én repeater til at fremvise specifikke headers, og så lægger en spørgsmålsliste ind i ét enkelt repeateritem - er det jo så også et tegne på at repeateren overhovedet ikke er den komponent du skal benytte.
hvis du på en siden ønsker at liste en stribe af spørgsmål - med diverse svarmuligheder under hvert spørgsmål - giver det til gengæld god mening hvis du har en repeater (en ydre repeater) der har en itemtemplate der beskriver hvor du vil vise det enkelte spørgsmål. i denne ydre repeater har du så i din itemtemplate en indre repeater der viser svarmuligheder for det enkelte spørgsmål. din headertemplate vil så være tom.
Nej vil ændre itemlisten udfra hvad der står i headeren, dvs. det id den henter fra DB'en bruger den så til at lave en forspørgelse til de data den skal bruge i itemlisten.
mvh
p.s jeg kommer nok ikke til at kunne skrive her inde før enten i aften eller i morgen :D. men mange tak for hjælpen indtil videre :D
Jeg har ikke helt mulighed for at sende en tegning ind. Jeg har nedenfor prøvet at vise ideen med det, (men er ikke lige sikker på hvordan det ser ud når jeg trykker send)
--------------- | afstemning 1| | Spg: ? | | Start: | --> Alt dette kommer fra tabel ("PollQ"); | Slut | |-------------| |x Mulighed 1 | |x Mulighed 2 | --> Alt dette kommer fra Tabel ("PollAnswer"); |x Mulighed 3 | ---------------
Så skal der være alle de afstemninger nedad som der er aktive.
så er vi også tilbage ved at du skal have en ydre repeater (eller tilsvarende) der viser afstemninger, og en indre repeater (eller tilsvarende) der viser muligheder. mvh
// en ydre repeater: <asp:Repeater id="outerRepeater" runat="server" ItemDataBound="outerRepeater_ItemDataBound"> <ItemTemplate> // nogle kontroller ... labels, tekstbokse... hvad du nu har brug for og: <asp:Repeater id="innerRepeater" runat="server"> // som dine muligheder nu skal se ud </asp:Repeater> <ItemTemplate> </asp:Repeater>
og i din kode:
if(!IsPostBack) { BindOuterRepeater(); // som du nu engang gør }
protected void outerRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) { // koden herinde køres hver gang en række i din ydre repeater databind // så du skal have fat i rækken og hente data baseret på den // det data sætter du så som datakilde til din indre repeater i det respektive item // og databinder den DataRowView row = e.Item.DataItem as DataSourceView; int pollQueId = (int)row["PollQId"]; Repeater innerRepeater = e.Item.FindControl("InnerRepeater") as Repeater; innerRepeater.DataSource = GetOptions(pollQueId); innerRepeater.DataBind(); }
// og du skal så også have en metode til at hente dine muligheder med - f.eks. i denne stil: protected DataTable GetOptions(int pollQueId) { // hent data som du plejer - og returner tabellen }
ovenstående er en rimelig ofte benyttet måde at gøre det på (altså sådan konceptuelt).
ved ikke om du stadig har problemer, men hvis du sætter et breakpoint på denne linie: DataRowView row = e.Item.DataItem as DataRowView; //DataSourceView; hvad er det e.Item.DataItem der så?
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.