Avatar billede brian-johansen Nybegynder
15. januar 2006 - 13:48 Der er 69 kommentarer og
1 løsning

Datalist spg. c#

Hej,

Jeg har fået et problem med denne sætning det eneste den skal gøre er at fylde et dataset og bruge den som data kilde, men jeg får en en fejl hver eneste gang jeg prøver at køre den.

Jeg har tjekket sql statements efter og der er der ikke noget galt.

Jeg har brugt flg. kode

string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
strDSN+=Server.MapPath("data\\vote.mdb");
myConn = new OleDbConnection(strDSN);

//Denne holder indholdet
try
{
string query = "Select * From PollQ";
myData =  new OleDbDataAdapter(query,myConn);
ds = new DataSet();
myData.Fill(ds,"PollQ");
DataList1.DataSource = ds;
DataList1.DataBind();
}

og jeg får flg. fejl

System.NullReferenceException: Object reference not set to an instance of an object. at afstemning.afstemning.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\afstemning\afstemning.ascx.cs:line 44

Er der nogen der kan se hvad der er galt????

mvh Brian
Avatar billede snepnet Nybegynder
15. januar 2006 - 13:51 #1
hvad står der på linie 44?
mvh
Avatar billede snepnet Nybegynder
15. januar 2006 - 13:56 #2
altså afstemning.ascx.cs:line 44 ... den ville være interessant at se.
mvh
Avatar billede brian-johansen Nybegynder
15. januar 2006 - 14:00 #3
Der står:

myData.Fill(ds,"PollQ");
DataList1.DataSource = ds;  // <-- linie 44
DataList1.DataBind();


mvh
Avatar billede snepnet Nybegynder
15. januar 2006 - 14:01 #4
så har du nok ikke nogen datalist på din form med det id (id="DataList1")
mvh
Avatar billede snepnet Nybegynder
15. januar 2006 - 14:01 #5
bruger du version 1.X eller 2.0?
mvh
Avatar billede brian-johansen Nybegynder
15. januar 2006 - 14:04 #6
Jeg bruger 1.1

Jeg ville bare prøve at lave en usercontrol.

I min usercontrol skulle der gerne være en DataList1

Hvis jeg skriver et punktum efter for jeg i hvertfald adgang til alle de metoder der ligger i den:

Hele ascx filen ser sådan ud:

public class afstemning : System.Web.UI.UserControl
    {
        public DataList DataList2;
       
        OleDbConnection myConn;
        OleDbCommand myQ;
        OleDbDataAdapter myData;
        OleDbCommand myspg;
        DataSet ds;
        protected System.Web.UI.WebControls.Repeater Repeater1;
        protected System.Web.UI.WebControls.DataList DataList1;
        protected System.Web.UI.WebControls.Repeater Repeater2;
        protected System.Web.UI.WebControls.RadioButtonList RadioButtonList1;
        public Repeater PollAnswer;

        private void Page_Load(object sender, System.EventArgs e)
        {

            string date = DateTime.Now.Date.ToLongDateString();
            string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN+=Server.MapPath("data\\vote.mdb");
            myConn = new OleDbConnection(strDSN);
           
            //Denne holder indholdet
            try
            {
                string query = "Select * From PollQ";
                myData =  new OleDbDataAdapter(query,myConn);
                ds = new DataSet();
                myData.Fill(ds,"PollQ");
                DataList1.DataSource = ds;
                DataList1.DataBind();
            }
            catch (Exception E)
            {
                Response.Write(E.ToString());
            }
            //
       
            // Denne holder alle spørgsmål
//            myQ = new OleDbCommand("Select * From PollQ",myConn);
//            myConn.Open();
//            Repeater1.DataSource = myQ.ExecuteReader(CommandBehavior.CloseConnection);
//            Repeater1.DataBind();
           




mvh
Avatar billede snepnet Nybegynder
15. januar 2006 - 14:05 #7
så har du nok ikke nogen datalist på din USERCONTROL (ikke form) med det id (id="DataList1")
mvh
Avatar billede brian-johansen Nybegynder
15. januar 2006 - 14:05 #8
men jeg skal vel ikke skrive noget på den webfom jeg skal bruge den på andet end det kode man skal bruge for at indsætte den ??

mvh
Avatar billede snepnet Nybegynder
15. januar 2006 - 14:06 #9
du skal vise mig din ascx-fil .... ikke cs-filen.
mvh
Avatar billede snepnet Nybegynder
15. januar 2006 - 14:07 #10
jeg går udfra at du har fået det her indskrevet i cs-filen
        protected System.Web.UI.WebControls.Repeater Repeater1;
        protected System.Web.UI.WebControls.DataList DataList1;
        protected System.Web.UI.WebControls.Repeater Repeater2;
        protected System.Web.UI.WebControls.RadioButtonList RadioButtonList1;
ved at trække kontrollerne ind i designeren.

det genererer dig noget kode i ascx-filen .... og det er i den fil du skal have en datalist med id'et DataList1.

mvh
Avatar billede brian-johansen Nybegynder
15. januar 2006 - 14:10 #11
#1 Ja det har jeg.

#2 OK jeg har lige vedlagt det andet kode:

<%@ Control Language="c#" AutoEventWireup="false" Codebehind="afstemning.ascx.cs" Inherits="afstemning.afstemning" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
<P>
    <asp:Repeater id="Repeater1" runat="server">
        <ItemTemplate>
            <asp:DataList id="DataList1" runat="server">
                <HeaderTemplate>
                    <table>
                        <tr>
                            <td>Spørgsmål:<%# DataBinder.Eval(Container.DataItem,"PollQ") %></td>
                            <td>Start:<%# DataBinder.Eval(Container.DataItem,"start") %></td>
                            <td>Slutter:<%# DataBinder.Eval(Container.DataItem,"slut") %></td>
                        </tr>
                    </table>
                </HeaderTemplate>
                <ItemTemplate>
                    <asp:Repeater id="Repeater2" runat="server">
                        <ItemTemplate>
                            <table>
                                <tr>
                                    <td>
                                        <asp:RadioButtonList id="RadioButtonList1" runat="server"></asp:RadioButtonList>
                                    </td>
                                    <td>
                                        <%# DataBinder.Eval(Container.DataItem,"PollAnswer") %>
                                    </td>
                                </tr>
                            </table>
                        </ItemTemplate>
                    </asp:Repeater>
                </ItemTemplate>
            </asp:DataList>
        </ItemTemplate>
    </asp:Repeater>
</P>
Avatar billede snepnet Nybegynder
15. januar 2006 - 14:11 #12
du har også en DataList2 i koden... så er det ikke noget med at du har haft 2 lister på siden på et tidspunkt, og så efterfølgende har slettet den ene?
(eller noget i den stil)
det er sikkert bare din DataList2 du har.... prøv at brug den istedet.
mvh
Avatar billede snepnet Nybegynder
15. januar 2006 - 14:11 #13
hov ... der krydsede vi lige hinanden.... sorry.
jeg kigger på det du har sendt
mvh
Avatar billede brian-johansen Nybegynder
15. januar 2006 - 14:12 #14
ok
Avatar billede snepnet Nybegynder
15. januar 2006 - 14:15 #15
du har sat din datalist ind i en repeater... så kan du ikke bare få fat i den på den måde.

repeateren kan jo lave rigtig mange items, så hvilken en af de datalister der er i repeateren skulle så være refereret ved DataList1?

jeg kan ikke se at du overhovedet bruger din repeater i koden .... så skal den ikke bare slettes?

ellers skal du bruge noget data du kan stikke til repeateren, og i forbindelse med at hvert item i repeateren databindes kan du så databinde den datalist der ligger i det aktuelle repeateritem.

mvh
Avatar billede snepnet Nybegynder
15. januar 2006 - 14:17 #16
(ellers kan du lige fortælle hvad det du laver skal ende med at kunne)
mvh
Avatar billede brian-johansen Nybegynder
15. januar 2006 - 14:18 #17
Jamen ideen var at det skulle være noget afstemnings system, hvor at den første repeater, var hvor alle afstemningerne kom ind, og så skulle datalisten / datalisterne indeholde info om spørgsmålet, og så skulle der så til sidst var en repeater inde i datalisten til at holde valg mulighederne ??

Jeg ved ikke helt om det er måden at gøre det på har du evt en bedre måde ??
Avatar billede snepnet Nybegynder
15. januar 2006 - 14:26 #18
du kan sagtens gøre sådan noget... det er ikke noget problem.

du skal starte med at databinde den yderste liste (din repeater), og du abbonnerer så på det event der hedder ItemDataBound (du kan gøre det i designeren - i property vinduet er der et lille lyn øverst. hvis du klikker på det kan du se de events du vil abbonnere på... så dobbeltklikker du bare på ItemDataBound - hvilket giver dig en eventhandler i koden):

protected void repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
  if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  {
    // her kan du så få fat i din indre datalist sådan her
    DataList dl = e.Item.FindControl("DataList1") as DataList;
    dl.DataSource = GetInnerListData();
    dl.DataBind();
  }
}

du databinder så bare din repeater i page_load, men sørg for at kun at gøre det når det er nødvendigt:

if(!IsPostBack)
{
  // her databinder du så repeateren
}

mvh
Avatar billede brian-johansen Nybegynder
15. januar 2006 - 14:34 #19
Okay -  Hvad skal så skriver der hvor der står: GetInnerListData?

mvh
Avatar billede snepnet Nybegynder
15. januar 2006 - 14:56 #20
hensigten var, at du laver en metode der sørger for at hente data til innerlisten... metoden returnerer så det dataset du laver.
mvh
Avatar billede brian-johansen Nybegynder
15. januar 2006 - 15:11 #21
når ok på den måde :D

Det prøver jeg lige
Avatar billede snepnet Nybegynder
15. januar 2006 - 15:12 #22
bare spørgs løs, hvis det driller.
mvh
Avatar billede brian-johansen Nybegynder
15. januar 2006 - 15:24 #23
Humm.... nu får jeg en fejl der hedder:

Invalid attempt to Read when reader is closed.

og den kommer her:

Line 42:                 myConn.Open();
Line 43:                 Repeater1.DataSource = myQ.ExecuteReader(CommandBehavior.CloseConnection);
Line 44:                 Repeater1.DataBind();


Men det skal da åbne den automatisk ?? eller hvad ??
Avatar billede brian-johansen Nybegynder
15. januar 2006 - 15:26 #24
ok tak :D
Avatar billede brian-johansen Nybegynder
15. januar 2006 - 15:43 #25
Har skrevet dette kode til den :


        private void Repeater1_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
        {
            if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                // her kan du så få fat i din indre datalist sådan her
                DataList dl = e.Item.FindControl("DataList1") as DataList;
                dl.DataSource = GetInnerListData();
                dl.DataBind();

            }

        }
        public DataSet GetInnerListData()
        {
            string query = "Select * From PollQ";
            myData =  new OleDbDataAdapter(query,myConn1);
       
        //    myConn.Open();
            ds = new DataSet();
            myData.Fill(ds,"PollQ");
            myConn.Close();

            return ds;
       
        }
Avatar billede snepnet Nybegynder
15. januar 2006 - 15:52 #26
fungerer det så?
mvh
Avatar billede brian-johansen Nybegynder
16. januar 2006 - 11:15 #27
Humm min internet forbindelse er røg igår der hjemme :( så jeg kunne ikke svare før nu, men jeg bliver ved med at få en fejl der hedder

Invalid attempt to Read when reader is closed.

Jeg fatter ikke helt hvorfor

mvh
Avatar billede snepnet Nybegynder
16. januar 2006 - 17:41 #28
så er det formentlig fordi du tidligere har benyttet myConn1 til noget andet vil jeg tro.
kan du ikke poste hele koden?
mvh
Avatar billede brian-johansen Nybegynder
16. januar 2006 - 19:47 #29
jo selvfølgelig:

Her er afstemning.ascx

<%@ Control Language="c#" AutoEventWireup="false" Codebehind="afstemning.ascx.cs" Inherits="afstemning.afstemning" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
<P>
    <asp:Repeater id="Repeater1" runat="server">
        <ItemTemplate>
            <asp:DataList id="DataList1" runat="server">
                <HeaderTemplate>
                    <table>
                        <tr>
                            <td>Spørgsmål:<%# DataBinder.Eval(Container.DataItem,"PollQ") %></td>
                            <td>Start:<%# DataBinder.Eval(Container.DataItem,"start") %></td>
                            <td>Slutter:<%# DataBinder.Eval(Container.DataItem,"slut") %></td>
                        </tr>
                    </table>
                </HeaderTemplate>
                <ItemTemplate>
                    <asp:Repeater id="Repeater2" runat="server">
                        <ItemTemplate>
                            <table>
                                <tr>
                                    <td>
                                        <asp:RadioButtonList id="RadioButtonList1" runat="server"></asp:RadioButtonList>
                                    </td>
                                    <td>
                                        <%# DataBinder.Eval(Container.DataItem,"PollAnswer") %>
                                    </td>
                                </tr>
                            </table>
                        </ItemTemplate>
                    </asp:Repeater>
                </ItemTemplate>
            </asp:DataList>
        </ItemTemplate>
    </asp:Repeater>
</P>



og afstemning.cs

namespace afstemning
{
    using System;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.OleDb;
    using System.Collections;

    /// <summary>
    ///        Summary description for afstemning.
    /// </summary>
    public class afstemning : System.Web.UI.UserControl
    {
           
        OleDbConnection myConn;
        OleDbConnection myConn1;
        OleDbCommand myQ;
        OleDbDataAdapter myData;
        OleDbCommand myspg;
        DataSet ds;
        protected System.Web.UI.WebControls.Repeater Repeater1;
        protected System.Web.UI.WebControls.DataList DataList1;
        protected System.Web.UI.WebControls.Repeater Repeater2;
        protected System.Web.UI.WebControls.RadioButtonList RadioButtonList1;
       

        private void Page_Load(object sender, System.EventArgs e)
        {

            string date = DateTime.Now.Date.ToLongDateString();
            string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN+=Server.MapPath("data\\vote.mdb");
            myConn = new OleDbConnection(strDSN);
            myConn1 = new OleDbConnection(strDSN);
            if(!IsPostBack)
            {
                // her databinder du så repeateren
                myQ = new OleDbCommand("Select * From PollQ",myConn);
                myConn.Open();
                Repeater1.DataSource = myQ.ExecuteReader(CommandBehavior.CloseConnection);
                Repeater1.DataBind();
               
           
            }

                           
    }

        #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);
        }
       
        /// <summary>
        ///        Required method for Designer support - do not modify
        ///        the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.Repeater1.ItemDataBound += new System.Web.UI.WebControls.RepeaterItemEventHandler(this.Repeater1_ItemDataBound);
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        private void Repeater1_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
        {
            if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                // her kan du så få fat i din indre datalist sådan her
                DataList dl = e.Item.FindControl("DataList1") as DataList;
                dl.DataSource = GetInnerListData();
                dl.DataBind();

            }

        }
        public DataSet GetInnerListData()
        {
            string query = "Select * From PollQ";
            myData =  new OleDbDataAdapter(query,myConn1);
       
        //    myConn.Open();
            ds = new DataSet();
            myData.Fill(ds,"PollQ");
            myConn.Close();

            return ds;
       
        }
    }
}
mvh
Avatar billede snepnet Nybegynder
16. januar 2006 - 20:34 #30
i page_load arbejder du med samme forbindelse (som du efterfølgende lukker) - så derfor får du fejlen når du prøver at fylde med adapteren.
mvh
Avatar billede brian-johansen Nybegynder
16. januar 2006 - 20:38 #31
Jeg får stadig en fejl selvom jeg kun skriver  myQ.ExecuteReader(); ???

mvh Brian
Avatar billede snepnet Nybegynder
16. januar 2006 - 20:51 #32
ja - det er nogle lidt specielle forhold der gør sig gældende der i forbindelse med databinding (det lukker forbindelsen), men hensigten var egentlig heller ikke at du skulle fortsætte med at benytte den.

prøv - til at starte med at lav dine kald mod databasen på følgende form:

// en klassevariabel (til en start)
private const string ConnectionString = "...";

// og en metode til at hente data
DataSet GetData()
{
  DataSet data = new DataSet();
  using(OleDbConnection conn = new OleDbConnection(ConnectionString))
  {
    using(OleDbCommand command = new OleDbCommand("select blah blah...", conn))
    {
      using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
      {
        adapter.Fill(data);
      }
    }
  }
  return data;
}

det gør ikke noget at du opretter forbindelser i koden - connectionpooling er implicit sålænge du benytter exact samme connectionstring... så frameworket genbruger dine forbindelser.

og.... så er jeg stadig lidt i tvivl om hvad det præcist er du vil... du henter de samme data til både din ydre repeater, og din indre datalist - hvilket medfører at det som udgangpunkt er lidt fjollet at hente det to gange.
er det ikke to forskellige sæt af data du vil have fat i?

mvh
Avatar billede brian-johansen Nybegynder
16. januar 2006 - 20:58 #33
Jamen ideen var at det skulle være noget afstemnings system

Den første repeater, var hvor alle afstemningerne kom ind
Den første datalisten / datalisterne indeholde info om spørgsmålet
nr. 2 repeater skal være inde i datalisten til at holde valg mulighederne ??

Grunden til at det umiddelbart ser ud til at være det samme den skal hente ind er det kun skulle være til test, senere skal den ydere repeater kun hente spøgsmål der er inde for en hvis dato.


Jeg håber det var svar nok :D, jeg har lidt svært ved at forklare det.

mvh Brian
Avatar billede brian-johansen Nybegynder
16. januar 2006 - 21:09 #34
humm..... jeg prøver lige at rode noget mere med det, MANGE tak for hjælpen

mvh Brian
Avatar billede brian-johansen Nybegynder
20. januar 2006 - 22:32 #35
Hej igen,

Jeg tror jeg har lavet lidt af en "tanke torsk" :D Jeg ved ikke lige helt hvad jeg havde tænkt på for det hele kan vel laves med en enkel repeater....

Jeg har skrevet koden lidt om. men jeg bliver ved med at få en fejl der hedder System.NullReferenceException: Object reference not set to an instance of an object.

Den kommer når jeg bruger den metode der hedder bindSpg(); Men jeg forstår ikke helt hvorfor jeg har dobbelt tjekket min sql streng... kan du evt se hvad der er galt koden er her:

public class WebForm1 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Repeater Repeater1;
        protected System.Web.UI.WebControls.RadioButtonList valg;
        protected System.Web.UI.HtmlControls.HtmlForm Form1;
        OleDbConnection myConn;
        OleDbDataAdapter adp;
        OleDbCommand cmd;
        private void Page_Load(object sender, System.EventArgs e)
        {
            string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN+=Server.MapPath("data\\vote.mdb");
            bindOver(strDSN);
            bindSpg(strDSN);
           
        }

        #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);
        }
       
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        public void bindOver(string strDSN)
        {
            myConn = new OleDbConnection(strDSN);
            string query = "Select * From PollQ where PollId = 14";
            cmd = new OleDbCommand(query, myConn);
            myConn.Open();
            Repeater1.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            Repeater1.DataBind();       
        }
        public void bindSpg(string strDSN)
        {
            try
            {
                DataSet ds = new DataSet();
                myConn = new OleDbConnection(strDSN);
                string spg ="Select * From PollAnswer where PollId = 14";
                adp = new OleDbDataAdapter(spg, myConn);
                myConn.Open();
                adp.Fill(ds, "PollAnswer");
                valg.DataSource = ds;
                valg.DataBind();
                myConn.Close();
            }
            catch (Exception E)
            {Response.Write(E);}
        }
    }



Det kan muligvis godt være at det er der hvor jeg opretter min radiobuttonlist
den ser sådan ud:

<asp:Repeater id="Repeater1" runat="server">
                                <HeaderTemplate>
                                    <table>
                                        <tr>
                                            <td>Spørgsmål:
                                                <%# DataBinder.Eval(Container.DataItem,"PollQ") %>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td>Start:
                                                <%# DataBinder.Eval(Container.DataItem,"start") %>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td>Slut:
                                                <%# DataBinder.Eval(Container.DataItem,"slut") %>
                                            </td>
                                        </tr>
                                    </table>
                                </HeaderTemplate>
                                <ItemTemplate>
                                    <asp:RadioButtonList id="valg" runat="server" Visible="true" DataValueField="PollAnswer" DataTextField="Valg muligheder" />
                                </ItemTemplate>
                            </asp:Repeater></P>

mvh
Avatar billede snepnet Nybegynder
20. januar 2006 - 23:16 #36
det er samme problematik som den vi havde tidligere ... du går til din radiobuttonlist via en deklerarion på klassen:
protected System.Web.UI.WebControls.RadioButtonList valg;
men du skal få hvert item i din repeater have fat i den aktulle liste i det item (den med FindControl("valg")
mvh
Avatar billede brian-johansen Nybegynder
20. januar 2006 - 23:20 #37
okay.... du har ikke tutorial liggende omkring det vel ? jeg tror ikke helt jeg kan gennemskue hvordan jeg skal skrive det ?

mvh Brian
Avatar billede snepnet Nybegynder
20. januar 2006 - 23:49 #38
en tutorial til hvad helt præcist? ... du har selv skrevet koden til den slags højere oppe?

altså du har en liste A - og for hvert element i listen, vil du gerne vise en anden liste B - der er afhænig af det aktuelle element i A.

såhh... strategien med at give A en mængde data, og udføre databinding er fin.

det er der så mangler er, at du for hver gang et element i A bliver databundet, skal have fat i en kontrol (din radiobuttonlist) i det element, og stikke det noget data, og udføre databinding på det.

det er den kode jeg har skrevet
15/01-2006 14:26:26

og som du selv har lavet noget lignende af her:
15/01-2006 15:43:10
(hvis vi ser bort fra ballade med forbindelserne).

kan du ikke være lidt mere præcis omkring hvad det er du har problemer med at gennemskue?

mvh
Avatar billede brian-johansen Nybegynder
20. januar 2006 - 23:58 #39
jamen jeg problemet er jeg ved ikke helt hvordan jeg skal tilføje dataerne til min radiobutton list, og gøre det på den måde som du gjorde det 15/01-2006 14:26:26.
Det er jo ændret sådan at jeg kun har kun bruger en repeater nu.



mvh
.
Avatar billede snepnet Nybegynder
21. januar 2006 - 00:15 #40
du benytter stadig to listekontroller .... om der er den ene eller anden slags liste gør ikke nogen forskel i den forbindelse.

// i page_load
if(!IsPostBack)
{
  Repeater1.DataBind();
}

private void Repeater1_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
    if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        // her kan du så få fat i din indre liste sådan her
        RadioButtonList radioButtons = e.Item.FindControl("valg") as RadioButtonList;
        if(radioButtons != null)
        {
          // få fat i datagrundlaget for det aktuelle item
          DataRowView row = e.Item.DataItem as DataRowView;

          // hent det id du skal bruge;
          int pollId = (int)row["pollId"];
         
          // og brug det til at finde de indre data du skal bruge.
          radioButtons.DataSource = GetInnerListData(int poollId);
          radioButtons.DataBind();
        }
    }
}

public DataSet GetInnerListData(int pollId)
{
  // her henter du så dine data - baseret på det poolid du får... og returnerer dem
}

er det til at gennemskue - eller er det stadig lidt tåget?

mvh
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 00:23 #41
måske lidt.... kan jeg bruge min bindSpg() i stedet for GetInnerListData ? eller hvordan

mvh
Avatar billede snepnet Nybegynder
21. januar 2006 - 00:28 #42
ja hvis du returnerer dit dataset istedet, og sørger for at have det id du skal udvælge på som parameter, som du så bruger i dit selectstatement.
mvh
(mht. til den måde at bygge statements op - så er det af flere  årsager ikke særlig hensigtsmæssigt... du bør benytte parametre istedet, men det kan vi tage når du har fået det til at funge)
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 00:30 #43
ok mange tak :D
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 00:35 #44
Jeg ved ikke helt hvorfor men jeg får en fejl i GetInnerListData(int poollId);

hvor den skriver jeg må bruge int ? hvorfor kan jeg ikke det ?
Avatar billede snepnet Nybegynder
21. januar 2006 - 00:46 #45
kan du ikke skrive selve fejlen du får, og så lægge koden som den ser ud når du får fejlen herud?
mvh
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 00:52 #46
Invalid expression term 'int'

og jeg får den her:

                    // hent det id du skal bruge;
                    int pollId = (int)row["pollId"];
               
                    // og brug det til at finde de indre data du skal bruge.
                Her -->    radioButtons.DataSource = GetData(int pollId);
                    radioButtons.DataBind();
                }
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 00:58 #47
Nu har jeg skrevet sådan her:

private void Repeater1_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
        {
            if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                // her kan du så få fat i din indre liste sådan her
                RadioButtonList radioButtons = e.Item.FindControl("valg") as RadioButtonList;
                if(radioButtons != null)
                {
                    // få fat i datagrundlaget for det aktuelle item
                    DataRowView row = e.Item.DataItem as DataRowView;
               
                    // hent det id du skal bruge;
                    int pollId = (int)row["pollId"];
               
                    // og brug det til at finde de indre data du skal bruge.
                    radioButtons.DataSource = GetInnerListData(int pollId);
                    radioButtons.DataBind();
                }
            }
            }
            public DataSet GetInnerListData(int pollId)
            {
                // her henter du så dine data - baseret på det poolid du får... og returnerer dem
                string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
                strDSN+=Server.MapPath("data\\vote.mdb");
                DataSet ds = new DataSet();
                myConn = new OleDbConnection(strDSN);
                string spg ="Select PollId,PollAnswer From PollAnswer where PollId ="+ pollId;
                adp = new OleDbDataAdapter(spg, myConn);
                myConn.Open();
                adp.Fill(ds, "PollAnswer");
                valg.DataSource = ds;
                valg.DataBind();
                myConn.Close();
               
                return ds;
            }

men det virker ikke, den compialer den fint nok, men der kommer ikke noget data frem på skærmen ??

mvh Brian
Avatar billede snepnet Nybegynder
21. januar 2006 - 01:01 #48
det er en fejl der stammer fra det jeg skrev herude...
linien
radioButtons.DataSource = GetInnerListData(int pollId);
skal ændres til
radioButtons.DataSource = GetInnerListData(pollId);
mvh
Avatar billede snepnet Nybegynder
21. januar 2006 - 01:04 #49
(desuden skal du enten programmatisk eller deklarativt nok angive hvad der skal være DataTextField, og DataValueFiel på din radiobuttonlist).
mvh
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 01:09 #50
Jep det har jeg gjort :D Men jeg får stadig hverken noget fra den ene eller anden tabel, eller rettere sagt, jeg får ikke noget ind i <headertemp.> omkring overskrift... og jeg får heller ikke noget ind i <itemtemp.> i radiolisten

kan du se hvad jeg gør galt ?
mvh
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 01:12 #51
Når man kigger i kilde når side er loadet og der står overhovedet ikke noget om min repeater ? er det godt ? :S

mvh Brian
Avatar billede snepnet Nybegynder
21. januar 2006 - 01:15 #52
der er ikke noget i den resulterende html-kode der hedder en repeater... html er html, men id's mv. vil der være noget genkendelse ved.

jeg skal se hele din kode, hvis jeg skal kunne komme med et bud... både aspx-filen og din codebehind.

mvh
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 01:17 #53
OK !
ASPX:
<%@ Register TagPrefix="uc1" TagName="afstemning" Src="afstemning.ascx" %>
<%@ Page language="c#" Codebehind="vote.aspx.cs" AutoEventWireup="false" Inherits="afstemning.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>WebForm1</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
        <form id="Form1" method="post" runat="server">
            <table width="650">
                <tr>
                    <td>
                        <P>Overskrift</P>
                        <P>&nbsp;</P>
                    </td>
                </tr>
            </table>
            <table width="650">
                <TR>
                    <td width="100">
                        <P>Menu</P>
                        <P><a href="profil.aspx">Din Profil</a></P>
                        <P><a href="seach.aspx">Søg</a></P>
                        <P>???</P>
                        <P>???</P>
                        <p><a href="poll.aspx">Afstemning</a></p>
                    </td>
                    <td width="550">
                        <P>
                            <asp:Repeater id="Repeater1" runat="server">
                                <HeaderTemplate>
                                    <table>
                                        <tr>
                                            <td>Spørgsmål:
                                                <%#DataBinder.Eval(Container.DataItem, "PollQ") %>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td>Start:
                                                <%# DataBinder.Eval(Container.DataItem,"start") %>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td>Slut:
                                                <%# DataBinder.Eval(Container.DataItem,"slut") %>
                                            </td>
                                        </tr>
                                    </table>
                                </HeaderTemplate>
                                <ItemTemplate>
                                    <asp:RadioButtonList id="valg" runat="server" Visible="true" DataValueField="PollAnswer" DataTextField="Valg muligheder" />
                                </ItemTemplate>
                            </asp:Repeater></P>
                    </td>
                </TR>
            </table>
        </form>
    </body>
</HTML>


Codebehind:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;

namespace afstemning
{
    /// <summary>
    /// Summary description for WebForm1.
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Repeater Repeater1;
        protected System.Web.UI.WebControls.RadioButtonList valg;
        protected System.Web.UI.HtmlControls.HtmlForm Form1;
        OleDbConnection myConn;
        OleDbDataAdapter adp;
        OleDbCommand cmd;
        private void Page_Load(object sender, System.EventArgs e)
        {
            string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN+=Server.MapPath("data\\vote.mdb");
            //    bindSpg(strDSN);
            //    bindOver(strDSN);
           
       
            if(!IsPostBack)
            {
                Repeater1.DataBind();
            }

        }
       
        #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);
        }
       
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {   
            this.Repeater1.ItemDataBound += new System.Web.UI.WebControls.RepeaterItemEventHandler(this.Repeater1_ItemDataBound);
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        public void bindOver(string strDSN)
        {
            myConn = new OleDbConnection(strDSN);
            string query = "Select * From PollQ where PollId = 14";
            cmd = new OleDbCommand(query, myConn);
            myConn.Open();
            Repeater1.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            Repeater1.DataBind();       
        }

        public void bindSpg()
        {
            try
            {
                string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
                strDSN+=Server.MapPath("data\\vote.mdb");
                DataSet ds = new DataSet();
                myConn = new OleDbConnection(strDSN);
                string spg ="Select PollId,PollAnswer From PollAnswer where PollId = 14";
                adp = new OleDbDataAdapter(spg, myConn);
                myConn.Open();
                adp.Fill(ds, "PollAnswer");
                valg.DataSource = ds;
                valg.DataBind();
                myConn.Close();
               
               
            }
            catch (Exception E)
            {Response.Write(E);}
        }

        private void Repeater1_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
        {
            if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                // her kan du så få fat i din indre liste sådan her
                RadioButtonList radioButtons = e.Item.FindControl("valg") as RadioButtonList;
                if(radioButtons != null)
                {
                    // få fat i datagrundlaget for det aktuelle item
                    DataRowView row = e.Item.DataItem as DataRowView;
               
                    // hent det id du skal bruge;
                    int pollId = (int)row["pollId"];
               
                    // og brug det til at finde de indre data du skal bruge.
                    radioButtons.DataSource = GetInnerListData(pollId);
                    radioButtons.DataBind();
                }
            }
            }
            public DataSet GetInnerListData(int pollId)
            {
                // her henter du så dine data - baseret på det poolid du får... og returnerer dem
                string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
                strDSN+=Server.MapPath("data\\vote.mdb");
                DataSet ds = new DataSet();
                myConn = new OleDbConnection(strDSN);
                string spg ="Select PollId,PollAnswer From PollAnswer where PollId ="+ pollId;
                adp = new OleDbDataAdapter(spg, myConn);
                myConn.Open();
                adp.Fill(ds, "PollAnswer");
                myConn.Close();
               
                return ds;
            }
   
    }
}
Avatar billede snepnet Nybegynder
21. januar 2006 - 01:27 #54
du giver ikke din repeater noget data at arbejde med.
mvh
Avatar billede snepnet Nybegynder
21. januar 2006 - 01:28 #55
(du må sætte en datasource på den inden du databinder)
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 01:32 #56
Det hjalp lidt :D

Nu fik jeg en fejl i:
int pollId = (int)row["pollId"];

Object reference not set to an instance of an object.

mvh
Avatar billede snepnet Nybegynder
21. januar 2006 - 01:42 #57
må jeg se hvordan du fodrer repeateren med data?
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 01:44 #58
hvordan mener du, jeg har ikke andet kode en det jeg sendte før?
Avatar billede snepnet Nybegynder
21. januar 2006 - 01:47 #59
jeg skrev at du måtte sætte en datasource på din repeater... du skrev at det hjalp lidt, men du har ikke vist hvad du har gjort.
mvh
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 01:49 #60
når det var fordi jeg havde kommentarede bindOver(strDSN); ud. Den er under page_load

mvh Brian
Avatar billede snepnet Nybegynder
21. januar 2006 - 01:55 #61
den skal ind i din ispostback - hvis den altså stadig står udenfor.
bruger du aldrig debuggeren?
mvh
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 01:58 #62
jo... men jeg får ingen fejl meddelser og når jeg får dem i browseren, kan jeg ikke helt gennemskue dem, på det her område :(

mvh Brian
Avatar billede snepnet Nybegynder
21. januar 2006 - 02:05 #63
når du debugger ned igennem din kode kan du inspicere dine variable, dit programflow etc, og se om det forløber som det skal... idenne række:

int pollId = (int)row["pollId"];
er det row der er null .... eller er det fordi du ikke kan trække noget ud på row["pollid"]?

du må bruge debuggeren til at finde ud af hvad problemet er... eller lave asserts ell. der hvor der er ting der skal være iorden... eller programmere imod det.

// her kan du så få fat i din indre liste sådan her
RadioButtonList radioButtons = e.Item.FindControl("valg") as RadioButtonList;
if(radioButtons != null)
{
  // få fat i datagrundlaget for det aktuelle item
  DataRowView row = e.Item.DataItem as DataRowView;

  // her skal der være noget i row ... ellers knækker det næste - såhh du kan
  if(row == null)
    throw new ApplicationException("row kan not be null blah blah blah...")

  // eller måske
  Debug.Assert(row != null);

  // eller blot debugge ned igennem og se hvad der sker
             
  // hent det id du skal bruge;
  int pollId = (int)row["pollId"];
             
  // og brug det til at finde de indre data du skal bruge.
  radioButtons.DataSource = GetInnerListData(pollId);
  radioButtons.DataBind();
}

mvh
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 02:10 #64
ok - jeg prøver lige at kigge på det i morgen.... igen MANGE tak for hjælpen :D

mvh Brian
Avatar billede snepnet Nybegynder
21. januar 2006 - 02:12 #65
jeg tror det er fordi du ikke har et DataRowView som dataitem på, prøv at skift denne her:
DataRowView row = e.Item.DataItem as DataRowView;
ud med
DbDataRecord row = e.Item.DataItem as DbDataRecord;

mvh
Avatar billede snepnet Nybegynder
21. januar 2006 - 02:13 #66
du kan få adgang til DbDataRecord-typen ved at lave en
using System.Data.Common;
mvh
(jeg hopper i seng nu)
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 02:15 #67
Den kender ikke DbDataRecord... er skal jeg importere noget ?

mvh
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 02:15 #68
ok mange tak for hjælpen !!

mvh Brian
Avatar billede brian-johansen Nybegynder
21. januar 2006 - 02:19 #69
SÅ KOM RADIOBUTTON LISTEN SGU TIL AT VIRKE !!!!!!!!!!! hehe mange tak !

mvh Brian
Avatar billede snepnet Nybegynder
21. januar 2006 - 10:51 #70
var så lidt :o)
du får et svar så.
mvh
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