Avatar billede huusom Nybegynder
11. februar 2004 - 23:31 Der 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();

listBox1.Items.AddRange(new Object(newDisk.dName));

Det er den sidste del jeg ikke lige kan greje...

Hjælp mig?
Avatar billede nielsbrinch Nybegynder
11. februar 2004 - 23:41 #1
Er det en instans af Disk du vil gemme i listen eller er det dName?
Avatar billede huusom Nybegynder
11. februar 2004 - 23:43 #2
Det ved jeg ikke.. kender ikke rigtig den jargon.

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.
Avatar billede nielsbrinch Nybegynder
11. februar 2004 - 23:46 #3
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.
Avatar billede nielsbrinch Nybegynder
11. februar 2004 - 23:50 #4
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;
}

og derefter sådan:
listBox1.Items.Add(newDisk);
Avatar billede huusom Nybegynder
11. februar 2004 - 23:53 #5
Jeg lærte lidt Objekt orienteret programmering for 3 måneder siden i c++

Koden var sådan her.

Ansvarlig *ans = new Ansvarlig;
    ans->SelectSQL("SELECT * FROM tbl_ansvarlig ORDER BY ansvarlig_id ASC");
    delete ans;

    while(!DM->Query1->Eof)
    {
        Ansvarlig *ans = new Ansvarlig;
        ans->ansvarlig_navn = DM->Query1->FieldByName("ansvarlig_navn")->AsString;
        ans->ansvarlig_id = StrToInt(DM->Query1->FieldByName("ansvarlig_id")->AsString);
        combo1->Items->AddObject(ans->ansvarlig_navn,(TObject*)ans);
        DM->Query1->Next();
    }

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.
Avatar billede nielsbrinch Nybegynder
11. februar 2004 - 23:58 #6
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.
Avatar billede nielsbrinch Nybegynder
11. februar 2004 - 23:59 #7
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.
Avatar billede huusom Nybegynder
12. februar 2004 - 00:07 #8
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
    }
Avatar billede nielsbrinch Nybegynder
12. februar 2004 - 00:07 #9
Hashtable hash = new Hashtable(); // erklæres samme sted som din ListBox

public class Disk
    {
        public string dName;
        public string dSize;
    }

Disk newDisk = new Disk();
newDisk.dName = Convert.ToString(oReturn1["Name"]);
newDisk.dSize = oReturn1["Size"].ToString();

listBox1.Items.Add(newDisk.dName);
hash.Add(newDisk.dName, newDisk);

Ovenstående er ud fra hukommelsen, da jeg ikke lige har en compiler ved hånden.

Når brugeren så klikker i din ListBox, finder du ud af hvilken værdi han klikkede på, og slår objektet op i din Hashtable.
Avatar billede nielsbrinch Nybegynder
12. februar 2004 - 00:09 #10
C++ og C# har mange ligheder, men de er ikke éns. Nogle ting skal gøres på forskellige måder.
Avatar billede nielsbrinch Nybegynder
12. februar 2004 - 00:10 #11
Den bedste løsning vil nok være min kommentar: 23:50:12

Den svarer bedst til din C++ løsning. Tilføj objektet "newDisk" direkte, og lav en ToString-metode i klassen.
Avatar billede huusom Nybegynder
12. februar 2004 - 00:13 #12
Hmmmmm.... jeg forstår det ikke....

Jeg mistede lige pludselig en masse for C#

Jeg går i seng...
Avatar billede nielsbrinch Nybegynder
12. februar 2004 - 00:16 #13
Jeg har tjekket med en compiler. Din ToString-metode på Disk-klassen skal se sådan ud:

public override string ToString() {
  return newDisk.dName;
}
Avatar billede huusom Nybegynder
12. februar 2004 - 08:10 #14
Men hvor skal jeg placere den kodestump henne?
Avatar billede nielsbrinch Nybegynder
12. februar 2004 - 08:28 #15
Inde i Disk-klassen, sådan her:

public class Disk
{
  public string dName;
  public string dSize;

  public override string ToString()
  {
      return newDisk.dName;
  }
}
Avatar billede huusom Nybegynder
13. februar 2004 - 23:58 #16
Det virker slet ikke... den siger den ikke kender namespace newDisk og peget ned på return.
Avatar billede nielsbrinch Nybegynder
14. februar 2004 - 10:54 #17
Nåh ja, bare

return dName;
Avatar billede huusom Nybegynder
14. februar 2004 - 15:30 #18
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.
Avatar billede huusom Nybegynder
14. februar 2004 - 15:55 #19
Hvordan er det lige du gør med det der Hashcode? Jeg har siddet og kaget lidt rundt i det.
Avatar billede nielsbrinch Nybegynder
14. februar 2004 - 16:43 #20
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.
Avatar billede huusom Nybegynder
01. marts 2004 - 16:23 #21
Jeg fik endelig din Tostring til at virke.
Avatar billede nielsbrinch Nybegynder
01. marts 2004 - 16:25 #22
Det er godt at høre.
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