Oppure

Loading
20/11/13 7:35
Gighen1969
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!
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
aaa
20/11/13 13:07
GN
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:
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":
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
formUtility.cancellaCaselle(Me)
aaa
20/11/13 13:42
Gighen1969
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!

    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 20/11/13 13:46
aaa
20/11/13 16:14
GN
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.
aaa
20/11/13 16:31
Gighen1969
Funziona in entrabi i casi.
E visto che ci siamo posto un'altra routine che uso come controllo su delle TextBox numeriche
 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
 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.
aaa
20/11/13 18:25
GN
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 dotnetperls.com/…), 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 20/11/13 19:06
aaa
21/11/13 16:05
Gighen1969
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.
aaa
21/11/13 17:10
Gighen1969
Avrei anche un grosso problema con l'apertura e la scrittura nel database, posso continuare qui senza aprire un'altro trend?
aaa