[VB.NET] Bordo colorato attorno a qualunque controllo con focus

martedì 27 agosto 2013 - 19.10
Tag Elenco Tags  VB.NET  |  .NET 2.0  |  Windows 7  |  Visual Studio Express

plaguebreath Profilo | Junior Member

Salve, ho questo problema, in pratica vorrei in un form con al suo interno panel, tablecontrol, datagridview bottoni e textbox vari (controlli all'interno di altri controlli per intenderci) che se l'utente ha il focus mettiamo su una combobox essa mi venga cerchiata con un bordo rosso acceso. L'utente si sposta su una textbox (non read only ovviamente) e quella mi si borda di rosso.
Ho letto che se i controlli ad esempio sono inseriti all'interno di un panel basta gestire l'evento onpaint ed effettivamente così facendo funziona, ma se volessi fare una cosa che va bene per tutti i controlli senza gestire l'onpaint di ogni panel ? Ho provato ad esempio utilizzando il paint del form principale iterando tutti i controlli utilizzando ControlPaint.DrawBorder ma mi appaiono dei bordi dietro tutti gli altri controlli e a coordinate sbagliate (ovviamente perchè sono inseriti all'interno di altri table o panel) Grazie, spero di essere stato abbastanza chiaro e confido in un vostro aiuto

Vash Profilo | Junior Member

Salve,
io tempo fa avevo utilizzato queste righe di codice al Focus_Enter e Focus_Leave di ciascun controllo:
Public Sub Control_Enter(ByRef Ctrl As Control, ByRef BackCtrl As Control) Dim g As Graphics = BackCtrl.CreateGraphics() Dim Penna As New Pen(Color.Red, 2.0) g.DrawRectangle(Penna, New Rectangle(Ctrl.Location, Ctrl.Size)) Penna.Dispose() g.Dispose() Ctrl.BackColor = Color.Yellow End Sub Public Sub Control_Leave(ByRef Ctrl As Control, ByRef BackCtrl As Control) Dim g As Graphics = BackCtrl.CreateGraphics() Dim Penna As New Pen(SystemColors.Control, 2.0) g.DrawRectangle(Penna, New Rectangle(Ctrl.Location, Ctrl.Size)) Penna.Dispose() g.Dispose() Ctrl.BackColor = Color.White End Sub

Ai metodi passo come parametri il controllo da evidenziare e il controllo padre (il contenitore diciamo).

Spero possa essere utile.

plaguebreath Profilo | Junior Member

Grazie per la risposta, a dire il vero avevo pensato anche io una cosa simile, il mio discorso è che non vorrei scrivere codice all'interno dgli eventi on focus on leave di ogni controllo ma fare una cosa generica per x controlli che possono essere button o textbox dove l'utente può finire in fase di edit.

Vash Profilo | Junior Member

...capito!
purtroppo sulle WinForm non riesco ad aiutarti: dovessi farlo in WPF sarebbe una cosa molto più semplice!!

ciao

Vinsent Profilo | Senior Member

La cosa migliore è usare dei "controlli personalizzati" ma va fatto da subito perchè con il progetto già iniziato bisogna sostituire i controlli e correggere il codice.
Esempio di textbox:
Public Class TBox_bordata Inherits TextBox Private Sub Me_GotFocus() Handles Me.GotFocus Dim g As Graphics = Me.Parent.CreateGraphics Dim Penna As New Pen(Color.Red, 2.0) g.DrawRectangle(Penna, New Rectangle(Me.Location, Me.Size)) Penna.Dispose() g.Dispose() End Sub Private Sub Me_LostFocus() Handles Me.LostFocus Dim g As Graphics = Me.Parent.CreateGraphics Dim Penna As New Pen(SystemColors.Control, 2.0) g.DrawRectangle(Penna, New Rectangle(Me.Location, Me.Size)) Penna.Dispose() g.Dispose() End Sub End Class
Una volta aggiunta la classe e compilato il progetto nella casella degli strumenti si trova il controllo e si aggiunge alla form come gli altri.
Vedi tu se vale la pena sistemare il tutto....altrimenti usa un ciclo sui controlli della form e aggiungi i due eventi. Nel ciclo dovrai distinguere quali controlli aggiungere e quali no, sia dello stesso tipo o meno ma dipende da cosa vuoi fare.
Se non vuoi "bordare" un controllo puoi usare la proprietà Tag impostando una stringa, nell' esempio sotto io ho messo "SI bordo".
Esempio:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Se vuoi evitare di ciclare tutti i controlli e l' IF sul Tag puoi inserire i controlli in un ArrayList e ciclare questo.
Ciao

plaguebreath Profilo | Junior Member

Grazie era proprio quello che cercavo di fare io, sbagliavo nel omettere il sender.Parent.CreateGraphics !!! un errore banale, per il resto nel lost focus non posso lasciare semplicemente Refresh() ???

Vinsent Profilo | Senior Member

>Grazie era proprio quello che cercavo di fare io, sbagliavo nel
>omettere il sender.Parent.CreateGraphics !!! un errore banale,

capita....

>per il resto nel lost focus non posso lasciare semplicemente
>Refresh() ???

Penso di si, ricordati di fare riferimento al contenitore del controllo...
ciao
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5