Avatar billede brian-johansen Nybegynder
27. januar 2006 - 23:16 Der 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();

        }

mvh Brian
Avatar billede ladyhawke Novice
28. januar 2006 - 10:04 #1
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...
Avatar billede ladyhawke Novice
28. januar 2006 - 10:07 #2
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");

SqlCommand selectCMD = new SqlCommand("SELECT CustomerID, CompanyName FROM Customers", nwindConn);
selectCMD.CommandTimeout = 30;

SqlDataAdapter custDA = new SqlDataAdapter();
custDA.SelectCommand = selectCMD;

nwindConn.Open();

DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");

nwindConn.Close();

Det her er et eksempel fra msdn
Avatar billede ladyhawke Novice
28. januar 2006 - 14:34 #3
Hvis du kan bruge ovenstående
Avatar billede snepnet Nybegynder
28. januar 2006 - 16:27 #4
hej brian,

spg
start
slut

er null.

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.

jeg vil anbefale dig at gå efter 1.

mvh
Avatar billede brian-johansen Nybegynder
29. januar 2006 - 09:52 #5
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

mvh Brian
Avatar billede snepnet Nybegynder
29. januar 2006 - 11:14 #6
var så lidt :o)
mvh
Avatar billede brian-johansen Nybegynder
29. januar 2006 - 11:37 #7
Hej,

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. ?

Hvordan gør jeg det nemmest ?

mvh Brian
Avatar billede snepnet Nybegynder
29. januar 2006 - 11:57 #8
hej brian :o)

det kommer du nok til at forklare nærmere..... normal brug af en repeater vil være noget i denne stil:

<asp:Repeater ID="repeater" runat="server">
<HeaderTemplate>
    Navn<br />
</HeaderTemplate>
<ItemTemplate>
    <asp:TextBox ID="txtName" runat="server" Text='<%# Eval("Name") %>'></asp:TextBox>
    <br />
</ItemTemplate>
</asp:Repeater>

og lidt kode - noget i denne stil:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindRepeater();
    }
}

private void BindRepeater()
{
    PersonList personer = new PersonAccess().GetAllPersons();
    repeater.DataSource = personer;
    repeater.DataBind();
}

jeg formodede at den tekstboks jeg har i min itemtemplate med id'et txtName, modsvarer  f.eks. din spg.

hvis det du sidder med afviger fra ovenstående model må du lige give mig en hånd med at forstå det - så skal du få et nyt bud :o)

mvh
Avatar billede brian-johansen Nybegynder
29. januar 2006 - 14:56 #9
Hvad er ideen med:
private void BindRepeater()
{
    PersonList personer = new PersonAccess().GetAllPersons();
    repeater.DataSource = personer;
    repeater.DataBind();
}
??
Avatar billede brian-johansen Nybegynder
29. januar 2006 - 14:59 #10
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.

Håber det var svar nok :D

mvh Brian
Avatar billede snepnet Nybegynder
29. januar 2006 - 15:31 #11
idéen med

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.

mvh
Avatar billede brian-johansen Nybegynder
29. januar 2006 - 16:42 #12
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
Avatar billede snepnet Nybegynder
02. februar 2006 - 23:53 #13
mmm... har du mulighed for at lægge et billede et eller andet sted - så jeg kan se hvordan det skal se ud?
mvh
Avatar billede brian-johansen Nybegynder
06. februar 2006 - 11:17 #14
Hej, Jeg prøver lige i aften

mvh Brian
Avatar billede brian-johansen Nybegynder
06. februar 2006 - 11:18 #15
Ladyhawke --> Desvære jeg tror ikke det er der problemet ligger. Men tak for din kommentar!

mvh Brian
Avatar billede brian-johansen Nybegynder
06. februar 2006 - 18:40 #16
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.

Spørg endelig hvis det ikke giver mening.

mvh Brian
Avatar billede snepnet Nybegynder
07. februar 2006 - 09:16 #17
den ser helt fin ud, men er det ikke meningen at hele den blok du har tegnet skal gentage sig, så du kan se flere afstemninger?
mvh
Avatar billede brian-johansen Nybegynder
07. februar 2006 - 10:00 #18
Jo, det er menigen der skal komme alle de afstemninger ned af der er aktive.

mvh Brian
Avatar billede snepnet Nybegynder
07. februar 2006 - 10:19 #19
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
Avatar billede brian-johansen Nybegynder
07. februar 2006 - 10:30 #20
jep lige præcis... men hvordan ?
Jeg forstår ikke hvordan jeg skal gøre det.

mvh
Avatar billede snepnet Nybegynder
07. februar 2006 - 16:54 #21
ahh... det er ikke så slemt:

// 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).

mvh
Avatar billede brian-johansen Nybegynder
07. februar 2006 - 17:38 #22
Hej, :D

Jeg prøver lige at kigge på det når jeg kommer hjem i aften.

igen mange tak for hjælpen.

mvh
Avatar billede brian-johansen Nybegynder
11. februar 2006 - 18:05 #23
Hej,

Jeg har først fået kigget på det nu her, hvordan skal jeg i den sidste metode returnere en Tabel ?, skal jeg gøre det med et dataset ? eller hvordan

mvh
Avatar billede brian-johansen Nybegynder
11. februar 2006 - 18:17 #24
OK tror jeg fandt ud af det :D

men jeg bliver ved med at få en fejl der hedder :
Object reference not set to an instance of an object omkring

int pollQueId = (int)row["PollQId"];

mvh
Avatar billede brian-johansen Nybegynder
11. februar 2006 - 18:38 #25
Hey, jeg har skrevet det her nu, men jeg får stadig samme fejl som for oven, hvor kan programmet se hvad der skal fyldes i (int)row["PollQId"];?


private void Page_Load(object sender, System.EventArgs e)
        {
            if(!IsPostBack)
            {
                bindOuter();
            }

          }
        public void bindOuter()
        {
            string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN+=Server.MapPath("data\\vote.mdb");
            OleDbConnection myConn = new OleDbConnection(strDSN);
            string sql ="select * from PollQ where aktiv = true";
            OleDbDataAdapter adp = new OleDbDataAdapter(sql,myConn);
            myConn.Open();
           
            DataSet ds = new DataSet();
            adp.Fill(ds,"PollQ");
       
            outerRepeater.DataSource = ds;
            outerRepeater.DataBind();
            myConn.Close();
       
        }

        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
       
            InitializeComponent();
            base.OnInit(e);
        }
       
       
        private void InitializeComponent()
        {   
            this.outerRepeater.ItemDataBound += new System.Web.UI.WebControls.RepeaterItemEventHandler(this.outerRepeater_ItemDataBound);
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        private void outerRepeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
        {
            DataRowView row = e.Item.DataItem as DataRowView; //DataSourceView;
            int pollQueId = (int)row["PollId"];
            Repeater innerRepeater = e.Item.FindControl("InnerRepeater") as Repeater;
            innerRepeater.DataSource = GetOptions(pollQueId);
            innerRepeater.DataBind();

        }
        protected DataTable GetOptions(int pollQueId)
        {
            string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN+=Server.MapPath("data\\vote.mdb");
            string sql ="Select * From PollAnswer where PollId = pollQueId";
            OleDbConnection myConn = new OleDbConnection(strDSN);
            OleDbDataAdapter adapt = new OleDbDataAdapter(sql,myConn);
            DataTable dt = new DataTable();
            adapt.Fill(dt);
            return dt;
        }


mvh
Avatar billede snepnet Nybegynder
18. februar 2006 - 01:45 #26
hej igen - og undskyld ventetiden :o(
har du checket om dit row er null?
(brug debuggeren)
mvh
Avatar billede brian-johansen Nybegynder
18. februar 2006 - 23:54 #27
hej, det gør ikke noget :D

Ja jeg tror det er fordi min row er null

jeg har prøvet at lave en if else sætning men det bliver ved med at skrive det ??

kan jeg have overset noget ?

Mvh Brian
Avatar billede snepnet Nybegynder
25. februar 2006 - 12:43 #28
og igen undskyld ventetiden - ikke noget net :o(

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å?

mvh
Avatar billede brian-johansen Nybegynder
27. februar 2006 - 12:38 #29
Hej,
Jeg tror jeg fandt en anden løsning,

men smider du lige et svar?

mvh Brian
Avatar billede snepnet Nybegynder
27. februar 2006 - 15:10 #30
ok - sig til hvis der skulle være noget omkring det.
mvh
Avatar billede brian-johansen Nybegynder
27. februar 2006 - 15:12 #31
Det skal jeg nok, igen tak for hjælpen

mvh Brian
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester