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
PictureBox
en 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
pictureBox
est locale à la méthodeNewPost
et obtient de nouveau créé à chaque fois. MaispictureBoxes
est un membre au niveau de la classe et garde une trace de la liste croissante des objetsPictureBox
que 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 #