none
доступ к picturebox по его имени RRS feed

  • Вопрос

  • Количество 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"];
    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;

    а в Вашем случае прога еще должна будет поковыряться в "словаре", который предварительно и заполнить... не вижу смысла...

    А так задача решена и тема закрыта

  • Насколько я понял,
    у Вас есть несколько картинок,
    размещенных на одной форме.
    Имена этих картинок где-то должны быть собраны,
    т.е. должна быть какая-то коллекция
    с перечнем всех необходимых объектов.

    Впрочем, это дело вкуса. 
    Закрыта - значит закрыта.

  • Ну, в общем, я делал лабу - игру крестики-нолики с "бесконечным игровым полем". Количество клеток в строках и колонках на поле рассчитывается исходя из размера окна программы. Клетки представляют собой 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 правка кода в первом примере
  • В этом случае я бы организовал 
    двумерный массив ячеек.
    Т.е. исходным объектом для исследования выбрал бы ячейку.
    А в свойствах ячейки указал бы picturebox.
    Тогда обращение к каждой ячейке можно было бы
    осуществлять по координатам и,
    соответственно, анализировать выигрыш и
    вносить изменения в картинки ячеек вдоль любой линии,
    горизонтальной, вертикальной или диагональной.
  • В этом случае я бы организовал 
     двумерный массив ячеек.

    ...

    У меня тоже используется массив ячеек, значения которых могут принимать значения "", "Х", "0". Но он используется только для отслеживания наступления момента выигрыша.

    В общем, мне мой вариант решения задачи показался наиболее оптимальным.

    Хотя на бескрайних просторах WEB встречаются и более "навороченные" решения.

  • Но Вы дополнительно к этому массиву
    создали кучу неорганизованных картинок,
    принадлежащих главной форме,
    обращение к которым осуществляется по их имени,
    а имя картинки - это те же координаты,
    но только в строковом формате.
    Объектное программирование и отличается от процедурного тем,
    что мы имеем дело не с отдельными массивами, переменными или картинками,
    а с объектами, в которых прописаны все их свойства,
    включая картинку.
    Если Ваша лабораторная работа должна быть выполнена на 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