Custom Control, intercettare un evento...

venerdì 03 ottobre 2008 - 13.00

Ghitano Profilo | Newbie

Ho creato un controllo tipo Panel
e dinamicamente sulla base di alcune proprietà creo una serie di label
questi label si trovano in una classe a parte dentro al controllo panel
non riesco a gestire l'evento click su queste label quando piazzo il controllo in un form

riporto il codice per capire meglio
'****************** LA CLASSE DA ME CREATA IN STILE PANEL
Public Class BasePane
Inherits System.Windows.Forms.UserControl
' ******************** QUI DICHIARO UN EVENTO PUBBLICO CHE VIENE VISTO NEL FORM DOVE METTO IL CONTROLLO
' DOVREBBE GESTIRE IL CLICK IN CIASCUNA LABEL CREATA DINAMICAMENTE
Public Event RowClick(ByVal sender As Object, ByVal e As EventArgs)

Public Structure StrRow
Dim Text As String
Dim Width As Integer
Dim Height As Integer
End Structure

'*********** LA CLASSE TIPO LABEL CHE CREO DINAMICAMENTE E UN EVENTO MYBASE.CLICK, SE LASCIO COME E' FUNZIONA BENISSIMO
, MA DEVO INTERCETTARE L'EVENTO NEL FORM DOVE METTO IL CONTROLLO SIGH...
Public Class ClsLabelDesc
Inherits System.Windows.Forms.Label
Private Sub MyTextBox_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click
MsgBox(Me.Name & "'s text Click!")
End Sub
End Class

' ******** DICHIARO UNA MATRICE DI CONTROLLI
Dim _MLabDesc() As ClsLabelDesc

'*********** CON QUESTA FUNZIONE MI VIENE RESTITUITA LA MATRICE DI CONTROLLI
Public Function ReturnControlsDesc(ByVal Rows() As StrRow, ByVal font As System.Drawing.Font)
ReDim _MLabDesc(Rows.Length - 1)
For x As Short = 0 To Rows.Length - 1
_MLabDesc(x) = New ClsLabelDesc
With _MLabDesc(x)
.Name = "LabDesc" & (x)
.BackColor = Color.Transparent
.Cursor = Cursors.Hand
.Font = font
.Location = New System.Drawing.Point(10 + 3 + ImgList.ImageSize.Width, x * (ImgList.ImageSize.Height + 10) + _INIzio)
.Width = Rows(x).Width
.Height = Rows(x).Height
.Text = Rows(x).Text
'*********** QUI MI DA ERRORE (l'operando AdressOf deve essere iL nome di un metodo)
AddHandler .Click, AddressOf _MLabDesc(x).Click
End With
Next
Return _MLabDesc
End Function

'******** con questa sub pubblica dal form carico tutte le label create
Public Sub RowsShow()
Dim MLDesc() As ClsLabelDesc = ReturnControlsDesc(_Rows, _FontRow)
For x As Short = 0 To MLDesc.Length - 1
Me.Controls.AddRange(New System.Windows.Forms.Control() {MLDesc(x)})
Next
End Sub
' ********* questa è la proprietà che mi permette di caricare dal form le informazioni che mi servono per creare i controlli
Public WriteOnly Property rows() As RowLabel.StrRow()
Set(ByVal value As RowLabel.StrRow())
_Rows = value
End Set
End Property

'ANDIAMO ADESSO AL FORM .........................................

trovo tra gli eventi del panel l'evento RowClick come specificato sopra
come faccio a fare qualcosa del genere nel form?

Private Sub BasePane1_RowClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles BasePane1.RowClick
MsgBox("Hai selezionato il controllo " & sender.Name)
' dove sender.name è il nome del controllo label (tipo: "LabelDesc1")
End Sub

aiutatemi... vi prego...
Ghitano BitBoys

Harley.Net82 Profilo | Junior Member

Ciao, ho letto solo una parte del tuo Thread
(hai scritto un poema!)

Cmq credo di aver capito di cosa hai bisogno.

Ti posto un codice con il quale puoi aggiungere l' evento Click a qualsiasi Label tu abbia aggiunto al form:


Qui è dove vado ad instanziare l' oggetto Label:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


E questo è l' evento pronto ad essere assegnato a qualsiasi Label
Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) MsgBox("Ciao") End Sub

Ciao

PS: se la risposta ti soddisfa, Accettala grazie

Ghitano Profilo | Newbie

Non è esattamente quello che avevo chiesto... troppo facile ;-)

ho creato un controllo tipo panel
dentro questo controllo creo dinamicamente le label (dentro la classe panelCustom)

se metto il controllo PanelVustom in un form, ho una proprietà RowLabel dove metto i criteri della label da creare
e poi con PanelCustom1.RowLabelShow() creo la label nel PanelCustom

adesso devo intercettare l'evento Click che faccio in quella label creata dentro il panel


la classe è strutturata un po così:

Public Class PanelCustom
Public Event RowClick(ByVal sender As Object, ByVal e As EventArgs)

Public Class MiaLabel
Public Sub MyLabel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click
End Sub
End Class

Public Sub RowLabelShow()
dim Lab as new MiaLabel
Lab.text = "ciao"
AddHandler Lab.Click, AddressOf MyLabel_Click ' ERRORE ERRORE
Me.Controls.AddRange(New System.Windows.Forms.Control() {Lab})
end sub

End Class


Nel mio form vedo l'evento RowClick
ma come faccio a dirgli che mi deve rispondere con il nome della label cliccata se ne creo più di una? tipo msgbox ("Hai selezionato la label " & Sender.name)

non abbandonatemi please
Ghitano BitBoys

Harley.Net82 Profilo | Junior Member

Attendi un attimo...

Harley.Net82 Profilo | Junior Member

solo una delucidazione.
Cosa fa di preciso l' evento RowClick e da dove lo chiami?

Harley.Net82 Profilo | Junior Member

Comunque io alle 14.30 devo uscire...
nel caso non fai in tempo a rispondermi ti posto in pezzettino di codice...

magari non è questo, cmq ecco

anzichè

msgbox ("Hai selezionato la label " & Sender.name)

devi fare:

msgbox ("Hai selezionato la label " & Ctype(Sender,Label).name)

Ghitano Profilo | Newbie

nel form quando faccio click sulla label creata dentro in PanelCustom
dal form se seleziono nel codice il controllo PanelCustom1
tra gli eventi vedo RowClick
la dentro dovrei mettere msgbox("Controllo " & sender.name)
Ghitano BitBoys

Harley.Net82 Profilo | Junior Member

Quindi va bene l' uso del Ctype che ti ho mostrato nell' ultimo post ?

Harley.Net82 Profilo | Junior Member

Sto scappando, se vuoi ci sentiamo stasera.

Ciao

Ghitano Profilo | Newbie

Grazie comunque, Ho risolto, Evviva!!!!


l'obiettivo era:
inserendo un controllo tipo Panel chiamato PanelCustom in un form, e creando nel panel tramite una proprietà Rows() un numero imprecisato di label a runtime dentro al PanelCustom, riuscire a gestire un nuovo evento di nome RowClick per intercettare l'evento click su uno dei label creati
in pratica:
Private Sub PanelCustom1_RowClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles BasePane1.RowClick
MsgBox("Hai selezionato la Label " & sender.Name)
End Sub


Ho risolto in questo modo:
Inserendo dentro la classe del controllo PanelCustom il seguente codice

Public Event RowClick(ByVal sender As Object, ByVal e As EventArgs)

public sub Addlabel
dim MyLabel as Label
With MyLabel
.Name = "LabDesc1"
.Location = New System.Drawing.Point(10 + 3 + ImgList.ImageSize.Width, x * (ImgList.ImageSize.Height + 10) + _INIzio)
.Text = "Ciao da Me"
AddHandler .Click, AddressOf _RowClick
End With
Me.Controls.AddRange(New System.Windows.Forms.Control() {MyLabel})
end sub

Protected Sub _RowClick(ByVal sender As Object, ByVal e As System.EventArgs)
RaiseEvent RowClick(sender, EventArgs.Empty)
End Sub

Grazie a tutti sperando che serva per altri

Harley.Net82 Profilo | Junior Member

L' errore deve essere qui

...AddressOf MyLabel_Click

magari il metodo MyLabel_Click non ha i parametri giusti.

Se non ti dispiace vorrei vedere 2 pezzi di codice;

1) devo vedere com' è scritta la Sub MyLabel_Click

2) genera l' evento MyLabel_Click (col classico doppio click sull' oggetto) e fammi vedere cosa scrive VB.

Vedrai che ci siamo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5