Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Routine riutilizzabili
Forum - C# / VB.NET - Routine riutilizzabili

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Gighen1969 (Normal User)
Newbie


Messaggi: 7
Iscritto: 19/11/2013

Segnala al moderatore
Postato alle 8:35
Mercoledì, 20/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

  1. For Each CasellaDiTesto As Control In Me.Controls
  2.             If TypeOf CasellaDiTesto Is TextBox Then
  3.                 CasellaDiTesto.Text = ""
  4.             End If
  5.  
  6.     For Each CasellaCombinata As Control In Me.Controls
  7.             If TypeOf CasellaCombinata Is ComboBox Then
  8.                 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

PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 14:07
Mercoledì, 20/11/2013
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

  1. For Each Casella As Control In Me.Controls
  2.             If TypeOf Casella Is TextBox Then
  3.                 CType(CasellaDiTesto, TextBox).Text = ""
  4.             Else If TypeOf Casella Is ComboBox Then
  5.                 CType(CasellaDiTesto, ComboBox).Text = ""
  6.             End If
  7. 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

  1. Public class formUtility 'nome a caso, è solo un esempio
  2.             Public Shared Sub cancellaCaselle(ByRef frm As Form)
  3.                    For Each Casella As Control In frm.Controls
  4.                          If TypeOf Casella Is TextBox Then
  5.                                 CType(CasellaDiTesto, TextBox).Text = ""
  6.                          Else If TypeOf Casella Is ComboBox Then
  7.                                 CType(CasellaDiTesto, ComboBox).Text = ""
  8.                          End If
  9.                    Next
  10.             End Sub
  11. 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

  1. formUtility.cancellaCaselle(Me)


PM Quote
Avatar
Gighen1969 (Normal User)
Newbie


Messaggi: 7
Iscritto: 19/11/2013

Segnala al moderatore
Postato alle 14:42
Mercoledì, 20/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

  1. Public class formUtility 'nome a caso, è solo un esempio
  2.                 Public Shared Sub cancellaCaselle(ByRef frm As Form)
  3.                        For Each Casella As Control In frm.Controls
  4.                              If TypeOf Casella Is TextBox Then
  5.                                     CType(CasellaDiTesto, TextBox).Text = ""
  6.                              Else If TypeOf Casella Is ComboBox Then
  7.                                     CType(CasellaDiTesto, ComboBox).Text = ""
  8.                              End If
  9.                        Next
  10.                 End Sub
  11.     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
PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 17:14
Mercoledì, 20/11/2013
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.

PM Quote
Avatar
Gighen1969 (Normal User)
Newbie


Messaggi: 7
Iscritto: 19/11/2013

Segnala al moderatore
Postato alle 17:31
Mercoledì, 20/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

  1. Private Sub PressioneTasto(sender As Object, e As System.Windows.Forms.KeyEventArgs)
  2.         If e.KeyCode = 13 Then
  3.             e.Handled = True
  4.  
  5.             SendKeys.Send("{TAB}")
  6.         End If
  7.  
  8.         If txtCognome.Text <> "" Then
  9.             cmdSalva.Enabled = True
  10.             cmdAnnulla.Enabled = True
  11.         End If
  12.  
  13.         Dim NumeroTextBox As Integer = sender.TabIndex
  14.  
  15.         Select Case NumeroTextBox
  16.             Case 4, 5
  17.                 Select Case e.KeyCode
  18.                     Case 45 To 58, 96 To 105
  19.                         TastoValido = True
  20.                     Case Keys.Back = True
  21.                         TastoValido = True
  22.                     Case Keys.Space
  23.                         TastoValido = True
  24.                     Case Else
  25.                         TastoValido = False
  26.  
  27.                 End Select
  28.         End Select
  29.  
  30.  
  31.     End Sub


poi nelle TextBox che mi serve controllare inserisco
Codice sorgente - presumibilmente VB.NET

  1. Private Sub txtTelefonoUfficio_KeyPress(sender As Object, e As KeyPressEventArgs)
  2.  
  3.         If TastoValido = False Then e.Handled = True
  4.     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.

PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 19:25
Mercoledì, 20/11/2013
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
PM Quote
Avatar
Gighen1969 (Normal User)
Newbie


Messaggi: 7
Iscritto: 19/11/2013

Segnala al moderatore
Postato alle 17:05
Giovedì, 21/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.

PM Quote
Avatar
Gighen1969 (Normal User)
Newbie


Messaggi: 7
Iscritto: 19/11/2013

Segnala al moderatore
Postato alle 18:10
Giovedì, 21/11/2013
Avrei anche un grosso problema con l'apertura e la scrittura nel database, posso continuare qui senza aprire un'altro trend?

PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 19:36
Giovedì, 21/11/2013
Beh secondo me dato che si cambia argomento sarebbe opportuno se ne aprissi un'altro (p. s. si chiama thread (o topic), non trend)

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo