vb.net назначать изображение для изображения через панель управления

Пишу программу карточной игры на VB.NET. Я столкнулся с проблемой. Computer_Flow объявляется как System.Windows.Forms.Panel вручную в окне дизайна. Я создал такое окно изображения программно:

Dim P As PictureBox = New PictureBox  
P.Size = New Point(Cards_Width, Cards_Height)  
P.SizeMode = PictureBoxSizeMode.StretchImage  
P.Image = Image.FromFile(Images_Folder_Path & "Back.png")   
P.Tag = Deck(DI)    
P.Margin = New Padding(1)  
Computers_Hand(DI) = Deck(DI)  
Computer_Flow.Controls.Add(P)

Позже я хочу изменить это изображение PictureBox. Я пытаюсь изменить это так:

Computer_Flow.Controls(i).image = Image.FromFile(Images_Folder_Path & "Back.png")  

Но я получаю сообщение об ошибке: «изображение» не является членом System.Windows.Forms.Control».

Кто может помочь мне решить эту проблему?

Спасибо!


person eMbs    schedule 31.01.2013    source источник


Ответы (2)


Вы должны cast от control до picture box, чтобы получить результат. Попробуйте это,

CType(Computer_Flow.Controls(i),PictureBox).image=Image.FromFile(Images_Folder_Path & "Back.png")

CType

ИЗМЕНИТЬ:

вы можете легко избежать этого invalidCastException таким эффективным способом,

If TypeOf Computer_Flow.Controls(i) Is PictureBox then

CType(Computer_Flow.Controls(i),PictureBox).image=Image.FromFile(Images_Folder_Path & "Back.png")

End If

TypeOf

person Rajaprabhu Aravindasamy    schedule 31.01.2013
comment
Да, это прекрасно работает, как и другой ответ, я думаю, что это даже лучше, потому что мне не нужно объявлять другую переменную. Спасибо! - person eMbs; 31.01.2013
comment
Для справки: вы избегаете временной переменной, что хорошо, но CType выдаст InvalidCastException, если Control, которое вы ей даете, не является PictureBox. В этом случае я бы обернул его в блок Try...Catch. - person SolarBear; 31.01.2013
comment
@GriphoN, если вы хотите преодолеть исключение, упомянутое солнечным медведем, вы можете попробовать мое новое редактирование. - person Rajaprabhu Aravindasamy; 31.01.2013

Вы получаете доступ к списку Control, базового класса, который не содержит члена Image.

Вам нужно будет ввести его как PictureBox:

Dim pb As PictureBox = TryCast(Computer_Flow.Controls(i), PictureBox)

If Not pb Is Nothing Then
     pb.image = Image.FromFile(Images_Folder_Path & "Back.png")
End If

Таким образом, VB будет знать, что это не просто Control, а PictureBox с членом Image. Я предлагаю добавить TryCast на всякий случай.

person SolarBear    schedule 31.01.2013