Avatar billede agertoft Nybegynder
26. oktober 2004 - 15:10 Der er 20 kommentarer og
1 løsning

DataList med flere Tables som sources

Jeg har en DataList, hvori jeg gerne vil have adgang til værdier fra to forskellige tabeller. Hvordan får jeg lettest adgang til disse værdier indenfor mit

<%# DataBinder.Eval(Container.DataItem, "hole_no")%>

tag?

Jeg kan jo kun sætte min Datalist´s datasource til én tabel i et datagrid...
Avatar billede snepnet Nybegynder
26. oktober 2004 - 15:14 #1
er det hver række i listen du gerne vil have sammensat af data fra flere tabeller, eller er det fordi du gerne vil have nogle værdier fra den anden tabel ind som f.eks. en liste i ét enkelt felt i listen ?
(er det en art master-detail ting, eller skal rækken bare sammensættes af indholdet fra to tabeller, med en én til én relation imellem)
mvh
Avatar billede agertoft Nybegynder
26. oktober 2004 - 15:21 #2
Ja, det er hver række i listen, jeg gerne vil have sammensat af flere forskellige tabeller. Fx har jeg en tabel, der hedder "Hole". Her vil jeg bruge to rækker fra med navnet "yellow_tee_length" og "red_tee_length". Og så har jeg en tabel med navnet "Course_Hole", hvori jeg vil bruge "hole_no". Tilsammen skal de så fx udgøre linjerne:

Hole number:    Yellow tee:    Red tee:
    1              122          145
    2              134          167
Avatar billede snepnet Nybegynder
26. oktober 2004 - 15:42 #3
ok - det kan du gøre på et par forskellige måder.
jeg er lige på vej ud af døren, men jeg sidder her igen senere...

har du et dataset i koden der indeholder de respektive tabeller - og hvis du har, er der så relationer og det hele i ?

mvh
Avatar billede agertoft Nybegynder
26. oktober 2004 - 15:46 #4
Ja, jeg har mit dataset med relationerne... Lige nu har jeg sat DataListens DataSource = oDataSet.Tables["FILTEREDcourse_holes"];

og dermed er det jo kun én tabel, den bruger. Jeg vil også gerne have fat i tabellen "FILTEREDholes", som ligger i samme dataset.
Avatar billede agertoft Nybegynder
26. oktober 2004 - 18:36 #5
anyone? snepnet? :)
Avatar billede snepnet Nybegynder
26. oktober 2004 - 19:08 #6
jeps... giv mig lige 10 minutter... så skal jeg være der.
mvh
Avatar billede snepnet Nybegynder
26. oktober 2004 - 19:12 #7
laver lige et lille eksempel (men jeg ordner også køkken, så det går nok lige 15-20 minutter)
mvh
Avatar billede agertoft Nybegynder
26. oktober 2004 - 19:16 #8
helt ok :P
Avatar billede snepnet Nybegynder
26. oktober 2004 - 19:45 #9
// sorry... der er lidt hektiskt her :o)
// du kan lige få et hurtigt eksempel her.... håber du kan læse lidt af det - ellers må du spørge
// princippet er bare at du laver en ny tabel, som du samler af de andre -  der er andre måder.

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 ExpArticles.ExpData;

namespace EXP2
{
    public class agertoft : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.DataGrid DataGrid1;
   
        private void Page_Load(object sender, System.EventArgs e)
        {
            SomeDataSet ds = new SomeDataSet();
            FillTables(ds);

            // vi samler det her i en ny tabel
            DataTable dt = new DataTable();
            dt.Columns.Add("id",typeof(int));
            dt.Columns.Add("T1_String",typeof(string));
            dt.Columns.Add("T2_String",typeof(string));
           
            foreach(DataRow dr in ds.Tables[0].Rows)
            {
                DataRow newrow = dt.NewRow();
                newrow[0] = (int)dr["id"];
                newrow[1] = dr["T1_String"].ToString();
                newrow[2] = dr.GetChildRows(SomeDataSet.RelationT1_T2)[0]["T2_String"];
                dt.Rows.Add(newrow);
            }
                       
            this.DataGrid1.DataSource = dt;
            this.DataGrid1.DataBind();
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);
        }

        private void FillTables(SomeDataSet ds)
        {
            for(int i=0;i<10;i++)
            {
                DataRow dr1 = ds.Tables[0].NewRow();
                ds.Tables[0].Rows.Add(dr1);
               
                DataRow dr2 = ds.Tables[1].NewRow();
                ds.Tables[1].Rows.Add(dr2);
            }
        }

    }

    public class SomeDataSet : DataSet
    {
        public const string RelationT1_T2 = "RelationT1_T2";
        public SomeDataSet()
        {
            this.Tables.Add(new T1());
            this.Tables.Add(new T2());

            this.Relations.Add(RelationT1_T2, this.Tables[0].Columns["id"], this.Tables[1].Columns["id"]);
        }
    }

    public class T1 : DataTable
    {
        public T1() : base("T1")
        {
            DataColumn dc = this.Columns.Add("id", typeof(int));
            dc.AllowDBNull = false;
            dc.AutoIncrement = true;
            dc.AutoIncrementSeed = 0;
            dc.AutoIncrementStep = 1;

            dc = this.Columns.Add("T1_String",typeof(string));
            dc.DefaultValue = "T1";
        }
    }

    public class T2 : DataTable
    {
        public T2() : base("T2")
        {
            DataColumn dc = this.Columns.Add("id", typeof(int));
            dc.AllowDBNull = false;
            dc.AutoIncrement = true;
            dc.AutoIncrementSeed = 0;
            dc.AutoIncrementStep = 1;

            dc = this.Columns.Add("T2_String",typeof(string));
            dc.DefaultValue = "T2";
        }
    }
}

mvh
Avatar billede snepnet Nybegynder
26. oktober 2004 - 19:46 #10
(jeg har så også lige lavet et par tabeller i koden... jeg har jo ikke dine)
mvh
Avatar billede agertoft Nybegynder
26. oktober 2004 - 21:23 #11
tak for eksemplet.. jeg kigger lige på det imorgen tidlig. Er for træt nu, så jeg må hellere komme hjem, og klø på imorgen igen ;)
Avatar billede snepnet Nybegynder
26. oktober 2004 - 21:29 #12
bare iorden :o)
vi skrives ved.
mvh
Avatar billede agertoft Nybegynder
27. oktober 2004 - 10:43 #13
Nu tror jeg, at jeg har gennemskuet den. Men man behøver vel ikke sætte de relationer, du har gjort, vel?
Avatar billede snepnet Nybegynder
27. oktober 2004 - 11:21 #14
Jo det bliver du nødt til, hvis du vil skrive kode som det her :
dr.GetChildRows(SomeDataSet.RelationT1_T2)[0]["T2_String"];
(men det kan du jo så også bare lade være med når du er sikker på at der er 1-1 :o)
mvh
Avatar billede agertoft Nybegynder
27. oktober 2004 - 14:22 #15
Ja okay, nu har jeg tydet eksemplet :)

Men jeg kan ikke helt finde ud af, hvordan jeg "oversætter" det til min egen applikationer. Jeg bruger jo ikke statiske tabeller, men tabeller fra min SQL database. Jeg har to DataTable's:

oDataTableCourse_holes = oDataSet.Tables["FILTEREDcourse_holes"];
oDataTableHoles = oDataSet.Tables["FILTEREDholes"];

..og det er så dem, jeg vil have samlet. Jeg skal bruge tabellen udelukkende til visning af data, hvis det har noget at sige. Dvs jeg behøver ikke tage højde for auto-increment osv..

Sådan som jeg prøvede at konvertere dit eksempel var ved slet ikke at definere T1 og T2-klasserne. Og resten prøvede jeg at tilpasse min SQL tabeller, men jeg kan kun få den til at tage fat i værdier fra den éne DataTable i min nye DataTable...
Avatar billede snepnet Nybegynder
27. oktober 2004 - 14:39 #16
det var også tanken at du bare tog dit eksisterende dataset - det er ikke særlig meget af den kode jeg har sendt du skal bruge.
(grunden til at du fik så meget var at det helst skulle virke, så du kunne se fidusen).

men det du skal bruge/gøre noget ved er :

// her skal du angive de kolonner du vil have med fra de to tabeller - f.eks.
DataTable dt = new DataTable();
dt.Columns.Add("hole_no",typeof(int));
dt.Columns.Add("Yellow_Tee",typeof(string));
dt.Columns.Add("Red_Tee",typeof(string));

// og i nedenstående fylder du så noget i den nye tabel
foreach(DataRow dr in ds.Tables[0].Rows)
{
  DataRow newrow = dt.NewRow();
  newrow[0] = (int)dr["hole_no"];
  newrow[1] = dr["Yellow_Tee"].ToString();
 
  // det det er den linie her der kræver relationen....
  newrow[2] = dr.GetChildRows(SomeDataSet.RelationT1_T2)[0]["T2_String"];
  dt.Rows.Add(newrow);
}

(har ikke så meget tid, men er tilbage igen i aften :o)

mvh
Avatar billede snepnet Nybegynder
27. oktober 2004 - 22:39 #17
hej agertoft - ruller ?
(smider lige et svar hvis du kunne bruge det til noget og vil lukke, men ellers spørger du bare løs :o)
vi skrives ved
mvh
Avatar billede snepnet Nybegynder
27. oktober 2004 - 22:39 #18
hehe... ville selvfølgelig have spurgt :
"ruller det ?" :o)
Avatar billede snepnet Nybegynder
27. oktober 2004 - 22:40 #19
og så fik jeg jo egentlig heller ikke smidt det svar jeg pralede med - tjuhej hvor det går :D
mvh
Avatar billede agertoft Nybegynder
27. oktober 2004 - 23:11 #20
Jeg har ikke fået kigget på din metode. Jeg vil meget gerne sætte mig ind i det, men det tager nok lige lidt tid. Og da jeg er lidt presset, da jeg skal aflevere projekt næste fredag, tog jeg den lette løsning (og den mest forkerte); jeg lavede en ny metode i mit datalag, der med en SQL streng hentede og sorterede alt det jeg havde brug for i en tabel i et dataset. Det dataset sendte jeg så op til præsentationslaget ved metodekald og lavede Datalistens DataBind() på denne tabel.

Det virker, men jeg bryder mig ikke om selve løsningen. Det er et projekt, jeg skal arbejde videre på efter aflevering, så jeg vil optimere koden der.

Men du skal ikke snydes for point - tak for hjælpen ;)

..men det kan være jeg starter en tråd om dette igen, når jeg har fået kigget på dit sidste svar, og stadig ikke fået løst problemet :)
Avatar billede snepnet Nybegynder
27. oktober 2004 - 23:18 #21
hej agertoft :o)

du kan også bare spørge videre her... det er helt fint :o)
(det var ikke for at punke dig... det var fordi jeg ville henvise til dette spørgsmål i en anden forbindelse - hvor det også var noget med relationer på datasets - at jeg lige kom forbi).

håber alt går fint med projektet.

hold dig munter :o)
/snep
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