Controllo Personalizzato

mercoledì 16 luglio 2008 - 17.52

gabriel81 Profilo | Junior Member

Ciao a tutti, sto sclerando..
Mi spiego:
sto scrivendo una piccola applicazione e (siccome mi ritrovo a scrivere sempre lo stesso tipo di comandi in ogni form) ho pensato di creare dei controlli personalizzati.
Faccio un esempio per illustrare:
Inizialmente inserivo nel form un Datagridview e lo popolavo mediante:

Dim adapt As New OleDb.OleDbDataAdapter(query, My.Settings.AccessConnectionString)
Dim Dt as new Datatable
adattatore.Fill(Dt)
Me.Datagrid1.Datasource = Dt

Ora ho pensato che sarebbe meglio creare una mia Datagridview che abbia un metodo tipo "AggiornaDati(SQL)" in maniera da ridurre le righe di codice che diventerebbero:
Me.Datagrid1.AggiornaDati("SELECT * FROM TABELLA")

Per ottenere questo risultato ho aggiunto un nuovo controllo personalizzato chiamato Griglia.vb contenente una Datagridview ancorata al controllo padre.
Dopo aver compilato mi è comparso nella barra delle applicazioni e ho cominciato ad utilizzarla.

Vi posto il codice:

Public Class Griglia

Public Overloads Sub AggiornaDati(ByVal Query)
Dim dt As New DataTable
Dim db As New dB ' **************** db è una mia classe
db.FillDt(Query)
Me.Datagrid.DataSource = db.Dt
End Sub

Public Overloads Sub AggiornaDati(ByVal Query As String, ByVal HideKey As Boolean)
Dim dt As New DataTable
Dim db As New dB
db.FillDt(Query)
Me.Datagrid.DataSource = db.Dt
If HideKey = True Then
Me.Datagrid.Columns(0).Visible = False
End If
End Sub

La popolazione funziona benissimo, però non riesco assolutamente a vedere gli eventi del mio datagridview dal form.
Vedo solo gli eventi del Controllo "Griglia" ma non quelli del datagrid1 presente al suo interno...
Spero di aver reso l'idea.
Come faccio ad accedere a quegli eventi?
Oppure, la strada che ho seguito è quella corretta oppure ci sono modi migliori per ottenere lo stesso risultato?


Grazie 1000 ragazzi

End Class

alexmed Profilo | Guru

Ciao,
Spero ti possa essere utile.

http://blogs.dotnethell.it/alebadalin/GESTIONE-ACCESSI-AL-DATABASE-SEMPLIFICATA__11536.aspx

gabriel81 Profilo | Junior Member

Grazie per il link, l'ho letto , ma quell'articolo riguarda l'uso dei database.
Io ho bisogno di capire come creare contrlli personalizzati, indipendentemente daòll'uso o ono dei db.
in pratica nuove versioni di ciò che si vede nella barra dei controlli a sinistra in visual studio che hanno metodi miei studiati ad ok per le mie applicazioni.

rossimarko Profilo | Guru

>La popolazione funziona benissimo, però non riesco assolutamente
>a vedere gli eventi del mio datagridview dal form.
>Vedo solo gli eventi del Controllo "Griglia" ma non quelli del
>datagrid1 presente al suo interno...
>Spero di aver reso l'idea.
>Come faccio ad accedere a quegli eventi?
>Oppure, la strada che ho seguito è quella corretta oppure ci
>sono modi migliori per ottenere lo stesso risultato?

Ciao,

dalla form vedi solamente gli eventi del controllo che stai ospitando, e quindi in questo caso il controllo griglia, non dei controlli contenuti.
Se vuoi esporre gli eventi dovrai farlo tu a mano, e quindi nel tuo controllo griglia dovrai creare degli eventi personalizzati che verranno generati quando si scatena l'evento del datagrid cotenuto. In pratica ogni volta che intercetti un'evento del datagrid dovrai lanciare (RaiseEvent) il tuo evento personalizzato.

In alternativa puoi fare una classe che eredita dalla datagrid, e in questo caso erediterà tutti i metodi, proprietà ed eventi e tu potrai aggiungere i tuoi metodi per personalizzare il comportamento. Se il tuo controllo deve contenere solo la griglia io ti consiglio di implementare questa seconda soluzione.

Puoi cominciare creando una classe del tipo:

Public Class Griglia Inherits System.Windows.Forms.DataGridView Public Sub MiaFunzione() 'Codice di esempio Me.DataSource = New DataTable() End Sub End Class


-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

gabriel81 Profilo | Junior Member

Grazie per la risposta!
A dire il vero la mia prima idea è stata quella di creare una classe come quella che mi hai proposto tu.
Poi facevo così: inserivo nel form una datagrid normale e dopo andavo nel file designer dove viene dichiarato il controllo appena inserito e cambiavo la voce

Me.DataGridView1 = New System.Windows.Forms.DataGridView

in

Me.DataGridView1 = New MiaGriglia

...non ti dico i casini che ne uscivano!

Il fatto è che creando la classe come mi hai consigliato dovrò inserire i vari datagrid da codice, quindi senza vederli in progettazione form, vero?

rossimarko Profilo | Guru

>Il fatto è che creando la classe come mi hai consigliato dovrò
>inserire i vari datagrid da codice, quindi senza vederli in progettazione
>form, vero?

No, una volta creato da codice la tua datagridview personalizzata la vedi comunque nella form e poi la puoi gestire normalmente.

Fai una prova su una form vuota, apri la classe del designer, inserisci la dichiarazione della variabile di tipo Griglia e nell'InitializeComponent crei l'istanza. Alla fine salva il tutto. Una volta fatto questo, aprendo il designer della winform, vedrai la tua griglia come una datagridview normale, con tutte le sue funzionalità.

Se ti serve prova a seguire questi semplici passi: http://www.thescarms.com/dotnet/DeriveGrid.aspx

-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

gabriel81 Profilo | Junior Member

Cioè, in pratica mia hai cambiato la vita!!

Grazie 1000

posso chiederti un ultima cosa?

E' possibile passare ai metodi del mio nuovo controllo un haldles?
Ovvero fare in modo che di default quando si scatena un evento il controlle esegue del codice...

(Non sono matto, è solo per scrivere più codice all'inizio per poi andare più veloce in fase di creazione forms!!!!)

Grazie ancora

rossimarko Profilo | Guru

>
>E' possibile passare ai metodi del mio nuovo controllo un haldles?
>Ovvero fare in modo che di default quando si scatena un evento
>il controlle esegue del codice...
>

Scusa ma non ho capito.. Se ti serve passare un riferimento ad un metodo puoi usare i delegate (http://msdn.microsoft.com/it-it/library/system.delegate.aspx), ma non so se è quello che ti serve.
Eventualmente prova a postare un pezzo di codice di quello che ti piacerebbe fare...
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

gabriel81 Profilo | Junior Member

Ci sono arrivato da solo!!
quello che intendevo era questo:


Public Class CampoTesto
Inherits System.Windows.Forms.TextBox
Public Sub aFuoco(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.GotFocus
Me.BackColor = Color.Beige
End Sub
Public Sub Non_a_Fuoco(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LostFocus
Me.BackColor = Color.White
End Sub
End Class


Queando uso questo controllo si comporta in automatico allo scatenarsi degli eventi..
Grazie 1000 ancora, ciao e alla prossima
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