1
votes

Comment ajouter des composants infinis lorsqu'un bouton est cliqué

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


3 commentaires

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 #


4 Réponses :


0
votes

Vous pouvez utiliser une boucle for while pour créer n nombre d'objets


0 commentaires

1
votes

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 Sub

Ensuite, 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éthode NewPost et obtient de nouveau créé à chaque fois. Mais pictureBoxes est un membre au niveau de la classe et garde une trace de la liste croissante des objets PictureBox que vous créez.


0 commentaires

0
votes

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


0 commentaires

1
votes

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


8 commentaires

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