Aggiungere righe ad una tabella e prendere i dati da TextBox + Salvata...

giovedì 21 ottobre 2010 - 21.49
Tag Elenco Tags  VB.NET

FaN7aSy Profilo | Newbie

Buonasera,
Vorrei creare un piccolo programma composto da un form principale con una tabella con tre colonne. Le righe le voglio aggiungere tramite un secondo form dove digito i valori delle colonne. Le colonne sono 3: Canzone, Autore, Strumento e nel form AggiungiCanzone.vb ci sono 2 textbox e una combobox che corrispondono alle tre colonne. Adesso vorrei inserire questi dati dal form AggiungiCanzone.vb a una nuova riga della tabella del form principale.
Tutti i dati dovrebbero essere salvati da qualche parte, avevo pensato ad un file di testo con le varie voci divise da una virgola o da un punto e virgola.
Per maggiore chiarezza vi aggiungo questo screen di come vorrei che fosse l'applicazione, più o meno.


618x390 42Kb



Sono davvero alle prime armi nel campo della programmazione, quindi chiedo cortesemente di spiegare tutti i termini tecnici che userete nelle risposte, altrimenti non capirò niente :(

P.S.: Scusate il titolo troppo lungo e poco chiaro, ma non sapevo cosa chiedere di preciso...
Rino Gaetano Regna Sovrano!

AntCiar Profilo | Expert

Ciao.

Iniziamo dalla form AggiungiCanzone.vb:

All'interno della form devi inserire delle Property in modo da poter passare e leggere i dati inseriti nella form. Per fare le property si fa così:

Public Property Titolo as String
Get
return Me.TextBox1.Text
End Get
Set(ByVal value As String)
me.TextBox1.Text = value
End Set
End Property

Creati le tue tre proprietà nella form usando questo blocco di codice.

poi per gestire la form di inserimento, nella form principale fai questo nell'evento click del bottone aggiungi:

Dim AddCanzone as AggiungiCanzone = new AggiungiCanzone()
if AddCanzone .ShowDialog(me) = DialogResult.Ok Then

Dim riga as DataRow = XXXXXX.NewRow (XXXXXX è il nome dell'oggetto tabella che hai nella form principale)
riga("Titolo") = AddCanzone.Titolo
riga("Autore") = AddCanzone.Autore
riga("RigaStrumento") = AddCanzone.Strumento
XXXXXX.Rows.Add(riga)
end if


per ora ferminamoci qua e prova a fare quanto detto sopra.
So che se sei alle prime armi puo risultare difficile anche perchè non si tratta di trovare un errore ma fare una intera applicazione e da un forum risulta un po difficile.

ciao ciao
Cristian Barca

FaN7aSy Profilo | Newbie

La prima parte l'ho capita. Infatti non ho nessun problema.

Nella seconda parte invece ho un problema: mi dice che "NewRow non è un membro di System.Windows.Forms.DataGridView" e forse ho capito anche il perchè. Perchè appunto io uso una DataGridView come tabella ma a quanto pare non è l'oggetto giusto. Cercando su internet ho letto delle DataTable e credo che sia quello l'oggetto giusto (CREDO). Mi potresti dire come crearne una visto che nella tabella strumenti non c'è?

Grazie
Gianmarco
Rino Gaetano Regna Sovrano!

AntCiar Profilo | Expert

Ciao.

Dal tuo messaggio ho capito male. Quindi sulla tua form principale hai una DataGridView. A questa dataGridView hai associato una tabella?
Me.DataGridView.DataSource = me.Tab......

Se si, allora il NewRow() lo devi fare sullo'ggetto passato come datasource

Me.Tabxxxxx.NewRow()

Stessa cosa per l'add.

Cristian Barca

FaN7aSy Profilo | Newbie

No io non ho impostato niente come source perchè non sò come fare :( Potresti illuminarmi, per favore?

Grazie
Gianmarco


Rino Gaetano Regna Sovrano!

AntCiar Profilo | Expert

Ti ho allegato al messaggio un piccolo progetto in cui faccio quello che a te serve perchè altrimenti ad andare avanti a messaggi sul forum non si arrivava più.

Manca solo la form per l'inserimento delle righe. La principale è Form1 mentre trovi anche una Form2 che dovrebbe essere sostituita dalla tua form per l'inserimento delle righe. Se provi il progetto quando tenti di aggiungere una riga, ti darà sempre gli stessi valori.

Dai una occhiata al codice e implementalo nel tuo progetto.


Cristian Barca

FaN7aSy Profilo | Newbie

Grazie 1000 della tua disponibilità :) Ho aperto il progetto e lo sto cominciando a capire... Adesso ti volevo chiedere se è possibile fare in modo che quando chiudo il programma senza salvare lui mi dice che i progressi non salvati andranno persi. Come potrei fare?
Rino Gaetano Regna Sovrano!

AntCiar Profilo | Expert

Ciao.
Usa questa sub per verificare. Praticamente la cosa funziona così:

quando fai aggiunte, modifiche, eliminazioni su una tabella, la riga interessata viene marcata con un marcatore a seconda dell'azione fatta.
Quando invochi la funzione di salvataggio viene invocato "AcceptChange()". questo elimina tutti i marcatori di riga.
Nella Sub sottostante controllo se esistono righe con marcatori particolari. Se esistono vuol dire che non hai fatto salva.


Private Sub verificaDati() Dim notSave As Boolean = False Dim DV As DataView = New DataView(Me.TabDati) DV.RowStateFilter = DataViewRowState.Added If DV.Count > 0 Then notSave = True End If DV.RowStateFilter = DataViewRowState.ModifiedCurrent If DV.Count > 0 Then notSave = True End If DV.RowStateFilter = DataViewRowState.Deleted If DV.Count > 0 Then notSave = True End If If notSave = True Then MsgBox("Il documento non salvato") End If End Sub
Cristian Barca

FaN7aSy Profilo | Newbie

Perfetto! Grazie! Adesso lavoro un po' su tutte le informazioni che mi hai fornito. Appena finisco e vorrò implementare altre funzioni nel programma ti disturberò ancora :)

Grazie della disponibilità
A presto

Gianmarco


Rino Gaetano Regna Sovrano!

FaN7aSy Profilo | Newbie

Ho incontrato subito un problema: Sto provando a mettere la richiesta di salvataggio quando si chiude l'applicazione e il tuo codice l'ho inserito nell' evento FormClosing. Però qualunque sia la risposta al MessageBox (Salva, non salvare, Annulla) il programma si chiude. Come posso far scegliere all'utente cosa fare? Vorrei che il programma facesse come fa il Blocco Note. Come posso fare?

Grazie Infinite.
Gianmarco


Rino Gaetano Regna Sovrano!

AntCiar Profilo | Expert

e.Cancel = True quando vuoi che la form non si deve chiudere
Cristian Barca

FaN7aSy Profilo | Newbie

Mi dice:

'e' non dichiarato. Non è accessibile a causa del livello di protezione.

Come posso risolvere?


Gianmarco


Rino Gaetano Regna Sovrano!

AntCiar Profilo | Expert

ma l'hai inserito all'interno dell'evento?
forse lo hai messo direttamente nella sub di verifica. Modifica la sub in funzione e fatti restituire il valore in booleano.


Private Function verificaDati() as Boolean Dim notSave As Boolean = False Dim DV As DataView = New DataView(Me.TabDati) DV.RowStateFilter = DataViewRowState.Added If DV.Count > 0 Then notSave = True End If DV.RowStateFilter = DataViewRowState.ModifiedCurrent If DV.Count > 0 Then notSave = True End If DV.RowStateFilter = DataViewRowState.Deleted If DV.Count > 0 Then notSave = True End If If notSave = True Then MsgBox("Il documento non salvato") End If return notSave End Function


Poi nell'evento Form_Closing scrivi questo:

e.Cancel = verificaDati()
Cristian Barca

FaN7aSy Profilo | Newbie

Così funziona ma non è proprio quello che volevo. Io volevo che se provo a chiudere il programma quando le modifiche non sono state salvate, il programma mi chieda se salvarle (e chiudere l'applicazione), non salvarle (e chiudere l'applicazione), e non salvare (e mantenere aperta l'applicazione). Come devo fare?

Grazie
Gianmarco
Rino Gaetano Regna Sovrano!

AntCiar Profilo | Expert

al posto di MsgBox("Il documento non è salvato") sostituisci quanto segue:

Dim res As DialogResult = MsgBox("Il documento non è stato salvato. Salvare il documento?", MsgBoxStyle.YesNoCancel, "ATTENZIONE!!!")
If res = Windows.Forms.DialogResult.Yes Then 'Esce e salva
Me.SalvaDati()
notSave = False
ElseIf res = Windows.Forms.DialogResult.No Then 'Esce senza salvare
notSave = False
ElseIf res = Windows.Forms.DialogResult.Cancel Then 'Non esce e non salva
notSave = True
End If
Cristian Barca

FaN7aSy Profilo | Newbie

Adesso è perfetto :) Un ' altra idea che mi era venuta in mente era la possibilità di eliminare la riga selezionata premendo un pulsante, o di modificarla premendone un altro. Però non sò da dove cominciare... Potresti aiutarmi anche qui?

Grazie ancora
Gianmarco


Rino Gaetano Regna Sovrano!

AntCiar Profilo | Expert

la modifica la puoi fare direttamente nella cella della datagrid e anche l'eliminazione con il tasto canc della riga selezionata.
Cristian Barca

FaN7aSy Profilo | Newbie

Hai ragione... avevo disabilitato quella funzione ma ora che ci ho pensato la ri aggiungo.

Comunque c'è un piccolo problema: se io apro il programma e senza modificare o aggiungere niente lo chiudo mi chiede sempre se voglio salvare il documento e qualsiasi pulsante clicco il programma si chiude. Questo avviene anche se carico un database e poi chiudo il programma senza modificare niente. Come posso evitarlo?

Gianmarco
Rino Gaetano Regna Sovrano!

AntCiar Profilo | Expert

>Hai ragione... avevo disabilitato quella funzione ma ora che
>ci ho pensato la ri aggiungo.
>
>Comunque c'è un piccolo problema: se io apro il programma e senza
>modificare o aggiungere niente lo chiudo mi chiede sempre se
>voglio salvare il documento

Nella sub 'CaricaFile' prima di Me.Datagridview1.datasource = me.tabdati aggiungi Me.TabDati.AcceptChange()

e qualsiasi pulsante clicco il programma
>si chiude.

questo è strano. E dovuto alla funzione VerificaDati che restituisce FAlse. Occorre che tu controlli in Debug i vari passi della VerificaDati e vedere quello che succede.

Questo avviene anche se carico un database e poi chiudo
>il programma senza modificare niente. Come posso evitarlo?
>

ciao

Cristian Barca

FaN7aSy Profilo | Newbie

Ciao.

Ho continuato a lavorare sul programma e comincia ad essere carino. Adesso mi sono venute in mente due cose:

1. Vorrei fare in modo che invece di poter sempre modificare i campi semplicemente cliccandoci, vorrei che ci fosse un pulsante che mi permette di modificare la riga selezionata. Cliccando su questo pulsante mi apre la finestra Aggiungi Canzone con i dati attuali della riga, e qui l'utente modifica quello che vuole e poi lo salva.

2. Vorrei aggiungere una colonna con un pulsante, che cliccandoci mi apre un file .txt oppure .pdf. I file potrebbero essere salvati in una sottocartella della cartella di installazione.

Spero di essere stato chiaro nella spiegazione della situazione. In entrambi i casi non sò da dove cominciare e quindi mi appello alla tua gentilezza e chiarezza nel trovarmi la soluzione adatta.

EDIT: Mi stavo dimenticando un' altra idea che mi era venuta: Vorrei che alcuni campi del form Aggiungi Canzone diventino obbligatori. Nel caso in cui l'utente non li inserisca il programma dovrebbe restituire un msgbox e mantenere il form aperto senza aggiungere la riga.

Grazie ancora,
Gianmarco


Rino Gaetano Regna Sovrano!

AntCiar Profilo | Expert

>Ciao.

Ciao.

>Ho continuato a lavorare sul programma e comincia ad essere carino.
>Adesso mi sono venute in mente due cose:
>
>1. Vorrei fare in modo che invece di poter sempre modificare
>i campi semplicemente cliccandoci, vorrei che ci fosse un pulsante
>che mi permette di modificare la riga selezionata. Cliccando
>su questo pulsante mi apre la finestra Aggiungi Canzone con i
>dati attuali della riga, e qui l'utente modifica quello che vuole
>e poi lo salva.
>

Guarda un po tra i metodi della DatagridView e vedi che la risposta sta "sotto gli occhi".
Poi per gestire la form di modifica non è altro che fare la stessa cosa dell'aggiunta righe con una piccola aggiunta di codice per valorizzare i campi sulla form con le informazioni prese dalla datagridview.

>2. Vorrei aggiungere una colonna con un pulsante, che cliccandoci
>mi apre un file .txt oppure .pdf. I file potrebbero essere salvati
>in una sottocartella della cartella di installazione.

Anche qui la soluzione ce l'hai gia. Nello stesso modo con cui aggiungo le colonne all'oggetto TabDati.
Per quanto riguarda la selezione dei file, hai già un pezzo di codice (vedi funzione LeggiFile)


>Spero di essere stato chiaro nella spiegazione della situazione.
>In entrambi i casi non sò da dove cominciare e quindi mi appello
>alla tua gentilezza e chiarezza nel trovarmi la soluzione adatta.

Noi del forum siamo sempre qua e quando possiamo e abbiamo le conoscenze richieste dal thread, rispondiamo.
nel tuo caso specifico in relazione a quest'ultimo messaggio hai tutte le basi e il codice per poter procedere.

>EDIT: Mi stavo dimenticando un' altra idea che mi era venuta:
>Vorrei che alcuni campi del form Aggiungi Canzone diventino obbligatori.
>Nel caso in cui l'utente non li inserisca il programma dovrebbe
>restituire un msgbox e mantenere il form aperto senza aggiungere
>la riga.

Anche qua hai gia quello che ti serve. Basta controllare che i campi che devono essere oobligatori, quando fai "Ok" sulla form di inserimento,
SE sono in un certo valore, non chiudi la form e avvisi l'utente, ALTRIMENTI chiudi la form e inserisci il dato.


>Grazie ancora,
>Gianmarco

Di niente
Cristian Barca

FaN7aSy Profilo | Newbie

Per la verifica dei campi inseriti ho usato questo codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

C'è solo un problema: se non inserisco l'anno non mi visualizza il testo "anno sconosciuto" come invece dovrebbe. Nel campo Album, lo stesso codice funziona bene. Da cosa dipende? Secondo me dal fatto che la combobox non permette di scriverci dentro... Ma come posso ovviare a questo problema lasciando la combobox invariata?

EDIT: Per la modifica della riga selezionata non ci riesco... Ho creato un nuovo form ModificaCanzone.vb identico a AggiungiCanzone.vb ma adesso non sò come prendere la riga selezionata e come inserire i campi dalla datagridview alle varie textbox o combobox. Un aiutino? :)

Grazie,
Gianmarco



Rino Gaetano Regna Sovrano!

AntCiar Profilo | Expert

>Per la verifica dei campi inseriti ho usato questo codice:
>
>
>Private Sub btnAggiungi_Click(ByVal sender As System.Object,
>ByVal e As System.EventArgs) Handles btnAggiungi.Click
> If txtTitolo.Text = "" Then
>MsgBox("Inserisci il titolo!", MsgBoxStyle.Exclamation)
>Me.DialogResult = Windows.Forms.DialogResult.None
> ElseIf txtAutore.Text = "" Then
>MsgBox("Inserisci l'autore!", MsgBoxStyle.Exclamation)
>Me.DialogResult = Windows.Forms.DialogResult.None
> ElseIf comboStrumento.Text = "" Then
>MsgBox("Inserisci lo strumento!", MsgBoxStyle.Exclamation)
>Me.DialogResult = Windows.Forms.DialogResult.None
> ElseIf txtAlbum.Text = "" Then
> txtAlbum.Text = "Album Sconosciuto"
> Me.DialogResult = Windows.Forms.DialogResult.OK
> ElseIf comboAnno.Text = "" Then
> comboAnno.Text = "Anno Sconusciuto"
> Me.DialogResult = Windows.Forms.DialogResult.OK
> Else
> Me.DialogResult = Windows.Forms.DialogResult.OK
> End If
> End Sub

Io toglierei tutti i 'Me.DialogResult = Windows.Forms.DialogResult.None'. Come fai tu, se manca qualcosa chiudi la form e sicuramente dopo la fai riaprire. A che serve tutto questo giro? Se manca qualcosa dai il messaggio e basta, senza dare il dialogResult

>
>C'è solo un problema: se non inserisco l'anno non mi visualizza
>il testo "anno sconosciuto" come invece dovrebbe. Nel campo Album,
>lo stesso codice funziona bene. Da cosa dipende? Secondo me dal
>fatto che la combobox non permette di scriverci dentro... Ma
>come posso ovviare a questo problema lasciando la combobox invariata?

In quest caso io farei i controlli a priori. Togli il blocco relativo ad 'Anno' e 'Album' dalla serie di If -- ElseIf e prima di fare tutti i controlli li metti come IF separati:

If txtAlbum.Text = "" Then
txtAlbum.Text = "Album Sconosciuto"
end if

If comboAnno.Text = "" Then
comboAnno.Text = "Anno Sconusciuto"
End if

>EDIT: Per la modifica della riga selezionata non ci riesco...
>Ho creato un nuovo form ModificaCanzone.vb identico a AggiungiCanzone.vb

Non serve creare una nuova form. Hai già una form che ti permette l'inserimento di una nuova riga. Questa form ha delle property che ti permettono di leggere e scrivere i valori.

nell'inserimento avevi fatto questo:

Dim f2 as AggiungiCanzone = new AggiungiCanzone()
if AggiungiCanzone.ShowDialog() = DialogResult.Ok
....
.....
end if

Ora basta fare questo

Dim f2 as AggiungiCanzone = new AggiungiCanzone()
f2.Titolo = "............"
f2.Autore = "............"
f2.Anno = "............."
........
........
.......
if AggiungiCanzone.ShowDialog() = DialogResult.Ok
....
.....
end if

>ma adesso non sò come prendere la riga selezionata

per ottenere il valore nella riga selezionata basta fare
me.DataGridView1.Item("nome della colonna", me.DataGridView1.CurrentRow.Index).Tostring


Cristian Barca
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5