Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Textbox multiple e scrittura dati in file txt
Forum - C# / VB.NET - Textbox multiple e scrittura dati in file txt

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


Messaggi: 13
Iscritto: 16/06/2012

Segnala al moderatore
Postato alle 9:01
Domenica, 19/08/2012
Ciao a tutti.
Passo subito al mio quesito.
Ambiente: VB.NET 2010
Ho 6 Textbox (textbox1, textbox2, ect...)
Ho un button che mi permette di salvare i dati che l'utente deve inserire nelle textbox.
Per evitare di scrivere lunghi pezzi di codice ho la necessità di creare un ciclo For To Next all'interno del quale deve gestire ogni singolo dato contenuto nelle caselle e scrivere lo stesso un un file txt.
In pratica l'utente inserisce in ogni casella un numero e il ciclo deve leggere i numeri e scriverli nel file.

Ho iniziato da poco e la confusione è massima, probabilmente quello che chiedo non si puo' fare in quanto il VBNET non consente di utilizzare l'indice delle textbox ed allora dovrebbe tornare utile la gestione degli eventi, gestione che ancora non conosco per niente.

Restando in attesa VI saluto cordialmente.


Antonio M. Grillo
PM Quote
Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 16:52
Lunedì, 20/08/2012
Ciao. Potresti fare un For Each txt As TextBox in NomeDelTuoForm
e per ogni TextBox che trova accodare in una stringa il testo per poi salvarlo.

Ma fa abbastanza schifo come soluzione, per non avresti controllo sull'ordine seguito per leggere dalle TextBox.

Di solito in questi scenari, ogni controllo è adibito all'input di una determinata informazione, per esempio txtNome, txtCognome, txtIndirizzo.
Quindi avrai sicuramente un numero ragionevole di controlli da cui prendere i dati uno per uno, e gestire questi dati singolarmente.


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM Quote
Avatar
ggaamm (Normal User)
Newbie


Messaggi: 13
Iscritto: 16/06/2012

Segnala al moderatore
Postato alle 19:25
Lunedì, 20/08/2012
Grazie Dedalux, la Tua soluzione potrebbe andar bene, perchè dici che fa schifo, io avevo pensato in una for to next, ma a quanto pare non si può più utilizzare in quanto nel vbnet 2010 ai controlli manca l'indice.

Il problema dell'ordine si risolve imponendo ad ogni textbox il focus alla casella ssiva.

Potresti farmi un esempio del for each di cui parlavi ?

Aggiungo che avevo pensato ad un array in fase di raccolta dei dati, visto che ho 6 caselle avevo pensato ad un array 2x3 che mi salvasse poi le informazione su un file txt.

Grazie anticipatamente.
Saluti Antonio


Antonio M. Grillo
PM Quote
Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 2:41
Venerdì, 24/08/2012
Quello che intendevo io era una cosa di questo tipo, se stai usando WinForms

Codice sorgente - presumibilmente VB.NET

  1. For Each txt As TextBox In Me.Controls
  2.     'quello che devi fare
  3. Next



però occhio, perchè non è come pensi tu: l'ordine con cui vengono ottenuti i controlli è quello con cui vengono creati a runtime, non quello definito dal tabindex.
Quindi per gestire l'ordine devi editare il file designer del form.

Ultima modifica effettuata da Dedalux il 24/08/2012 alle 2:42


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM Quote
Avatar
lupino (Normal User)
Newbie


Messaggi: 13
Iscritto: 21/07/2012

Segnala al moderatore
Postato alle 13:54
Lunedì, 03/09/2012
".....VBNET non consente di utilizzare l'indice delle textbox..."
Ni, ovvero non nel senso stretto della parola, modello VB6 per intenderci, in quanto i controlli in vb.net non riportano più la proprietà index.
Tale "mancanza" è comunque sorpassabilissima creando un array di controlli e facendo riferimento quindi al indice di tale array. Per capirci, con 6 textbox...
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim myTxtArray as textbox()
  2. myTxtArray = new textbox(6){txt1,txt2,txt3....}




www.energeticambiente.it  Il forum delle energie rinnovabili e dell'ambiente
PM Quote
Avatar
ggaamm (Normal User)
Newbie


Messaggi: 13
Iscritto: 16/06/2012

Segnala al moderatore
Postato alle 18:26
Martedì, 04/09/2012
Un saluto a tutti.

Per Dedalux:
certo è il tabindex che decide il passaggio alla casella successiva, però io avevo scritto un codice che comunque mi permetteva di avere ad ogni invio il passaggio alla casella successiva, vedi codice:
____________________________________________________________________________________
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress

        Dim KeyAscii As Short = Asc(e.KeyChar)
        If Not (Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar)) Then ' condizione che non permette l'inserimento di numeri decimali e caratteri di controllo
            e.Handled = True ' tutto il resto è vero, l'argomento "e" è vero
        End If

        If KeyAscii < 48 And KeyAscii <> 24 And KeyAscii <> 8 Then ' condizione che non permette l'inserimento di caratteri se non numeri che vanno dallo zero al nove
            KeyAscii = 0
        ElseIf KeyAscii > 57 Then
            KeyAscii = 0

        End If
        If (e.KeyChar = Chr(13)) Then ' condizione che permette di accettare l'invio dopo la digitazione del numero
            e.Handled = True
            TextBox2.Focus()
        End If
        ' permette di passare il focus alla textbox successiva
    End Sub
_________________________________________________________________________________


Per Lupino:
Io non ho una grande esperienza in quanto sto iniziando adesso a programmare, pertanto Vogliate perdonarmi nell'ipotesi in cui dica fesserie. Allora,

Dim myTxtArray as textbox()                    ' creo un array di tipo textbox () senza alcuna dimensione
myTxtArray = new textbox(6){txt1,txt2,txt3....}     ' posizione all'interno della variabile che ho appena creato 6 nuovi oggetti a runtime e poi tra parentesi graffe inserisco ogni singola textbox.

________________________________________________________________________________

Il mio progetto sperimentale prevede una form con delle textbox create nella form stessa, un button per salvare i contenuti delle textbox, per intenderci volevo creare una semplice registrazione di numeri del lotto, quindi una griglia formata da 5 (numeri) x 11 ruote; il mio progetto era solo su 6 caselle (3 numeri x 2 ruote) al fine di effettuare le prove.
Quindi nelle textbox inserisco i numeri, col tasto invio passo da una casella all'altra e poi per ultimo con il tasto salva vado a registrare in un file con estensione .txt tutta quanta l'estrazione.
Nel button volevo fare in modo che richiamando un array mi faceva con un semplice ciclo for to next (all'interno del quale ponevo la registrazione dei dati) tutto quanto in automatico.
es. di prova
1a ruota    12 23 43
2a ruota    34 22 11


Grazie per il Vs. aiuto, un po di pazienza.

Saluti Antonio.

Ultima modifica effettuata da ggaamm il 04/09/2012 alle 19:46


Antonio M. Grillo
PM Quote
Avatar
lupino (Normal User)
Newbie


Messaggi: 13
Iscritto: 21/07/2012

Segnala al moderatore
Postato alle 7:28
Giovedì, 06/09/2012
Ciao ggaamm,
si le tue osservazioni sono giuste eccetto una cosa, le txt non sono create a runtime ma normalmente.
Una domanda, il fine del tuo progetto è solamente propedeutico all'apprendimento del vb?
Chiarisco, un simile programma, con salvataggio in file txt, mal si presta, a mio parere, alla gestione di un quantitativo di dati pari a quelli da te ipotizzati (11 ruote * 5 numeri * n estrazioni) meglio sarebbe un database.
Ma tant'è, dunque, ritornando al tuo progetto ed svolgendolo su 11R*5N:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  2.  Dim Estrazioni As TextBox() = New TextBox(54) {txtR1_0, txtR1_1, txtR1_2, txtR1_3, txtR1_4,
  3.  txtR2_0, txtR2_1, txtR2_2, txtR2_3, txtR2_4, _
  4.  txtR3_0, txtR3_1, txtR3_2, txtR3_3, txtR3_4, _
  5.  .....
  6.  txtR11_0, txtR11_1, txtR11_2, txtR11_3, txtR11_4}
  7.  
  8.  for indx as int16=0 to 54
  9.       AddHandler Estrazioni(indx).KeyPress, AddressOf Filtro_Tasti
  10.  next
  11. End sub
  12.  
  13. Private Sub Filtro_Tasti(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
  14.         Dim KeyAscii As Short = Asc(e.KeyChar)
  15.         Dim indxTxt As Int16 = Array.IndexOf(Estrazioni, DirectCast(sender, TextBox)) 'Recupera l'indice del textbox evidenziato
  16.         If Not (Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar)) Then ' condizione che non permette l'inserimento di numeri decimali e caratteri di controllo
  17.             e.Handled = True ' tutto il resto è vero, l'argomento "e" è vero
  18.         End If
  19.  
  20.         If KeyAscii < 48 And KeyAscii <> 24 And KeyAscii <> 8 Then ' condizione che non permette l'inserimento di caratteri se non numeri che vanno dallo zero al nove
  21.             KeyAscii = 0
  22.         ElseIf KeyAscii > 57 Then
  23.             KeyAscii = 0
  24.  
  25.         End If
  26.         If (e.KeyChar = Chr(13)) Then ' condizione che permette di accettare l'invio dopo la digitazione del numero
  27.             e.Handled = True
  28.             if indxTxt<54 then Estrazioni(indxTxt+1).Focus()
  29.         End If
  30.         ' permette di passare il focus alla textbox successiva
  31.     End Sub



Chiedo scusa se ho fatto qualche errore ma sono mooooolto di fretta, ciao.


www.energeticambiente.it  Il forum delle energie rinnovabili e dell'ambiente
PM Quote
Avatar
ggaamm (Normal User)
Newbie


Messaggi: 13
Iscritto: 16/06/2012

Segnala al moderatore
Postato alle 19:26
Giovedì, 06/09/2012
Grazie Lupino, sei stato molto gentile e premuroso nel darmi supporto.

1)  Sono molto appassionato di lotto ed allora avevo pensato di farmi un programma per conto mio ed allora avendo fatto in passato (ai tempi del commodore 64) un po di basic allora ho pensato di studiare la nuova versione di visual basic, quindi programmazione ad oggetti, tutta un'altra cosa rispetto alla vecchia concezione del basic e del gwbasic;
     Mi hanno detto che utilizzare gli archivi txt è molto più agevole, anche se Ti devo dire che anche a me mi sembra strano. comunque il mio programma a parte l'archivio delle estrazioni dovrebbe effettuare dei calcoli tra le diverse estrazioni e creare apposite griglie visualizzate in una form.

2) Dim Estrazioni As TextBox() = New TextBox(54) {txtR1_0, txtR1_1, . . .  txtR11_4} = vuol dire:
    ' Dichiaro una variabile di tipo textbox senza indicare alcuna dimensione;
    Potevamo indicare già la dimensione ?
    ' = New TexBox(54) indica una nuova matrice costituita da 54 elementi e vengono indicati tutti quanti.
    perchè si devono indicare tutti ?

3) for indx as int16=0 to 54
      AddHandler Estrazioni(indx).KeyPress, AddressOf Filtro_Tasti
next
    ' Avvio un ciclo con variabile indx di tipo a 16 bit (possiamo anche indicare byte ? giusto ?) da 0 a 54
    ' AddHandler ha a che fare con gli eventi che non ho capito molto bene, mi spieghi il rigo ?

4) Capisco la Sub Filtro_Tasti che viene richiamata dal AddressOf ma non AddHandler

5) Non capisco Addhandler Estrazioni(indx).Keypress

6) Dim KeyAscii As Integer = Asc(e.KeyChar)
        Dim indxTxt As Integer = Array.IndexOf(Estrazioni, DirectCast(sender, TextBox)) 'Recupera l'indice del textbox evidenziato
   ' mi speghi queste due righe di codice ?

Forse Ti ho chiesto tanto, Ti ringrazio anticipatamente.

Saluti Antonio


Antonio M. Grillo
PM Quote
Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 8:35
Venerdì, 07/09/2012
Mentre attendi la risposta di Lupino, provo a chiarirti io, se non sono invadente.

2)
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim Estrazioni As TextBox()

prepari la variabile definendone il tipo, non il valore, che viene appunto settato dall'operatore '=' su una matrice da 55, che poi viene popolata utilizzando i controlli che hai già. Gli elementi del vettore vanno specificati nel momento in cui la classe viene istanziata.

3)
Testo quotato

possiamo anche indicare byte ? giusto ?

non capisco cosa intendi
    AddHandler non fa altro che iscrivere la procedura nel delegate dell'evento KeyPress. In pratica, quando l'evento viene scatenato, vengono richiamate tutte le procedure iscritte al delegato multicast. Per maggiori informazioni ti consiglio di leggere [url=http://totemslair.org/Guides/View.php?chapter=35]questo articolo del Totem.

4 e 5) Nel ciclo recupera una per una tutte le textbox nella matrice, utilizzando l'indice corrente Estrazioni(indice) e iscrive il filtro dei tasti nell'evento KeyPress di ognuna.

6) Nella prima riga salva in KeyAscii il valore numerico di e.KeyChar, che usa per distinguere se si tratta di un numero, una lettera o un simbolo.
Nella seconda riga utilizza la funzione statica IndexOf di Array che passando matrice e istanza di classe ritorna l'indice di tale istanza nella matrice. Per farlo fa l'unboxing del parametro sender (l'oggetto che ha scatenato l'evento) da object a textbox, per poi appunto passarlo alla funzione IndexOf().

Spero di essermi spiegato in modo chiaro. Semmai sono qua =)


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo