accessing objects in form by index or somthing like index
-
Do you mean something like this?
foreach (Control c in this.Controls)
{
PictureBox pic = c as PictureBox;
if (pic != null)
...
}regards
yes, thank you. that can be what i was looking for :-D
-
use an ImageList, it's better http://msdn.microsoft.com/en-us/library/fat9bdzd(VS.80).aspx[^][^] :cool:
luisnike19
thank you but isn't the ImageSize of pictures limited (256 * 256)? what is the solution? how can i have something like ImageList but with much bigger size of image? thanks again
-
thank you but isn't the ImageSize of pictures limited (256 * 256)? what is the solution? how can i have something like ImageList but with much bigger size of image? thanks again
Do you need to display the images or just keep track of them inside a list? If you need to display them, then you could add
PictureBox
controls dynamically to the form at runtime, something likePictureBox pic = new PictureBox();
pic.Image = ...; // load your image instance from where ever you wish
Controls.Add(pic);If you just need a list then this will do the trick:
List<Image> images = new List<Image>();
images.Add(...); // add imagesregards
-
Do you need to display the images or just keep track of them inside a list? If you need to display them, then you could add
PictureBox
controls dynamically to the form at runtime, something likePictureBox pic = new PictureBox();
pic.Image = ...; // load your image instance from where ever you wish
Controls.Add(pic);If you just need a list then this will do the trick:
List<Image> images = new List<Image>();
images.Add(...); // add imagesregards
i can solve my problem now but it is not optimized though :-D: i named my pictureboxes as: picturebox1, picturebox2, ... and picturebox16. now i want them in a list. i wrote the followings:
PictureBox pic;
for (int i = 1; i < 16; i++)
{
foreach (Control cont in this.Controls)
{
if (cont is PictureBox)
{
pic = cont as PictureBox;
if (pic.Name.EndsWith(i.ToString()))
images.Add(pic);
}
}
}it works :) but do you suggest any thing more optimized? :doh: thanks
-
i can solve my problem now but it is not optimized though :-D: i named my pictureboxes as: picturebox1, picturebox2, ... and picturebox16. now i want them in a list. i wrote the followings:
PictureBox pic;
for (int i = 1; i < 16; i++)
{
foreach (Control cont in this.Controls)
{
if (cont is PictureBox)
{
pic = cont as PictureBox;
if (pic.Name.EndsWith(i.ToString()))
images.Add(pic);
}
}
}it works :) but do you suggest any thing more optimized? :doh: thanks
Optimized? This is plain wrong ;) Right now your code will be executed
16 * Controls.Length
times. The innerforeach
loop will be executed for eachi
in the outer loop. Better keep a counter in the foreach loop like this:int picCounter = 1; foreach (Control cont in this.Controls) { if (cont is PictureBox) { pic = cont as PictureBox; if (pic.Name.EndsWith(picCounter.ToString())) images.Add(pic); picCounter++; } }
-
Optimized? This is plain wrong ;) Right now your code will be executed
16 * Controls.Length
times. The innerforeach
loop will be executed for eachi
in the outer loop. Better keep a counter in the foreach loop like this:int picCounter = 1; foreach (Control cont in this.Controls) { if (cont is PictureBox) { pic = cont as PictureBox; if (pic.Name.EndsWith(picCounter.ToString())) images.Add(pic); picCounter++; } }
imagine the first control which is surveyed in foreach loop is picturebox16 (foreach is surveying the controls from picturebox16 to picturebox1 in order). then every time, the if condition fails. because picCounter is 1 and non of the name of picture boxes ends with "1" (11 is exception here). so only picturebox1 (last survey of foreach) is added to the List (because if condition does not fail). and after that, the foreach loop is finished (because there is no other control in foreach to survey) and only picturebox1 is added to the list. so i think it is better to change the value of picCounter and then start foreach from the first. isn't it right? please guide me. thanks
-
imagine the first control which is surveyed in foreach loop is picturebox16 (foreach is surveying the controls from picturebox16 to picturebox1 in order). then every time, the if condition fails. because picCounter is 1 and non of the name of picture boxes ends with "1" (11 is exception here). so only picturebox1 (last survey of foreach) is added to the List (because if condition does not fail). and after that, the foreach loop is finished (because there is no other control in foreach to survey) and only picturebox1 is added to the list. so i think it is better to change the value of picCounter and then start foreach from the first. isn't it right? please guide me. thanks
Ah, I see. Why do you actually need the
pic.Name.EndsWith
check? For me it seems like you just want to store eachPictureBox
control into a list. Or do you have more picture boxes that do not end with a number 1-16? If this is the case, then I'd store the picture box number into theTag
property, so you only have to check this property if you want to add thePictureBox
to the list. regards -
Ah, I see. Why do you actually need the
pic.Name.EndsWith
check? For me it seems like you just want to store eachPictureBox
control into a list. Or do you have more picture boxes that do not end with a number 1-16? If this is the case, then I'd store the picture box number into theTag
property, so you only have to check this property if you want to add thePictureBox
to the list. regardsas you said, tag is more proper here. isn't it any way more optimized than those tow loops? where they correct or not at last? how can i make it optimized (with consideration that i use tags instead of EndsWith) thanks again
-
as you said, tag is more proper here. isn't it any way more optimized than those tow loops? where they correct or not at last? how can i make it optimized (with consideration that i use tags instead of EndsWith) thanks again
I think the
Tag
solution with just theforeach
loop is the correct way to do this. As you said yourself, your solution will add some controls twice or some none at all (depending whether youcontinue
out of the loop or not), becauseEndsWith("1")
would trigger for both pictureBox1 and pictureBox11, depending on the order in which the picture boxes are returned in theforeach
loop. regards -
I think the
Tag
solution with just theforeach
loop is the correct way to do this. As you said yourself, your solution will add some controls twice or some none at all (depending whether youcontinue
out of the loop or not), becauseEndsWith("1")
would trigger for both pictureBox1 and pictureBox11, depending on the order in which the picture boxes are returned in theforeach
loop. regardsexcept the Tag solution, do you offer anything else? why just 'foreach'? you mean without the extern 'for'? i can't find out why. i wonder if you explain more about the reason of ommiting the extern 'for'. thanks again and again :)
-
except the Tag solution, do you offer anything else? why just 'foreach'? you mean without the extern 'for'? i can't find out why. i wonder if you explain more about the reason of ommiting the extern 'for'. thanks again and again :)
Sajjad Izadi wrote:
except the Tag solution, do you offer anything else?
I'd say it's the best solution for your problem.
Sajjad Izadi wrote:
why just 'foreach'? you mean without the extern 'for'? i can't find out why.
Because using the Tag, the foreach loop will already find all the controls you are looking for.
foreach (Control cont in this.Controls) { if (cont is PictureBox) { pic = cont as PictureBox; if(pic != null) { string tag = pic.Tag as string; int number = int.Parse(tag); // this might fail, add a check here if (tag != null && number >= 1 && number <= 16) Console.WriteLine(number); } } }
-
Sajjad Izadi wrote:
except the Tag solution, do you offer anything else?
I'd say it's the best solution for your problem.
Sajjad Izadi wrote:
why just 'foreach'? you mean without the extern 'for'? i can't find out why.
Because using the Tag, the foreach loop will already find all the controls you are looking for.
foreach (Control cont in this.Controls) { if (cont is PictureBox) { pic = cont as PictureBox; if(pic != null) { string tag = pic.Tag as string; int number = int.Parse(tag); // this might fail, add a check here if (tag != null && number >= 1 && number <= 16) Console.WriteLine(number); } } }
but i want the pictures in order of their position at form. does it response for the order? and a non related question: what is that 'int?' ?
-
but i want the pictures in order of their position at form. does it response for the order? and a non related question: what is that 'int?' ?
-
It's a Nullable Type[^]. But I modified the sample a bit, because internally Control will cast the tag value to a string, so the int solution will not work here. See my modified post. regards
what if i want the in order of their position in screen? should i ommit the outer 'for' still?
-
what if i want the in order of their position in screen? should i ommit the outer 'for' still?
-
Depends on how you define "position". The tag value, the (x,y) position, the order of how they were added to the form?
how is it if i want them in (x,y) position? how is it if i want to add them in order of tag value? :) and what if i want them in order of they were added to form? :-D you will help me if multiple aspects if you answer these threes. thanks in advanced ;)
-
how is it if i want them in (x,y) position? how is it if i want to add them in order of tag value? :) and what if i want them in order of they were added to form? :-D you will help me if multiple aspects if you answer these threes. thanks in advanced ;)
-
ok man ..., you're right :-D: i have to write them myself. thanks for your really hale answers :)