
Gighen1969 (Normal User)
Newbie
    
Messaggi: 7
Iscritto: 19/11/2013
|
ciao a tutti.
Partiamo! in una form mi sono costruito una routine che mi trova tutte le textbox e le combobox, e mi cancella il loro contenuto, eccola qui!
Codice sorgente - presumibilmente VB.NET |
For Each CasellaDiTesto As Control In Me.Controls If TypeOf CasellaDiTesto Is TextBox Then CasellaDiTesto.Text = "" End If For Each CasellaCombinata As Control In Me.Controls If TypeOf CasellaCombinata Is ComboBox Then CasellaCombinata.Text = ""
|
Poi ho pensato di poterla riutillizare in tutte le form dell'aplicazione, ma le mie conoscenze di vb.net sono alquanto scarse.
Per poterla riutilizzare, dovrei trasformarla in una function? e se si dovrei pure cambiare in Me.Controls?
Poi ancora: dove fisicamente scriverla per poi poterla richiamare all'interno del codice dove mi serve?
Vi ringrazio in anticipo e vi auguro una bella giornata! Ciao
|
|

GN (Member)
Guru
    
Messaggi: 772
Iscritto: 30/04/2011
|
Prima cosa: ti consiglio di modificare un po' il codice, perchè non c'è bisogno di ciclare per 2 volte tutti i controlli, ma basta farlo una volta sola:
Codice sorgente - presumibilmente VB.NET |
For Each Casella As Control In Me.Controls If TypeOf Casella Is TextBox Then CType(CasellaDiTesto, TextBox).Text = "" Else If TypeOf Casella Is ComboBox Then CType(CasellaDiTesto, ComboBox).Text = "" End If Next
|
(Ovvio, come prestazioni reali non guadagni niente, ma così il codice è più pulito). Detto questo, quello che chiedi si può fare in vari modi; va messo tutto in una sub, e poi si possono scegliere più strade. A mio parere un metodo semplice e abbastanza pulito è questo: fai una nuova classe con dentro questa sub dichiarata come shared (in modo che non devi dichiarare un oggetto ogni volta) che prende come parametro il form su cui eseguire l'operazione, che va sostituito a "me":
Codice sorgente - presumibilmente VB.NET |
Public class formUtility 'nome a caso, è solo un esempio Public Shared Sub cancellaCaselle(ByRef frm As Form) For Each Casella As Control In frm.Controls If TypeOf Casella Is TextBox Then CType(CasellaDiTesto, TextBox).Text = "" Else If TypeOf Casella Is ComboBox Then CType(CasellaDiTesto, ComboBox).Text = "" End If Next End Sub End Class
|
Poi, quando in un form hai bisogno di eseguirla, basta che chiami la funzione passando il form stesso come parametro
Codice sorgente - presumibilmente Plain Text |
formUtility.cancellaCaselle(Me)
|
|
|

Gighen1969 (Normal User)
Newbie
    
Messaggi: 7
Iscritto: 19/11/2013
|
Per comiciare Grazie della risposta!
credo, ma non ne sono certo che ci sia un'errore di battitura
in Ctype(Casella, textBox) bhe poca roba!
Codice sorgente - presumibilmente VB.NET |
Public class formUtility 'nome a caso, è solo un esempio Public Shared Sub cancellaCaselle(ByRef frm As Form) For Each Casella As Control In frm.Controls If TypeOf Casella Is TextBox Then CType(CasellaDiTesto, TextBox).Text = "" Else If TypeOf Casella Is ComboBox Then CType(CasellaDiTesto, ComboBox).Text = "" End If Next End Sub End Class
|
sicuramente il codice è piu snello evitando di ciclare per 2 volte!
a questo proposito posterei altre routine per verificare se si puo (sicuramente) migliorare dal punto di vista del codice
P.S. Perchè hai inserito il Ctype dopo il Typeof?
Ultima modifica effettuata da Gighen1969 il 20/11/2013 alle 14:46 |
|

GN (Member)
Guru
    
Messaggi: 772
Iscritto: 30/04/2011
|
Si scusa l'errore, ho cambiato il nome della variabile e poi non ho cambiato dopo xD.
Mettere il ctype mi è venuto spontaneo, non so se funzionava anche senza, a me pare di ricordare che sia necessario per poter accedere alla proprietà text che hanno gli oggetti textbox e combobox ma non l'oggetto control da cui derivano.
|
|

Gighen1969 (Normal User)
Newbie
    
Messaggi: 7
Iscritto: 19/11/2013
|
Funziona in entrabi i casi.
E visto che ci siamo posto un'altra routine che uso come controllo su delle TextBox numeriche
Codice sorgente - presumibilmente VB.NET |
Private Sub PressioneTasto(sender As Object, e As System.Windows.Forms.KeyEventArgs) If e.KeyCode = 13 Then e.Handled = True SendKeys.Send("{TAB}") End If If txtCognome.Text <> "" Then cmdSalva.Enabled = True cmdAnnulla.Enabled = True End If Dim NumeroTextBox As Integer = sender.TabIndex Select Case NumeroTextBox Case 4, 5 Select Case e.KeyCode Case 45 To 58, 96 To 105 TastoValido = True Case Keys.Back = True TastoValido = True Case Keys.Space TastoValido = True Case Else TastoValido = False End Select End Select End Sub
|
poi nelle TextBox che mi serve controllare inserisco
Codice sorgente - presumibilmente VB.NET |
Private Sub txtTelefonoUfficio_KeyPress(sender As Object, e As KeyPressEventArgs) If TastoValido = False Then e.Handled = True End Sub
|
Ora questo non è farina del mio sacco, ma ho trovato qua e la in internet, e funziona, poi sarebbe assai utile se possibile inserirle la routine pressioneTasto in una Sub Shared, ma mi perdo con i ByRif e ByVal! non ho ancora capito bene come usarli. |
|

GN (Member)
Guru
    
Messaggi: 772
Iscritto: 30/04/2011
|
ByVal passa il valore mentre ByRef il riferimento; in realtà questo vale per i dati primitivi (integer, boolean), mentre per gli oggetti viene semore passato il riferimento (vedi http://www.dotnetperls.com/byval-byref), quindi nel tuo caso non dovrebbe fare differenza, anche se il byref è più "elegante" perchè fa riferimento proprio a quell'oggetto e non a una sua copia.
Comunque secondo me per fare delle caselle che consentono di inserire solo numeri è più comodo il NumericUpDown.
Ultima modifica effettuata da GN il 20/11/2013 alle 20:06 |
|

Gighen1969 (Normal User)
Newbie
    
Messaggi: 7
Iscritto: 19/11/2013
|
Grazie per il link! ora me lo guardo, per le caselle ho scelto quella routine perchè sono numeri di telefono, e con numeric Up Dow non credo di saperle gestire.
|
|

Gighen1969 (Normal User)
Newbie
    
Messaggi: 7
Iscritto: 19/11/2013
|
Avrei anche un grosso problema con l'apertura e la scrittura nel database, posso continuare qui senza aprire un'altro trend?
|
|

GN (Member)
Guru
    
Messaggi: 772
Iscritto: 30/04/2011
|
Beh secondo me dato che si cambia argomento sarebbe opportuno se ne aprissi un'altro (p. s. si chiama thread (o topic), non trend)
|
|