Avatar billede Syska Mester
08. november 2004 - 22:38 Der er 14 kommentarer og
1 løsning

ArrayList indeholder en Stuct, skal vises i en ComboBox

Hej venner,

Jeg har en ArrayList som indeholder Variable af følgende struct.
public struct PrinterInfo
{
    public string Printer;
    public string Path;
    public string Location;
    public string Comment;
}

Der er nok ca. 4 elementer i mit Array, jeg gerne vil have det vist i en ComboBox, men jeg er ikke helt klar over hvordan jeg gør det.

Indtil vidre har jeg prøvet følgende:
PrintersName.DataSource = o.Printers;
PrintersName.DisplayMember = ((PrinterInfo)o.Printers).Printer;
og
PrintersName.DataSource = (PrinterInfo)o.Printers;
PrintersName.DisplayMember = "Printer";

Men de fejler begge med "D:\Documents and Settings\Mikael Syska\My Documents\Visual Studio Projects\ComputerReg\main.cs(622): Cannot convert type 'System.Collections.ArrayList' to 'ComputerReg.PrinterInfo'"

Men er list på hærens mark nu, hvordan jeg angiver hvad DisplayMember og ValueMember skal være....eller i det hele taget bare får det til at virke.....
Avatar billede arne_v Ekspert
08. november 2004 - 22:41 #1
Hvad med en combo ?

PrintersName.DataSource = o.Printers;
PrintersName.DisplayMember = "Printer";
Avatar billede Syska Mester
08. november 2004 - 22:53 #2
Jo, men er alle min DisplayMember's det samme som mit Struct navn, altså "ComputerReg.PrinterInfo", ved ikke lige hvordan den her skal tvistes
Avatar billede Syska Mester
08. november 2004 - 22:54 #3
Og der skulle jeg jo gerne have min "public string Printer" variable til at stå
Avatar billede arne_v Ekspert
08. november 2004 - 22:55 #4
Er det ikke det som

PrintersName.DisplayMember = "Printer";

gør ?
Avatar billede Syska Mester
08. november 2004 - 22:58 #5
Det har ikke nogen indflydelse om jeg har den med eller ej, der kommer stadig til at stå "ComputerReg.PrinterInfo" 3 gange, hvis der er 3 printere i min ArrayList, jeg skal vel på en eller anden måde fortælle at den skal caste o.Printers til min struct, og derefter sige at den skal bruge "Printer" som DisplayMember
Avatar billede arne_v Ekspert
08. november 2004 - 23:01 #6
Prøv og lav din struct om til en class og de 4 members om til properties.
Avatar billede Syska Mester
08. november 2004 - 23:06 #7
Egentlig det jeg ville lidt udenom hvis det kunne lade sig gøre, for det er også den eneste anden måde jeg lige har set, men hvis det ikke kan lade sig gøre på den her måde kan jeg jo blive nød til at bøje mig.... :-(
Avatar billede arne_v Ekspert
08. november 2004 - 23:09 #8
Det her simple eksempel virker ihvertfald:

using System;
using System.Collections;
using System.Drawing;
using System.Windows.Forms;

public class X
{
    private string a;
    private string b;
    public X(string a, string b)
    {
        this.a = a;
        this.b = b;
    }
    public string A {
        get
        {
            return a;
        }
    }
    public string B {
        get
        {
            return b;
        }
    }
}

public class MainForm : Form
{
    private ComboBox cbx;
    public MainForm()
    {
        try
        {
            InitializeComponent();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    public static void Main(string[] args)
    {
        Application.Run(new MainForm());
    }
    private void InitializeComponent()
    {
        cbx = new ComboBox();
        SuspendLayout();
        cbx.Location = new Point(50, 50);
        cbx.Size = new Size(100, 25);
        cbx.Name = "Dynamic Combo Box";
        cbx.SelectedIndexChanged += new EventHandler(ChooseHandler);
        ArrayList list = new ArrayList();
        list.Add(new X("Et", "Dette er et"));
        list.Add(new X("To", "Dette er to"));
        list.Add(new X("Tre", "Dette er tre"));
        cbx.DataSource = list;
        cbx.DisplayMember = "B";
        cbx.ValueMember = "A";
        ClientSize = new Size(200, 200);
        Name = "Main Form";
        Text = "Main Form";
        Controls.Add(cbx);
        ResumeLayout(false);
    }
    private void ChooseHandler(object o, EventArgs e)
    {
        MessageBox.Show("Du valgte " + ((ComboBox)o).SelectedValue);
    }
}
Avatar billede Syska Mester
08. november 2004 - 23:19 #9
jeps, har også lige lavet det :-P

Så jeg håber ikke at du brugte så meget tid på det, ville bare vide om det kunne alde sig gøre med struct's men det kunne det vist ikke, men du får da selvf point, hvis du smider et svar.....
Avatar billede Syska Mester
08. november 2004 - 23:55 #10
For at du kan gøre dig fortjent til dine point ;-P, har jeg lige et lille ekstra spm.

Har snakket med en af mine venner som er startet som Datamatiker, og de har Java (som jeg også ved at du kan) han siger at man aldrig bør referere direkte. Altså siger han at jeg ikke bør har min ArrayList public i min class o, men lave en funktion inde i den, til at adde, fjerne, etc, og så lave den private så jeg ikke har direkte adgang til mine variabler, hvad er din mening om det, da jeg er ret sikker på du kender til problemet?

Smid et svar, så du kan få dine velfortjente point?

// ouT
Avatar billede arne_v Ekspert
09. november 2004 - 07:51 #11
Det er rigtigt.

I Java laver man en get metode til at hente den.

I C# laver man en property med en get til at hente den.
Avatar billede arne_v Ekspert
09. november 2004 - 07:51 #12
svar
Avatar billede Syska Mester
09. november 2004 - 08:15 #13
ja, men ville du også lave en ArrayList private og lave dine egne Propeties så til at hente alt ud?
Avatar billede arne_v Ekspert
09. november 2004 - 08:23 #14
Ja
Avatar billede Syska Mester
09. november 2004 - 17:13 #15
arghh, hader ikke at have ret, men tak for svaret
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