Avatar billede trumf Nybegynder
22. februar 2005 - 23:16 Der er 43 kommentarer og
1 løsning

listbox i C#

Hejsa E

Jeg sidder og roder med en listbox hvor jeg indsætter noget tekst som jeg sammensætter fra forskellige felter i en DB.
Hvordan er det så lige at jeg også indsætter et ID så jeg kan finde den valgte post ud fra det ?

Ligesom i web hvor der både er en value og en tekst!
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 08:02 #1
Display member og value member.

Det er nøjagtig det samme i forms som i webs.

Listbox.DataSource = DATASET.Tables["NAVN"];
Listbox.DisplayMember = "Sammensat"; //Her skal navnet på din kolonne stå, den kolonne som du sammen sætter.
Listbox.ValueMember = "ID"; //Navnet på din ID kolonne.
Avatar billede trumf Nybegynder
23. februar 2005 - 12:08 #2
OK, det ser fint ud, men nogle af dataene skal evt. formateres alt efter hvad der står i dem. Lad mig give et eksempel på min kode:

foreach (DataRow dr in dsFav.Tables["Favorites"].Rows)
{
    //guid = dr["guid"].ToString();
    classification = dr["classification"].ToString();
    wineyear = dr["wineyear"].ToString();
    lowerPrice = dr["lowerPrice"].ToString();
    wineData = dr["name"].ToString();
    if (classification != "")
    {
        wineData += " " + classification;
    }
    if (wineyear != "0")
    {
        if (wineyear != "1")
        {
            wineData += " " + wineyear;
        }
        else
        {
            wineData += " UA";
        }
    }
    this.lstShowWines.Items.Add(wineData);
    //this.lstShowWines.Add(guid);
}
Avatar billede trumf Nybegynder
23. februar 2005 - 12:11 #3
Prøver lige det her:

lstShowWines.DataSource = dsFav.Tables["Favorites"];

foreach (DataRow dr in dsFav.Tables["Favorites"].Rows)
{
    guid = dr["guid"].ToString();
    classification = dr["classification"].ToString();
    wineyear = dr["wineyear"].ToString();
    lowerPrice = dr["lowerPrice"].ToString();
    wineData = dr["name"].ToString();
    if (classification != "")
    {
        wineData += " " + classification;
    }
    if (wineyear != "0")
    {
        if (wineyear != "1")
        {
            wineData += " " + wineyear;
        }
        else
        {
            wineData += " UA";
        }
    }
    this.lstShowWines.DisplayMember = wineData;
    this.lstShowWines.ValueMember = guid;
}
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:11 #4
I samme sekund du ikke binder dataset, og listbox sammen, kan du ikke få adgang til DisplayMember, og ValueMember. Sådan som du gør nu, tilføjer du ting til dens Item collection, det vil bevirke at det eneste du kan gemme i din listbox, er det som du kan se i den.
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:13 #5
Du har fat i noget af det rigtige... Du skal ændre dine data, i dit datset, inden du binder det til din listbox.

Så i din foreach løkke skal du fatisk ændre data'en i dine kolonner, og skrive dsFav.AcceptChanges(); lige uden for løkken, og så have    this.lstShowWines.DisplayMember = wineData;
    this.lstShowWines.ValueMember = guid;
lige neden under.
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:15 #6
Du kan ikke bruge variabler til at få listbox'en til at gemme data for dig. Jeg prøver lige på at stille det op for dig. 2 min...
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:17 #7
Vi skal lige have styr på hvad det er du prøver på :-)

Det som du i din foreach gemmer i din "wineData" variabel, det vil du gerne have vist i din list box?
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:19 #8
foreach (DataRow dr in dsFav.Tables["Favorites"].Rows)
            {
                guid = dr["guid"].ToString();
                classification = dr["classification"].ToString();
                wineyear = dr["wineyear"].ToString();
                lowerPrice = dr["lowerPrice"].ToString();
                wineData = dr["name"].ToString();
                if (classification != "")
                {
                    wineData += " " + classification;
                }
                if (wineyear != "0")
                {
                    if (wineyear != "1")
                    {
                        wineData += " " + wineyear;
                    }
                    else
                    {
                        wineData += " UA";
                    }
                }

                dr["name"] = wineData;
            }
           
            dsFav.AcceptChanges();
            lstShowWines.DataSource = dsFav.Tables["Favorites"];
            this.lstShowWines.DisplayMember = "name";
            this.lstShowWines.ValueMember = "guid";
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:20 #9
Hurtigt, og meget dårligt lavet om, men dette burde faktsik gøre det som du prøver på...

Vi skal have det skruet bedre sammen, vil gerne hjælpe hvis jeg kan... Har du lidt data fra din database, så jeg kan se hvordan det ser ud, så jeg kan forstå hvad du prøver på med din foreach?
Avatar billede trumf Nybegynder
23. februar 2005 - 12:20 #10
Der kommer lige en scrollbar som kører lidt op og ned og forsvinder så.
Listboksen er tom :-(
Avatar billede trumf Nybegynder
23. februar 2005 - 12:21 #11
Hov så ikke at du allerede havde svaret. Se bort fra min sidste kommentar :-)
Avatar billede trumf Nybegynder
23. februar 2005 - 12:27 #12
Det er mine favoritvine som skal overføres fra www.vinguide.net til min PDA.

year er årgang
classification er f.eks reserva eller cru
osv...
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:28 #13
Og din select statement ? :)
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:33 #14
Jeg skal bare have et overblik over hvordan dit dataset ser ud, når du får alle dine favorit vine fra den side :) Skriv lige et par linjer med det forskellige, så jeg kan se  hvordan det kan se ud... :)
Avatar billede trumf Nybegynder
23. februar 2005 - 12:36 #15
Jeg overfører først noget XML fra en webservice og det går fint her nogle af mine favoritter

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Favorites>
    <guid>{5B58DBF1-8C1E-4C9B-B668-871F5D1A9E2C}</guid>
    <winesort>Redwine</winesort>
    <name>Frog Hill</name>
    <wineyear>2003</wineyear>
    <classification />
    <country>Sydafrika</country>
    <area>Paarl</area>
    <lowerPrice>76</lowerPrice>
    <upperPrice>0</upperPrice>
    <yourGrade>10</yourGrade>
  </Favorites>
  <Favorites>
    <guid>{BFEA3220-021A-4334-A2BB-7F632BBB6EAF}</guid>
    <winesort>Port</winesort>
    <name>Quinta Nova Late Bottled Vintage</name>
    <wineyear>1997</wineyear>
    <classification />
    <country>Portugal</country>
    <area>Porto</area>
    <lowerPrice>80</lowerPrice>
    <upperPrice>0</upperPrice>
    <yourGrade>10</yourGrade>
  </Favorites>
  <Favorites>
    <guid>{CBF86615-08BD-42D4-BBE0-0C56E18C46C0}</guid>
    <winesort>Whitewine</winesort>
    <name>Selaks Sauvignon Blanc</name>
    <wineyear>1999</wineyear>
    <classification />
    <country>New Zealand</country>
    <area>Marlborough</area>
    <lowerPrice>50</lowerPrice>
    <upperPrice>0</upperPrice>
    <yourGrade>10</yourGrade>
  </Favorites>
</NewDataSet>
Avatar billede trumf Nybegynder
23. februar 2005 - 12:38 #16
Her er en hvor der også er klassifikation

  <Favorites>
    <guid>{6552E92C-682A-4E7C-AC75-3B1455F82656}</guid>
    <winesort>Redwine</winesort>
    <name>Domaine des Carbonnières</name>
    <wineyear>2000</wineyear>
    <classification>Réserve du domaine</classification>
    <country>Frankrig</country>
    <area>Gigondas</area>
    <lowerPrice>95</lowerPrice>
    <upperPrice>0</upperPrice>
    <yourGrade>9</yourGrade>
  </Favorites>
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:41 #17
Det XML du overføre, gemmer du det som en XML fil, eller henter du det direkte over i et dataset?
Avatar billede trumf Nybegynder
23. februar 2005 - 12:46 #18
gemmer det som xml så man har adgang til det offline :-)
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:49 #19
Kan du prøve at sende en kopi af din xml fil? Kun hvis der ikke står noget personlig data i, så vil jeg lige lave lidt ben arbejde, og kigge på det, og se om jeg kan hjælpe dig videre. Men hvis du synes jeg er for langsom, og for dårlig, er det i orden :-)
Avatar billede trumf Nybegynder
23. februar 2005 - 12:53 #20
Du kan bare tage ovenstående og gemme det som xml, det er helt som det ser ud...

hvis jeg laver denne: this.lstShowWines.Items.Add(wineData); kommer der fint data i listboksen, men guid kommer ikke med, så dataene er OK, det er bare det med at guid skal ind som en value.
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:54 #21
Jeg arbejder på sagen :-)
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 12:58 #22
Den sidst XML du skrev, den med:
<name>Domaine des Carbonnières</name>

Hvad står der i toppen af dens XML fil? Hvilken encoding skal jeg skrive, for at den forstår tegnet "è" ?

Med det andet har jeg fået det til at virke nu :)
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:03 #23
DataSet dsFav = new DataSet();
            dsFav.ReadXml(@"c:\test.xml");

            string guid = "";
            string classification = "";
            string wineyear = "";
            string lowerPrice = "";
            string wineData = "";

            foreach (DataRow dr in dsFav.Tables[0].Rows)
            {
                guid = dr["guid"].ToString();
                classification = dr["classification"].ToString();
                wineyear = dr["wineyear"].ToString();
                lowerPrice = dr["lowerPrice"].ToString();
                wineData = dr["name"].ToString();
                if (classification != "")
                {
                    wineData += " - " + classification;
                }
                if (wineyear != "0")
                {
                    if (wineyear != "1")
                    {
                        wineData += " - " + wineyear;
                    }
                    else
                    {
                        wineData += " - N/A";
                    }
                }

                dr["name"] = wineData;

                dsFav.AcceptChanges();
            }

            listBox1.DataSource = dsFav.Tables[0];
            listBox1.DisplayMember = "name";
            listBox1.ValueMember = "guid";
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:04 #24
Har ændret i navnet på den sidste jeg fik af dig, bare så jeg var sikker på at den xml jeg arbejdede med, var korrekt. Dette er aftestet, og godkendt, det virker ihvertfald for mig :) Med de data jeg har fået af dig.
Avatar billede trumf Nybegynder
23. februar 2005 - 13:38 #25
OK nu har jeg lavet mit om så det ser sådan ud:

string wineData = "";
string wineyear = "";
string classification = "";
this.txtFelt.Text = "Favoritter:";
DataSet dsFav = new DataSet();
dsFav.ReadXml(@"Program Files\VinGuide\vgf.xml");

foreach (DataRow dr in dsFav.Tables["Favorites"].Rows)
{
    classification = dr["classification"].ToString();
    wineyear = dr["wineyear"].ToString();
    wineData = dr["name"].ToString();
    if (classification != "")
    {
        wineData += " " + classification;
    }
    if (wineyear != "0")
    {
        if (wineyear != "1")
        {
            wineData += " " + wineyear;
        }
        else
        {
            wineData += " UA";
        }
    }
    dr["name"] = wineData;
    dsFav.AcceptChanges();
//                        lstShowWines.Items.Add(dr["name"].ToString());
}
lstShowWines.DataSource = dsFav.Tables["Favorites"];
lstShowWines.DisplayMember = "name";
lstShowWines.ValueMember = "guid";
dsFav.Clear();

Umiddelbart er det ligesom dit, men scrollbaren kører bare lidt op og ned og en af vinene kommer ind i listboksen og forsvinder igen....
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:40 #26
dsFav.Clear() skal du da ikke kalde :)
Avatar billede trumf Nybegynder
23. februar 2005 - 13:40 #27
hvis jeg udkommenterer:
lstShowWines.Items.Add(dr["name"].ToString());
og fjerner:
lstShowWines.DataSource = dsFav.Tables["Favorites"];
lstShowWines.DisplayMember = "name";
lstShowWines.ValueMember = "guid";
Så virker det som før...
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:41 #28
dsFav.Tables[0], prøv at brug den i stedet for....
Avatar billede trumf Nybegynder
23. februar 2005 - 13:42 #29
Så fjernede jeg den og så virkede det søreme :-)
Avatar billede trumf Nybegynder
23. februar 2005 - 13:43 #30
jeg troede bare at det var fint at rydde op efter sig med den clear!!!
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:44 #31
:-) Hurtig forklaring:

Du fylder dit dataset med en XML fil, normalt bliver et dataset fyldt fra en Adapter, og der er her man normalt navngiver en tabel i et dataset. Det sker ikke, da du jo ikke arbejder med en adapter, derfor kender dit dataset kun din tabel som tabel nr 0.
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:44 #32
Haha... :)

Troede det var dit dataset du lavede om i...
Avatar billede trumf Nybegynder
23. februar 2005 - 13:47 #33
Nej, det virker med dsFav.Tables["Favorites"];
Det var dsFav.Clear() jeg fjernede.
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:47 #34
Et lille svar, så må du se om jeg har fortjent de points ;-)
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:47 #35
Så må XML filen give dataset'et et navn at arbejde med, så har jeg lært noget nyt idag :)
Avatar billede trumf Nybegynder
23. februar 2005 - 13:48 #36
Jeg takker mange gange, det var fantastisk :-)
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:49 #37
Er det compact Frameworket du udvikler til?
Avatar billede trumf Nybegynder
23. februar 2005 - 13:50 #38
jeg forstår bare ikke hvorfor listboksen tømmes igen fordi datasettet cleares!
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:50 #39
Forstil dig at listbox'en kigger direkte ned i dataset'et, hvad kan den så se, når dit dataset er tømt?
Avatar billede trumf Nybegynder
23. februar 2005 - 13:51 #40
jep CF. Du kan bare melde dig ind på VinGuide, så får du programmet når det er klart.
Ja du må da godt få det nu, men det er ikke særligt kønt...
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:53 #41
Jeg vil bare gerne se din kilde kode når du er færdig. Har aldrig lavet noget til CF, og vil gerne se noget som virker, så jeg kan danne mig en idé om hvor svært det er... :)
Avatar billede trumf Nybegynder
23. februar 2005 - 13:54 #42
skal jeg ikke tømme og lukke det dataset eller klarer Garbage Collectoren det ?
Avatar billede the_party_dog Nybegynder
23. februar 2005 - 13:55 #43
Så længe din applikation kører, skal du jo bruge det data. GC kommer og rydder op når det er nødvendigt.
Avatar billede trumf Nybegynder
23. februar 2005 - 14:01 #44
Men der er jo ikke mange ressourcer på en PDA, så man skal være lidt mere påpasselig med at rydde op.

Mht at udvikle til PDA så skal du bare tænke på udvikle "normalt" men at du kun kan ca 1/5 af hvad du normalt kan!
Forms er for ressourcekrævende, så man bruger paneler i stedet og tænder og slykker for dem.
Man kan ikke rigtigt arve, så menuer skal skrives om på hver form osv...
Og så er der jo størrelsen på formen... der er ikke meget plads!
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
Kurser inden for grundlæggende programmering

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