J'ai un WinForm de médias sociaux. J'ai une fonction qui crée essentiellement une nouvelle zone d'image lorsqu'un bouton est cliqué
Public Sub NewPost()
picture as new picturebox
picture.Width = 208
picture.Height = 264
picture.Image = Form2.PictureBox1.Image
picture.Location = New Point(258, 60)
End Sub
Le fait est qu'elle ne génère qu'une nouvelle zone d'image car je dois créer une nouvelle variable à chaque fois que je veux ajoutez une boîte à images, et à chaque fois je dois avoir un nouveau nom. Je sais que ma question est un peu déroutante mais de l'aide serait bien merci
4 Réponses :
Vous pouvez utiliser une boucle for while pour créer n nombre d'objets
car je dois créer une nouvelle variable à chaque fois
Pas nécessairement. Vous souhaitez simplement conserver une référence à l'objet. Cette référence n'a pas besoin d'être sa propre variable, elle peut tout aussi bien être un élément d'une liste. Par exemple, supposons que sur votre formulaire vous ayez une liste d'objets
PictureBoxen tant que membre au niveau de la classe:Public Sub NewPost() Dim pictureBox As New PictureBox pictureBox.Width = 208 pictureBox.Height = 264 pictureBox.Image = Form2.PictureBox1.Image pictureBox.Location = New Point(258, 60) Me.pictureBoxes.Add(pictureBox) End SubEnsuite, dans votre méthode, vous pouvez simplement ajouter à cette liste:
Dim pictureBoxes As New List(Of PictureBox)()Dans ce cas, la variable
pictureBoxest locale à la méthodeNewPostet obtient de nouveau créé à chaque fois. MaispictureBoxesest un membre au niveau de la classe et garde une trace de la liste croissante des objetsPictureBoxque vous créez.
Vous pouvez utiliser la ControlCollection
DirectCast(Form2.Controls(NewPost), PictureBox).Image = Form2.PictureBox1.Image
'OR
DirectCast(Form2.Controls("Pb12"), PictureBox).Image = Form2.PictureBox1.Image
existante puis vous pouvez la récupérer
Public Function NewPost() As String
Dim picture As New PictureBox
'your code
picture.Name = "Pb" & Form2.Controls.OfType(Of PictureBox).Count
Form2.Controls.Add(picture)
Return picture.Name
End Function
Si vous souhaitez intercepter des événements pour vos PictureBox dynamiques, vous devrez abandonner le modèle WithEvents et passer à l'utilisation de AddHandler .
Voici un exemple rapide où le nom du PictureBox est affiché quand il est cliqué. Notez que je ne suis pas en train de définir un Emplacement car ils sont ajoutés à un FlowLayoutPanel qui s'occupe de l'emplacement pour vous:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
NewPost()
End Sub
Public Sub NewPost()
Dim picture As New PictureBox
picture.Width = 208
picture.Height = 264
picture.BorderStyle = BorderStyle.FixedSingle
' ...etc...
Dim index As Integer = FlowLayoutPanel1.Controls.Count + 1
picture.Name = "pb" & index
AddHandler picture.Click, AddressOf picture_Click
FlowLayoutPanel1.Controls.Add(picture)
End Sub
Private Sub picture_Click(sender As Object, e As EventArgs)
Dim pb As PictureBox = DirectCast(sender, PictureBox)
Debug.Print(pb.Name)
End Sub
End Class
Merci juste utilisé, il n'a jamais entendu parler de FlowLayoutPanels!
@Khaled. Veuillez accepter la réponse en cliquant sur la coche (coche) à gauche de la réponse. Cela aidera les futurs lecteurs et gagnera quelques répétitions pour votre.
@Mary fait et fait!
Et si je voulais connecter une imagelist, comment ferais-je cela.
C'est une question assez vague ... "connecter" une ImageList comment? ... à quoi?
Désolé, j'ai une liste d'images, est là pour créer les images du FlowLayoutPanel , les images ImageLists . Si la question est encore vague j'enverrai une photo
Bien sûr ... vous accédez à ImageList comme un tableau. En supposant que vous l'ayez déjà chargé avec des images, vous pouvez simplement utiliser la propriété Controls.Count du panneau FlowLayout pour savoir quel numéro utiliser dans ImageList. Peut-être quelque chose comme: picture.Image = ImageList1.Images (FlowLayoutPanel1.Controls.Count)
Merci beaucoup
PictureBox pb = new PictureBox ();Votre emplacement est toujours le même. Vous devez ajouter le PictureBox à une collection Container Control. Considérez un FlowLayoutPanel comme conteneur .. Vous ne pouvez pas obtenir "infini". Vous allez épuiser les ressources.@LarsTech C #? Pourrait confondre un nouvel utilisateur.
@Mary c'est ok je connais le c #