Avatar billede HPCISCO Nybegynder
17. september 2012 - 15:46 Der er 17 kommentarer og
2 løsninger

List<UserControl> og tilgang til properties

Hej,

Jeg har en liste (List) af UserControls:
private List<UserControl>

Denne liste indeholder UserControls af forskellige typer, f.eks. Printer, Kuglepen, Kontorstol osv.

Alle disse typer har flere properties, som er ens.
F.eks. har de alle en property, som hedder Farve.
Nu kan man så selvfølgelig tilgå disse properties som her:
Printer1.Farve = Colors.Black;
Kuglepen1.Farve = Colors.Black;
Kontorstol1.Farve = Colors.Black;

Men hvis jeg nu ønsker at sætte disse properties i et loop, er jeg nød til at spørge på typen og caste, for at sætte property'en.

for (int i = 0; i < minListe.Count; i++)
{
  if (minliste[i] is Printer)
    (minListe[i] as Printer).Farve = Colors.Black;

  if (minliste[i] is Kuglepen)
    (minListe[i] as Kuglepen).Farve = Colors.Black;

...
...

Kan dette ikke gøres med een linie, som noget a la:

for (int i = 0; i < minListe.Count; i++)
{
  (minListe[i]).Farve = Colors.Black;
}

da alle elementerne jo har denne property?


Tak for hjælpen på forhånd!
Avatar billede arne_v Ekspert
17. september 2012 - 15:54 #1
Hvis alle dine klasser arver fra en faelles basis klasse med en Farve property.
Avatar billede runesoft Nybegynder
17. september 2012 - 15:55 #2
for(dynamic minUserControl in minListe){
  minUserControl.Farve = Colors.Black;
}


Men du kunne også lave et interface de alle implementerede og så bruge det til at refererer dem
Avatar billede arne_v Ekspert
17. september 2012 - 15:56 #3
public abstract class MyControl : UserControl
{
    public Color Farve { get; set; }
}

public class Printer : MyControl

...

List<MyControl>
Avatar billede HPCISCO Nybegynder
17. september 2012 - 16:02 #4
Det gik stærkt :)
Vender først tilbage senere, da jeg først får tid i aften.
Takker indtil nu
Avatar billede HPCISCO Nybegynder
17. september 2012 - 17:05 #5
>>runesoft
for(dynamic minUserControl in minListe){
  minUserControl.Farve = Colors.Black;
}

så skal jeg vel have et loop til hver type??

>>arne_v
Jeg har aldrig arbejdet med abstrakte klasser, derfor følgende spørgsmål:
Hvor skal denne klasse defineres?
Hvordan bruger jeg properties fra den abstrakte klasse i min UserControl klasse?
Avatar billede arne_v Ekspert
17. september 2012 - 17:16 #6
Den kan defineres hvor som helst bare at den er til raadighed for dine klasser.

Du kan referere til properties i en basis klasse paa samme maade som properties i klassen selv (medmindre de er private).
Avatar billede arne_v Ekspert
17. september 2012 - 17:16 #7
dynamic omgaar compile time type check og checker runtime, saa hvis der faktisk er en property Farve saa virker det ellers faar du en exception
Avatar billede runesoft Nybegynder
17. september 2012 - 17:18 #8
Nej. Dynamic gør at det vil virke. Hvis du gerne vil lære lidt af det synes jeg nu du skal gå efter interfacet eller den abstrakte klasse. Det er også på mange måder pænere :)
Avatar billede runesoft Nybegynder
17. september 2012 - 17:20 #9
Som Arne sagde :)
Avatar billede HPCISCO Nybegynder
17. september 2012 - 17:26 #10
>>arne_v
Har jeg forstået det rigtig:

public abstract class MyControl : UserControl
{
    public Color Farve { get; set; }
}

public class Printer : MyControl
{
...
...
...
}

for (int i = 0; i < minListe.Count; i++)
{
  (minListe[i] as MyControl).Farve = Colors.Black;
}


??
Avatar billede arne_v Ekspert
17. september 2012 - 17:37 #11
Hvis minListe er af typen List<MyControl> kan du bruge:

minListe[i].Farve = Colors.Black;
Avatar billede HPCISCO Nybegynder
18. september 2012 - 09:26 #12
Det kører!
Jeg brugte løsningen med den abstrakte klasse, men har så også lært noget om Interface :)

Hvor vil det være mest normalt/korrekt at lægge den abstrakte klasse? Jeg er klar over, at det ikke spiller nogen rolle, men hvor ville I have defineret den?

arne_v, lægger du også lige et svar?
Avatar billede runesoft Nybegynder
18. september 2012 - 09:34 #13
Ved siden af dine UserControl filer.
Avatar billede HPCISCO Nybegynder
18. september 2012 - 10:05 #14
OK, så man skal have en ekstra fil til denne lille kode...?
Det kan da ende med en frygtelig masse filer!
Avatar billede runesoft Nybegynder
18. september 2012 - 10:16 #15
Det er da så vidt jeg kan gennemskue kun en ekstra fil der dækker alle dine nuværende og fremtidige user controls. Du kan i princippet også lave det i samme fil som en af dine user controls, men det bliver hurtigt svært at gennemskue hvad kode der ligger hvor hvis ikke filnavnet nogenlunde røber hvad filen indeholder.
Avatar billede HPCISCO Nybegynder
18. september 2012 - 10:26 #16
Alright, så venter vi bare på arne :)
Avatar billede arne_v Ekspert
18. september 2012 - 16:32 #17
svar
Avatar billede arne_v Ekspert
18. september 2012 - 16:33 #18
Du kan fordele din klasser paa filer indenfor projektet som du har lyst til.

Nogen bruger en fil per klasse.

Andre bundter samhoerende klasser i en fil.
Avatar billede arne_v Ekspert
18. september 2012 - 16:34 #19
Et interface et bedre end en abstrakt basis klasse, hvis:
- "is a" kriteriet ikke er fuldt opfyldt
- sub klasserne kan have forskellig implementering

Men jeg vurderede at det ikke var tilfaeldet her.
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

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