объединение имен объектов с номерами - PullRequest
2 голосов
/ 28 февраля 2012

пожалуйста, примите во внимание, что это мой первый пост, и я новичок в C #

. Я создаю UserControl с несколькими картинками.Эти объекты автоматически называются pictureBox1, pictureBox2, pictureBox3 и т. Д.

Теперь я хочу изменить соответствующее изображение, нажав:

pictureBox1.Image = Properties.Resources.i51; 

, пока все хорошо.Но как назначить номер без записи одной строки для каждого события?

pictureBox(1).Image = Properties.Resources.i51;

не работает, а многие другие тоже не работают.

есть подсказка?Заранее большое спасибо!

Ответы [ 3 ]

3 голосов
/ 28 февраля 2012

Вы можете создать список графических блоков на вашем пользовательском элементе управления:

List<PictureBox> boxes = new List<PictureBox>();

Теперь после инициализации графических блоков в конструкторе добавьте их в список:

boxes.Add(pictureBox1);
boxes.Add(pictureBox2);
...

Теперь сделайте его видимым для публичной собственности:

public List<PictureBox> Boxes
{
    get 
    {
       return this.boxes;
    }
}

Теперь вы можете назначить в своем классе:

Boxes[0].Image = Properties.Resources.i51;
Boxes[1].Image = Properties.Resources.i51;

Если все происходит в одном классе, вам не нужно создавать вышеуказанное публичное свойство.

1 голос
/ 28 февраля 2012

Заполните все ваши графические блоки в список, как уже предоставленная msmolka, а также добавьте к нему ReadyOnlyCollection:

private List<PictureBox> _PictureBoxes;
private ReadOnlyCollection<PictureBox> _PictureBoxesReadOnly;

Создайте его в конструкторе:

public MyUserControl()
{
     InitializeComponent();
     _PictureBoxes = new List<PictureBox>();
     _PictureBoxesReadOnly = _PictureBoxes.AsReadOnly();
}

И сделайтеReadOnlyCollection доступен только как IList:

public IList<PictureBox> PictureBoxes
{
    get { return _PictureBoxesReadOnly; }
}

Это (на мой взгляд) лучше, чем подход от msmolka.Для того, чтобы сделать его идеальным, я бы тоже не отдал весь PictureBoxes внешнему миру, а вместо этого только Image s как BindingList.Но я думаю, что для новичка вы можете начать с вышеизложенного и, возможно, улучшить этот материал позже.

1 голос
/ 28 февраля 2012

Вы можете использовать FindControl для подобных вещей, например :

int iControlNum = 1;
PictureBox pb = this.FindControl("pictureBox" + iControlNum.ToString())
                as PictureBox;
pb.Image = ...;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...