Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [VB .NET] Controllo degli eventi di oggetti creati dal codice

    Ciao a tutti
    Nella mia nuova applicazione ho bisogno di creare una serie di GroupBox (il cui numero è specificato da una variabile che recupero dal mio sito). Per fare ciò utilizzo un ciclo Do Until. Fin qui tutto bene.. Ho però bisogno di gestire gli eventi di queste GroupBox separatamente (MouseEnter, MouseLeave, Click) in modo che, ad esempio cliccando su una succede qualcosa di diverso da quello che succede su un'altra.
    Il mio codice è questo:
    codice:
      Dim STR()
            STR = Split(wb.Document.Body.InnerText, "////")
            Dim n As Integer = STR(0)
            Dim nc As Integer = 0
            Dim y As Integer = 17
            Dim x As Integer
            Dim nrc As Integer = 0
            Dim TESTI()
            Do Until nrc = n
                If x > 829 Then
                    y += 6 + 177
                    nc = 0
                End If
                Dim gb1 As New GroupBox
                AddHandler gb1.MouseEnter, AddressOf APPGB_Mouse_Enter             gb1.Text = ""
                gb1.Size = New System.Drawing.Size(200, 177)
                gb1.Location = New System.Drawing.Point(6 + nc * 200 + nc * 6, y)
                StoreGB.Controls.Add(gb1) 
                TESTI = Split(STR(nrc + 1), ";;;")
                Dim lab As New TextBox
                lab.Size = New System.Drawing.Size(196, 27)
                lab.Location = New System.Drawing.Point(2, 148)
                lab.BorderStyle = BorderStyle.None
                lab.TextAlign = HorizontalAlignment.Center
                lab.Cursor = Cursors.Default
                lab.BackColor = Color.White
                lab.ReadOnly = True
                lab.Text = TESTI(0)
                gb1.Controls.Add(lab)
                Dim img As New PictureBox
                AddHandler img.Click, AddressOf Appimg_click
                img.Size = New System.Drawing.Size(188, 124)
                img.Location = New System.Drawing.Point(6, 16)
                img.InitialImage = Nothing
                gb1.Controls.Add(img)
                img.ImageLocation = TESTI(3)
                img.SizeMode = PictureBoxSizeMode.Zoom
                lab.Name = "App" & nc + 1 & "Lab"
                img.Name = "App" & nc + 1 & "Img"
                gb1.Name = "App" & nc + 1
                nrc += 1
                nc += 1
                x = 6 + (nc + 1) * 200 + nc * 6
            Loop
    La parte in verde è quella adibita alla creazione della GroupBox, le altre creano ognuna componenti all'interno di esso e la struttura è più o meno la stessa.
    La riga evidenziata in rosso è quella che mi permette di gestire gli eventi di ciò che creo. Il problema è che essendo creati in un ciclo gli oggetti riferiscono allo stesso codice per lo stesso evento quindi per ognuno viene eseguita la stessa azione.
    Come posso fare per differenziare tutto??

    Un altro problema arriva quando imposto nell'evento click qualcosa che si riferisce alla GroupBox:
    codice:
    Public WithEvents APPIMG As PictureBox
    Public WithEvents APPGB As GroupBox
    
    Public Sub APPGB_Mouse_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles APPGB.MouseEnter
            MsgBox(APPGB.Text)
    End Sub 
    Public Sub Appimg_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles APPIMG.Click
            MsgBox("Ciao")
    End Sub
    Nella parte verde ho un messaggio che dice "Ciao"; nella parte rossa ho un errore di compilazione che dice: "Object reference not set to an instance of an object."(Uso VS in inglese)
    Come posso fare??
    Grazie mille a tutti!!

  2. #2
    Non capisco dove vai ad inizializzare i nuovi elementi;
    manca.
    Me.controll.add(controllo).

    Se ti compaiono sei un mago apparte il fatto che mancano tutti i vaolri:

    Codice PHP:
    Private  WithEvents  picture  As new PictureBox

    picture
    .width ""
    picture.height ""
    picutre.location = new point ("","")
    picture.backgroundimage my.computer.resource (sempre meglio importare le risorse nel pogetto)
    me(o form in cui ti trovi).controll.add(controllo
    CIoè non riesco a capire il tuo codice o spiegati meglio altrimenti commentalo


    Edit :ho letto male il codice chiedo venia;
    Ma non riesco a capire il problema cerca di spiegarti meglio

    Edit: l'unica cosa che mi viene in mente con questa stanchezza è che combini un macello con quella variabile integer dove vai ad inizializzare il ciclo dountil se non sbaglio, dichiarala double o int64.

    Edit: non è nemmeno quello il problema ma non riesco a capire il tuo codice.
    Non riesco davvero a capire cose ci devi dare e nemmeno il senso.
    01001101 01000001 01010010 01001001 01001111 01000000 01001101 01001111 01001110 01000101☺☻

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Il codice è corretto.

    Quello che ti manca è poter distinguere il GroupBox selezionato, cosa che devi fare nell'evento MouseEnter, al fine di decidere l'azione da intraprendere.
    Prima devi però valorizzare una proprietà (o crearne una apposita) che ti consenta di distinguere ogni GroupBox.
    A titolo di esempio, potresti usare la proprietà Tag per memorizzare il numero di GroupBox creato. Nel ciclo ti basta aggiungere la seguente assegnazione:

    codice:
        gb1.Tag = nrc.ToString
    Per verifica, sempre a titolo di esempio, aggiungi un Label1 al tuo form, e vedrai che quando posizioni il mouse su un GroupBox qualsiasi ti mostra l'indice. Ecco come:
    codice:
        Private Sub APPGB_Mouse_Enter(sender As System.Object, e As System.EventArgs)
            Dim gb As GroupBox = CType(sender, GroupBox)
            Label1.Text = "GroupBox selezionato: " + gb.Tag
        End Sub
    Io ti ho fatto l'esempio con la proprietà Tag, ma ovviamente tu deciderai di utilizzare l'informazione che più è consona alle tue esigenze.


  4. #4
    Grazie mille per le risposte..
    Ho risolto modificando il nome delle GroupBox con una stringa che ricavo dal mio sito e che mi serve per le operazioni successive. Quindi nell'evento distinguo gli elementi con
    codice:
    Sender.Name

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.