Member 11709930 Ответов: 2

Передайте растровое изображение между формами, но на него ссылается строка


У меня есть несколько изображений, загруженных в память в виде растровых изображений.
Я хочу передать один из этих растровых изображений памяти из основной формы в другую в виде растрового изображения. Имя растрового изображения извлекается из сетки данных, где оно хранится в виде строки имени.

Как я могу получить имя растрового изображения и превратить его в растровое изображение, хранящееся в памяти?
Я могу сделать это с помощью решения типа "переключатель / корпус", но это очень много возни, и в приложении есть много примеров этого. Надеясь на что-нибудь попроще.

Что я уже пробовал:

private Bitmap hazmat;
hazmat = new Bitmap(Properties.Resources.hazmat_30);

if (dgv1.Rows[rowID].Cells["ImageName"].Value != null)
   {
   string iName = dgv1.Rows[rowID].Cells["ImageName"].Value.ToString();  //'hazmat'
   //  formData.setPic(hazmat); //  this works fine but not whats needed.
   formData.setPic(Bitmap)iName); //  <- what goes here to reference the bitmap?
   }

В целевой форме "formData":
public void setPic(Bitmap pic)
{
    this.pb1.Image = pic;
}

2 Ответов

Рейтинг:
2

VR Karthikeyan

Привет, попробуй это

if (dgv1.Rows[rowID].Cells["ImageName"].Value != null)
{
   string iName = dgv1.Rows[rowID].Cells["ImageName"].Value.ToString();
   Bitmap bitmap = new Bitmap(iName);
   formData.setPic(bitmap);
}


Рейтинг:
1

OriginalGriff

Имя переменной не может быть легко использовано для доступа к переменной, особенно из другого класса. Вы можете сделать это с помощью отражения, но ... вам нужен экземпляр класса, который содержит закрытую переменную, чтобы сделать это, и это делает его еще более грязным!
То, что вы пытаетесь это сделать, показывает, что в вашем общем дизайне есть что-то очень неправильное, так как это совсем не хорошая идея!

Вместо этого создайте новый класс:

public class ImageContainer
    {
    public string Name { get; set; }
    public Image Image { get; set; }
    public override string ToString()
        {
        return Name;
        }
    }
И заполните это изображение и имя:
ImageContainer ic = new ImageContainer() { Name = "Hazmat", Image = hazmat };
Затем использовать экземпляр класса элемента управления datagridview. Он будет отображать имя, но ячейка будет содержать ImageContainer.
Передай это своему второму классу:
if (dgv1.Rows[rowID].Cells["ImageName"].Value != null)
   {
   ImageContainer ic = (ImageContainer) dgv1.Rows[rowID].Cells["ImageName"].Value;
   formData.setPic(ic);
   }
public void setPic(ImageContainer ic)
    {
    pb1.Image = ic.Image;
    }
Чисто, просто, легко работать.