Лучший отвечающий
доступ к picturebox по его имени

Вопрос
-
Количество picturebox может варьироваться. Имена picturebox задаются в процессе заполнения формы.
Хотелось бы знать, как можно из другой процедуры получить доступ к произвольному picturebox на форме, если в процессе выполнения будет сформировано имя требуемого picturebox? Цель: изменение свойств типа окраски, картинки, видимости.
Может есть другие варианты?
Для C#
- Изменено Dervish_70 1 июня 2013 г. 19:12
1 июня 2013 г. 19:11
Ответы
-
Если под именем Вы понимаете свойство Name:
Control control=new SomeControl(); control.Name="SomeName"; form.Controls.Add(control);
то так:
Control control=form.Controls["SomeName"];
- Предложено в качестве ответа Black Scorpio 3 июня 2013 г. 5:15
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 4 июня 2013 г. 10:14
1 июня 2013 г. 19:59
Все ответы
-
Если под именем Вы понимаете свойство Name:
Control control=new SomeControl(); control.Name="SomeName"; form.Controls.Add(control);
то так:
Control control=form.Controls["SomeName"];
- Предложено в качестве ответа Black Scorpio 3 июня 2013 г. 5:15
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 4 июня 2013 г. 10:14
1 июня 2013 г. 19:59 -
Создайте словарь
Dictionary<string,picturebox>,
в котором ключем будет имя пикчебокса,
а переменной - сам пикчебокс.
И все - добавляйте, удаляйте, ищите и пр.
в этом словаре любой пикчебокс по его имени. .- Изменено QazRdx 2 июня 2013 г. 12:48
2 июня 2013 г. 10:16 -
Создайте словарь
Dictionary<string,picturebox>,
в котором ключем будет имя пикчебокса,
а переменной - сам пикчебокс.
И все - добавляйте, удаляйте, ищите и пр.
в этом словаре любой пикчебокс по его имени. .
А зачем мне излишне увеличивать программу? В моем случае я компоную имя требуемого бокса по тем же принципам, что и при размещении боксов на панели, а затем по способу, предложенному PetSerAl, обращаюсь к нему (боксу)
string tBoxName = PartOfName_1+"_"+PartOfName_2; Control tBox = this.MyPanel.Controls[tBoxName]; tBox.BackColor = Color.Red;
а в Вашем случае прога еще должна будет поковыряться в "словаре", который предварительно и заполнить... не вижу смысла...
А так задача решена и тема закрыта
3 июня 2013 г. 5:25 -
Насколько я понял,
у Вас есть несколько картинок,
размещенных на одной форме.
Имена этих картинок где-то должны быть собраны,
т.е. должна быть какая-то коллекция
с перечнем всех необходимых объектов.
Впрочем, это дело вкуса.
Закрыта - значит закрыта.3 июня 2013 г. 5:43 -
Ну, в общем, я делал лабу - игру крестики-нолики с "бесконечным игровым полем". Количество клеток в строках и колонках на поле рассчитывается исходя из размера окна программы. Клетки представляют собой PictureBox'ы размером 20х20 пикселей. При заполнении игрового поля клеткам присваиваются имена:
tBox.Name = IndexOfRow.ToString() + "_" + IndexOfColumn.ToString();
Затем, когда условия победы выполнятся, прога раскрашивает "победную линию". Для этого определяется верхний-правый(-левый) tBox линии и в цикле находится следующий элемент линии у которого меняется цвет фона
private void ShowEndGame(string _Line, int _top_pos, int _left_pos) { if (_Line == "RSlash") _left_pos = _left_pos + LineLenght - 1; Control pBox; int _row = _top_pos; int _col = _left_pos; int _sign; pBox = this.GameField.Controls[_row.ToString() + "_" + _col.ToString()]; pBox.BackColor = Color.Red; for (int _st = 0; _st < LineLenght; _st++) { if (_Line == "RSlash") _sign = -1; else _sign = 1; if (!(_Line == "HLine")) _row = _top_pos + _st; if (!(_Line == "VLine")) _col = _left_pos + (_st * _sign); pBox = this.GameField.Controls[_row.ToString() + "_" + _col.ToString()]; pBox.BackColor = Color.Lime; } }
Примерно так...
А за совет Вам спасибо! :)
- Изменено Black Scorpio 3 июня 2013 г. 7:38 правка кода в первом примере
3 июня 2013 г. 7:26 -
В этом случае я бы организовал
двумерный массив ячеек.
Т.е. исходным объектом для исследования выбрал бы ячейку.
А в свойствах ячейки указал бы picturebox.
Тогда обращение к каждой ячейке можно было бы
осуществлять по координатам и,
соответственно, анализировать выигрыш и
вносить изменения в картинки ячеек вдоль любой линии,
горизонтальной, вертикальной или диагональной.3 июня 2013 г. 8:11 -
В этом случае я бы организовал
двумерный массив ячеек....
У меня тоже используется массив ячеек, значения которых могут принимать значения "", "Х", "0". Но он используется только для отслеживания наступления момента выигрыша.
В общем, мне мой вариант решения задачи показался наиболее оптимальным.
Хотя на бескрайних просторах WEB встречаются и более "навороченные" решения.
4 июня 2013 г. 9:47 -
Но Вы дополнительно к этому массиву
создали кучу неорганизованных картинок,
принадлежащих главной форме,
обращение к которым осуществляется по их имени,
а имя картинки - это те же координаты,
но только в строковом формате.
Объектное программирование и отличается от процедурного тем,
что мы имеем дело не с отдельными массивами, переменными или картинками,
а с объектами, в которых прописаны все их свойства,
включая картинку.
Если Ваша лабораторная работа должна быть выполнена на C#,
то Вы должны создать объектную модель,
а не кучу не связанных между собой массивов и картинок.
Можно было бы ограничиться даже не массивом ячеек,
а массивом картинок, унаследованных от picturebox,
но с дополнительным свойством CrossOrNull,
в котором будут храниться Ваши "","X","0".
public class pictureBoxExt : PictureBox
{ public string CrossOrNull;
...
}
public int n=8;
public pictureBoxExt [,] PictureArr=new pictureBoxExt[n,n];
Вот это решение было бы достойным.
Надеюсь, но не уверен, что Вы поняли.
- Изменено QazRdx 4 июня 2013 г. 13:40
- Предложено в качестве ответа Black Scorpio 17 июня 2013 г. 3:34
- Отменено предложение в качестве ответа Black Scorpio 17 июня 2013 г. 3:36
4 июня 2013 г. 13:35 -
public class pictureBoxExt : PictureBox
{ public string CrossOrNull;
...
}
public int n=8;
public pictureBoxExt [,] PictureArr=new pictureBoxExt[n,n];
Вот это решение было бы достойным.
Надеюсь, но не уверен, что Вы поняли.Ну, я понял, о чем речь :) Поди не совсем уж "дурной"...
Будет время - поэкпериментирую с этим вариантом. В любом случае - спасибо!
17 июня 2013 г. 3:41