Jeg har i min c# applikation 10 imagebokse med navnene imgb1..10. Nu vil jeg gerne ændre hver imageboks billed/andre attributter dynamisk. Dvs. at jeg gerne vil
for (int i=0; i < 10; i++) { form1.(Imageboks+i).attribute = xxx; }
Jeg prøver jo netop at undgå dette. Spøgsmålet kan koges ned til:
Antag at jeg har en variabel v og en n imagebokse med navnene img{1..n}. Nu ønsker jeg at sætte farven for en specifik boks img{v} hvor værdien af v < n.
Dette kan rigtigt nok gøres med et loop. Men det er da et forfærdeligt spild - Tænk hvis n var 10.000 så skulle der i worst-case itereres 10000 gange!
Jeg ønsker alt helt konkret at referere en et objekt ud fra en variabel værdi.. Kan dette overhovedet lade sig gøre?
Det kan gøres med reflection. Da det må være et field du er ude efter, må det så være noget i denne stil du skal bruge (det er utestet, så ikke sikkert det virker):
using System.Reflection;
//(...) Type t = Assembly.GetExecutingAssembly().GetType("System.Windows.Forms.ImageBox"); ImageBox target = (ImageBox)t.GetField("img" + v, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static).GetValue(this); //(...)
Som sagt, ikke sikkert det virker, men kan da i det mindste være det giver dig lidt at arbejde med.
jeg kan ikke rigtig få det til at virke. t.GetField("xxx") returnerer null hver gang. Kunne du evt. poste noget kode der har får fat i en PictureBox c1 med en variabel?
Hvis jeg adderer dem til en collection.. Er jeg så sikker på rækkefølgen? F.eks. kunne jeg have adderet img5 før img4. Jeg kunne selvfølgelig kontrollere navnene i loopet men så er jeg tilbage til start igen :)
Pidgeot' måde er den ønskede, men jeg kan desværre ikke få det til at virke ordenligt :(
Så kan du bruge en collection med named index: Dictionary<int, PictureBox> boxes = new Dictionary<int, PictureBox>(); boxes.Add(1, pic1); boxes.Add(3, pic3); boxes.Add(2, pic2);
Synes godt om
Ny brugerNybegynder
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.