Avatar billede tgv Nybegynder
16. december 2006 - 16:40 Der er 14 kommentarer

Referere en imagebox dynamisk

Hej.

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;
}

hvordan gør jeg dette?
Avatar billede tgv Nybegynder
16. december 2006 - 16:41 #1
Imageboks+i = imgb+i
Avatar billede kalp Novice
16. december 2006 - 16:55 #2
foreach(ImageBox imageb in form1)
{
image.attribute = xxx;
}
Avatar billede kalp Novice
16. december 2006 - 16:56 #3
foreach(ImageBox imageb in form1)
{
imageb.attribute = xxx;
}
Avatar billede kalp Novice
16. december 2006 - 16:57 #4
hvis altså det ikke hedder PictureBox for så skal du lige ændre ImageBox til det
Avatar billede tgv Nybegynder
16. december 2006 - 18:06 #5
Spørgsmålet var virkelig hvordan jeg kunne referere boksen dynamisk ud fra en variabel.. hvad nu hvis jeg ønskede at sætte attributes på hver anden?

for (int i=0; i < 10; i+=2)
{
  form1.(Imageboks+i).attribute = xxx;
}
Avatar billede kalp Novice
16. december 2006 - 19:23 #6
din reference er jo imageb.. men dette ville sætte attribute for hver anden.

int count = 0;
foreach(ImageBox imageb in form1)
{
count++;
if(count == 1)
{
imageb.attribute = xxx;
count = 0;
}

}
Avatar billede tgv Nybegynder
16. december 2006 - 20:18 #7
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?
Avatar billede kalp Novice
16. december 2006 - 20:22 #8
altså... du startede selv ud med at lave en loop som dog ikke rigtig kunne bruges...

men til at gøre det dynamisk som du ønsker ved jeg desværre ikke da det ikke er noget som jeg har arbejdet med som sådan
Avatar billede pidgeot Nybegynder
16. december 2006 - 22:30 #9
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.
Avatar billede tgv Nybegynder
16. december 2006 - 22:44 #10
Ja mange tak :) - Jeg vil afprøve det og vende tilbage senere
Avatar billede tgv Nybegynder
17. december 2006 - 00:16 #11
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?
Avatar billede hmortensen Nybegynder
17. december 2006 - 01:07 #12
Du kunne smide dem i en collection. Så bliver de meget nemmere at arbejde med.

List<PictureBox> boxes = new List<PictureBox>();
boxes.AddRange(new PictureBox[] { pic1, pic2 });

Så kan du lave din løkke:

for (int i = 0; i < boxes.Count; i+=2)
{
  boxes[i].attribute = x;
}
Avatar billede tgv Nybegynder
17. december 2006 - 11:33 #13
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 :(
Avatar billede hmortensen Nybegynder
17. december 2006 - 11:39 #14
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);
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