11. februar 2004 - 23:31Der er
21 kommentarer og 1 løsning
Lægge et object ind i en listbox
Hvordan gør jeg dette?
Jeg har en class med to strings i.
Så har jeg en listbox hvor den ene string skal stå men når man dobbeltklikker på en af valgmulighederne i listboxen skal den skrive objektet ud i tekstboxe. Jeg håber jeg har udtrykt mig ordentligt.
Dette er den kode jeg nogenlunde er kommet frem til.
public class Disk { public string dName; public string dSize; }
Disk newDisk = new Disk(); newDisk.dName = Convert.ToString(oReturn1["Name"]); newDisk.dSize = oReturn1["Size"].ToString();
Men det er både dName og dSize der skal være ind i listboxen. Så når man dobbeltklikker på en af valgmulighederne så bliver dName og dSize hentet ud og skrevet over i tekstboxene.
Så foreslår jeg du gør sådan: listBox1.Items.Add(newDisk.dName+" "+newDisk.dSize);
Når der står at en metode modtager et "object", betyder det at den kan modtage ALLE objekter. Det inkluderer din Disk. Det inkluderer også 'string', da de opfattes som objekter.
Jeg er ikke heeelt sikker, men jeg tror at hvis du indsætter et objekt, er det resultatet af din "ToString()"-metode på objektet, den udskriver. Det vil sige du kan lave en ToString-metode på dit objekt (Disk), til noget i retningen af det her:
public string ToString() { return newDisk.dName+" "+newDisk.dSize; }
Det betød når man så dobbeltklikkede i listboxen på et givent navn kom hele indholdet af "objektet" klassen whatever ud så man kunne smide der over i en anden form eller noget.
Det er samme funktionalitet jeg vil have.
Det du foreslog giver ikke det rigtige.
Jeg kan ikke rigtigt forklare mig fordi jeg blev forvirret da alt jeg havde lært om funktioner pludseligt hed metoder når det var klasser vi snakkede om.
Den komponent du har der, kan indeholde både et navn og et tilhørende objekt. Det kan en ListBox ikke. Den kan kun indeholde et navn. Alt det jeg har beskrevet fungerer til navne-delen af komponenten. Det er den der svarer til den første variabel i din AddObject i C++ koden.
En hurtig lille løsning ville være at tilføje objektet til en hashtable, samtidig med at du tilføjer det til ListBox'en - på den måde ville du nemt kunne slå navnet op i din Hashtable og finde objektet frem.
Hash... hvad for noget hash? Jeg fatter ikke en bjælde.
Hvis man kunne det jeg vil i C++ så burde man også kunne det i C#
Her er noget mere kode der måske kan hjælpe til at forstå hvad jeg vil.
Projekt *proj = new Projekt; // Skab nyt objekt fra klassen Projekt proj->SelectSQL("SELECT * FROM tbl_projekt ORDER BY projekt_id DESC"); // Hent data fra tabellen delete proj; // Slet objekt
while(!DM->Query1->Eof) // Så længe der er data i tabellen, kør nedenstående { // Attributten får tildelt feltets værdi Projekt *proj = new Projekt; proj->projekt_id = DM->Query1->FieldByName("projekt_id")->AsInteger; proj->projekt_navn = DM->Query1->FieldByName("projekt_navn")->AsString; proj->ansvarlig_id = DM->Query1->FieldByName("ans_id")->AsInteger; proj->projekt_oprettet = DM->Query1->FieldByName("oprettet")->AsString; proj->projekt_afsluttet = DM->Query1->FieldByName("afsluttet")->AsString; proj->projekt_sidst_aendret = DM->Query1->FieldByName("sidst_aendret")->AsString; proj->projekt_status = DM->Query1->FieldByName("status")->AsString; proj->projekt_notes = DM->Query1->FieldByName("notes")->AsString; ListBox1->Items->AddObject(proj->projekt_navn,(TObject*)proj); // Tilføj attributten til listboksen DM->Query1->Next(); // Gå videre til næste }
Jeg mangler åbenbart forståelsen for hvad den gør den der Tostring-metode.... Jeg kan ikke rigtig få den til at virke. Eller også virker den ikke som jeg vil have... Eller et eller andet... for den gør ikke noget.
Du behøver ikke have noget med Hash at gøre. Bare lav den ToString metode på Disk og tilføj Disk til din ListBox. Så vil komponenten selv udføre ToString-metoden, når den skal vise de elementer den indeholder.
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.