2017-01-03 7 views
0
 Dictionary<int, PictureBox> aCollection; 

     aCollection = new Dictionary<int, PictureBox>(); 

     aCollection.Add(333, new PictureBox 
      { 
       Name = "Alcoholism", 
       Image = Resources.alcoholism, 
       Size = new Size(22, 22), 
       SizeMode = PictureBoxSizeMode.StretchImage 
     }); 

     aCollection.Add(289, new PictureBox 
     { 
      Name = "Hypertension", 
      Image = Resources.hypertension, 
      Size = new Size(22, 22), 
      SizeMode = PictureBoxSizeMode.StretchImage 
     }); 

     PictureBox condition = aCollection[333]; //333 refers to alcoholism 
     condition.Location = new Point(450, 155); 
     displayForm.Controls.Add(condition); 

     PictureBox another = aCollection[289]; //289 refers to hypertension 
     another.Location = new Point(550, 155); 
     displayForm.Controls.Add(another); 

Код выше делает следующий вывод на Winform (обратите внимание на иконки):Невозможно отобразить тот же PictureBox больше, чем когда-то

two icons

Однако, если я включаю как PictureBox использовать же значок, с надеждой показывая тот же значок дважды т.е.

 PictureBox condition = aCollection[289]; //Hypertension 
     condition.Location = new Point(450, 155); 
     displayForm.Controls.Add(condition); 

     PictureBox another = aCollection[289]; //Hypertension 
     another.Location = new Point(550, 155); 
     displayForm.Controls.Add(another); 

я получаю только один значок OUTP ут.

one icon

Может кто-то пожалуйста, сообщите, где я пошло не так? Спасибо.

[Изменить] - Следующий код и производят только один значок

PictureBox condition = aCollection[289]; 
    condition.Location = new Point(450, 155); 
    displayForm.Controls.Add(condition); 

    PictureBox another = condition; 
    another.Location = new Point(550, 155); 
    displayForm.Controls.Add(another); 
+0

как о 'PictureBox еще = состояние;' и остальное будет как есть. –

ответ

1

При установке another = aCollection[289] вы ссылаетесь на тот же объект, как и при установке условие = к нему. Поэтому, когда вы обновляете местоположение другого, вы меняете местоположение aCollection[289] (а также condition)

Вам необходимо создать 2 отдельных экземпляра объектов, чтобы добавить 2 коробки для изображений. Вероятно, лучше всего сделать метод расширения, чтобы сделать глубокую копию объекта, а затем добавить их в элементы управления. Добавьте этот класс:

public static class MyExtension 
{ 
    public static PictureBox DeepCopy(this PictureBox pb) 
    { 
     return new PictureBox { Name = pb.Name, Image = pb.Image, Size = pb.Size, SizeMode = pb.SizeMode }; 
    } 
} 

А затем добавьте коробки изображения с помощью:

PictureBox condition = aCollection[289].DeepCopy(); //289 refers to hypertension 
    condition.Location = new Point(450, 155); 
    this.Controls.Add(condition); 

    PictureBox another = aCollection[289].DeepCopy(); //289 refers to hypertension 
    another.Location = new Point(550, 155); 
    this.Controls.Add(another); 
+0

Спасибо Джим, оцените тщательное решение! – taylorswiftfan

0

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

PictureBox newPictureBox(Image image, int X, int Y) { 
    return new PictureBox() { 
     Image = image, 
     Size = new Size(22, 22), 
     Location = new Point(X, Y), 
     SizeMode = PictureBoxSizeMode.StretchImage 
    }; 
} 

, а затем

displayForm.Controls.Add(newPictureBox(Resources.hypertension, 450, 155)); 
displayForm.Controls.Add(newPictureBox(Resources.hypertension, 550, 155)); 
+0

Это решает проблему, спасибо вам большое. Хотя довольно странно, что VS не бросает никаких сообщений об ошибках вообще, когда элемент управления используется несколько раз. – taylorswiftfan

 Смежные вопросы

  • Нет связанных вопросов^_^