PDA

View Full Version : [VB.NET 2010] Associare Textbox a Cella Datagrid


Ludo237
07-12-2010, 19:17
Rieccomi :D :ciapet:
Dopo 4 giorni passati a risolvere un bug di crossthreading e di Connessione ai DB mi ritrovo davanti ad un ostacolo dettato dalla mia inesperienza su *.NET (1 mese circa che ci "smanetto")
in poche parole io ho una datagrid ben costruita (tutta tramite codice , postato sotto) e vorrei riempire il campo di una textbox con il valore selezionato (tramite mouse) dal datagrid , in modo tale da poterlo modificare


'Impostiamo la connessione all avvio del form
DataAdapter.SelectCommand = New OleDbCommand()
'Credo la connessione al comando
DataAdapter.SelectCommand.Connection = Connessione
'Creo la Query
DataAdapter.SelectCommand.CommandText = "SELECT * FROM email"
DataAdapter.SelectCommand.CommandType = CommandType.Text
'Apro la Connessione con il Database
Connessione.Open()
'Inserisco le intestazioni nel dataset
DataAdapter.Fill(DataSet, "email")
'Chiudo la connessione con il Database
Connessione.Close()
'Creo i dati in Gridview
DataGridView1.AutoGenerateColumns = True
DataGridView1.DataSource = DataSet
DataGridView1.DataMember = "email"
'Modifico qualche proprietà di visualizzazione del DataGridView
Dim ColoreAlternatoCelle As New DataGridViewCellStyle()
ColoreAlternatoCelle.BackColor = Color.WhiteSmoke
DataGridView1.AlternatingRowsDefaultCellStyle = ColoreAlternatoCelle
DataGridView1.Columns(0).HeaderText = "ID Univoco E-Mail"
DataGridView1.Columns(1).HeaderText = "E-Mail"
'Pulisco il buffer
AggiungiEmail_button.Enabled = False


questo è il codice di "creazione" del datagrid.

per la Textbox come faccio ?

MarcoGG
07-12-2010, 20:17
Puoi farlo semplicemente sfruttando l'evento CellClick del DataGridView ( d'ora in poi : DGV ) :

Private Sub DGV_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellClick

Try
TextBox1.Text = DGV(e.ColumnIndex, e.RowIndex).Value
Catch ex As Exception

End Try

End Sub

Il perchè del blocco Try Catch è spiegato dal fatto che eventuali multi-selezioni condurrebbero all'errore ( prova a rimuoverlo e a selezionare una riga intera... ).

Quando hai finito di editare nella TextBox il valore prelevato dalla DGV, lo reimposti nella stessa cella selezionata con :
DGV.SelectedCells(0).Value = TextBox1.Text

;)

Ludo237
08-12-2010, 20:01
Grazie ora provo

Ludo237
08-12-2010, 20:05
Puoi farlo semplicemente sfruttando l'evento CellClick del DataGridView ( d'ora in poi : DGV ) :

Private Sub DGV_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellClick

Try
TextBox1.Text = DGV(e.ColumnIndex, e.RowIndex).Value
Catch ex As Exception

End Try

End Sub

Il perchè del blocco Try Catch è spiegato dal fatto che eventuali multi-selezioni condurrebbero all'errore ( prova a rimuoverlo e a selezionare una riga intera... ).

Quando hai finito di editare nella TextBox il valore prelevato dalla DGV, lo reimposti nella stessa cella selezionata con :
DGV.SelectedCells(0).Value = TextBox1.Text

;)

Funziona , manco a dirlo hai sempre ragione !!!! :read: :fagiano: :D :D :D
Grazie ancora !

Ludo237
09-12-2010, 15:49
Puoi farlo semplicemente sfruttando l'evento CellClick del DataGridView ( d'ora in poi : DGV ) :

Private Sub DGV_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellClick

Try
TextBox1.Text = DGV(e.ColumnIndex, e.RowIndex).Value
Catch ex As Exception

End Try

End Sub

Il perchè del blocco Try Catch è spiegato dal fatto che eventuali multi-selezioni condurrebbero all'errore ( prova a rimuoverlo e a selezionare una riga intera... ).

Quando hai finito di editare nella TextBox il valore prelevato dalla DGV, lo reimposti nella stessa cella selezionata con :
DGV.SelectedCells(0).Value = TextBox1.Text

;)

cosi però il valore non va a salvarsi sul database giusto ?

MarcoGG
09-12-2010, 15:56
cosi però il valore non va a salvarsi sul database giusto ?

Ed è giusto che sia così. ;)
Il DB riceve le modifiche solo sull'Update della fonte dati a cui è collegato il DGV. Ovviamente puoi sceglire tu quando eseguirlo, anche ad ogni modifica di una singola cella tramite quella TextBox, volendo...

Ludo237
09-12-2010, 17:01
Ed è giusto che sia così. ;)
Il DB riceve le modifiche solo sull'Update della fonte dati a cui è collegato il DGV. Ovviamente puoi sceglire tu quando eseguirlo, anche ad ogni modifica di una singola cella tramite quella TextBox, volendo...

infatti ho fatto cosi

If ModificaEmail_textbox.Text = "" And ID = 0 Then
ErroreMod_Label.Text = "Il campo E-Mail è Vuoto"
Salva_button.Enabled = False
Else
Dim Email As String = ModificaEmail_textbox.Text
If EmailAddressCheck(Email) = False Then
ErroreMod_Label.Text = "E-Mail non corretta, Prego inserire una E-Mail valida"
Salva_button.Enabled = False
Else
'Dichiarazione di nuove variabili per l'evento
Dim Comando As OleDbCommand = New OleDbCommand()
'Inserisco la nuova E-Mail
Comando.Connection = Connessione
Comando.CommandText = "UPDATE email SET email = @EMAIL WHERE id_email = @ID"
Comando.Parameters.AddWithValue("@ID", ID)
Comando.Parameters.AddWithValue("@EMAIL", Email)
'Apriamo la connessione
Connessione.Open()
'Eseguiamo e vediamo se funziona
Try
Comando.ExecuteNonQuery()
Catch Eccezione As OleDb.OleDbException
MessageBox.Show(Eccezione.Message)
End Try
'Aggiorniamo il DataGridView1
Connessione.Close()
DataSet.Clear()
'Impostiamo la connessione all avvio del form
DataAdapter.SelectCommand = New OleDbCommand()
'Credo la connessione al comando
DataAdapter.SelectCommand.Connection = Connessione
'Creo la Query
DataAdapter.SelectCommand.CommandText = "SELECT * FROM email"
DataAdapter.SelectCommand.CommandType = CommandType.Text
'Apro la Connessione con il Database
Connessione.Open()
'Inserisco le intestazioni nel dataset
DataAdapter.Fill(DataSet, "email")
'Segnaliamo che è andato tutto bene
SmsPanel.Logbox.Items.Add(Now() & " Modificata E-Mail : " & VecchiaEmail & " in " & ModificaEmail_textbox.Text)
ModificaEmail_textbox.Text = ""
ErroreMod_Label.Text = "E-Mail Modificata Con successo!"
'Chiudiamo la connession
Connessione.Close()
End If

Salva_button.Enabled = False
End If


Solo che cosi il datagridview non si aggiorna O.o e nemmeno il DB access e come se la QUERY UPDATE non funzionasse ! però ho fatto la stessa identica cosa per un insert into e funziona benissimo , Perchè?


codice inser into


Dim Email As String = Email_textbox.Text
'Inserisci nuova E-Mail
If Email_textbox.Text = "" Then
Errore_label.Text = "Campo E-Mail VUOTO!, Prego inserire una E-Mail valida"
Else
'Altro codice
If EmailAddressCheck(Email) = False Then
Errore_label.Text = "E-Mail non corretta, Prego inserire una E-Mail valida"
Else
'Dichiarazione di nuove variabili per l'evento
Dim Comando As OleDbCommand = New OleDbCommand()
'Inserisco la nuova E-Mail
Comando.Connection = Connessione
Comando.CommandText = "INSERT INTO email (email) VALUES(@email)"
Comando.Parameters.AddWithValue("@email", Email)
'Apriamo la connessione
Connessione.Open()
'Eseguiamo e vediamo se funziona
Try
Comando.ExecuteNonQuery()
Catch Eccezione As OleDb.OleDbException
MessageBox.Show(Eccezione.Message)
End Try
'Aggiorniamo il DataGridView1
Connessione.Close()
DataSet.Clear()
'Impostiamo la connessione all avvio del form
DataAdapter.SelectCommand = New OleDbCommand()
'Credo la connessione al comando
DataAdapter.SelectCommand.Connection = Connessione
'Creo la Query
DataAdapter.SelectCommand.CommandText = "SELECT * FROM email"
DataAdapter.SelectCommand.CommandType = CommandType.Text
'Apro la Connessione con il Database
Connessione.Open()
'Inserisco le intestazioni nel dataset
DataAdapter.Fill(DataSet, "email")
'Segnaliamo che è andato tutto bene
SmsPanel.Logbox.Items.Add(Now() & " Aggiunta E-Mail : " & Email_textbox.Text)
Email_textbox.Text = ""
Errore_label.Text = "E-Mail Aggiunta Con successo!"
'Chiudiamo la connession
Connessione.Close()
Email = ""
AggiungiEmail_button.Enabled = False
End If
End If


Ovviamente sono due Private Sub evento() Separate una associata a Salva_button e l'altra ad Aggiungi Button

MarcoGG
09-12-2010, 20:28
Non entro nel merito di quei codici. Da un rapido esame ti dico subito che è una tecnica che non userei...
Se avessi dato un'occhiata all'area Discussioni sulla mia pagina FB, avresti trovato un link a questo thread :
http://www.hwupgrade.it/forum/showthread.php?t=2275776

vedi mio post #8.

Quello è un metodo semplice, leggibile e sicuro per gestire una DGV.
Fossi in te ci farei un pensierino... ;)

Ludo237
10-12-2010, 12:28
Non entro nel merito di quei codici. Da un rapido esame ti dico subito che è una tecnica che non userei...
Se avessi dato un'occhiata all'area Discussioni sulla mia pagina FB, avresti trovato un link a questo thread :
http://www.hwupgrade.it/forum/showthread.php?t=2275776

vedi mio post #8.

Quello è un metodo semplice, leggibile e sicuro per gestire una DGV.
Fossi in te ci farei un pensierino... ;)

La tua pagina l'avevo visitata , ma quel thread mi era sfuggito perchè stavo pensando ad altro :doh: :doh: :doh: Ora controllo


Ho visto il codice e ho capito ! , ora cerco di adattarlo alla mia esigenza perchè ho bisogno che la modifica sia applicata dalla Textbox e non dalla griglia

Ludo237
10-12-2010, 15:12
Il problema non è DataGridView o il DataSet , il problema è che il pulsante "Applica Modifiche" (prendere il testo dentro ad una textbox) non le applica nemmeno al Database ... ergo non si aggiornerà mai il DataSet ne il Datagridview:mc:

MarcoGG
10-12-2010, 15:26
Il problema non è DataGridView o il DataSet , il problema è che il pulsante "Applica Modifiche" (prendere il testo dentro ad una textbox) non le applica nemmeno al Database ... ergo non si aggiornerà mai il DataSet ne il Datagridview:mc:

La modifica su TextBox ovviamente non produce alcun Update a DB.
Ma se prima aggiorni la cella della DGV ( che dev'essere bindata al DataSet, come nel mio esempio ), e poi usi quel codice :

If DS.HasChanges() Then
Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
DA.Update(DS)
End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")
End If

Vedrai che funziona eccome... ;)

Se segui quella tecnica alla lettera non puoi sbagliare.
Se invece stai tentando un "mix" tra la mia tecnica e il tuo tentativo precedente, temo che ci sarà parecchio da :muro: .

Ludo237
10-12-2010, 15:30
La modifica su TextBox ovviamente non produce alcun Update a DB.
Ma se prima aggiorni la cella della DGV ( che dev'essere bindata al DataSet, come nel mio esempio ), e poi usi quel codice :

If DS.HasChanges() Then
Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
DA.Update(DS)
End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")
End If

Vedrai che funziona eccome... ;)

Se segui quella tecnica alla lettera non puoi sbagliare.
Se invece stai tentando un "mix" tra la mia tecnica e il tuo tentativo precedente, temo che ci sarà parecchio da :muro: .

Nono nessun mix , è che io nn volevo far modificare il campo del record dal DGV ,mi sembrava poco carino . invece selezionavo la cella , il suo contenuto viene riportato nella textbox e modificato , dopodiché si premeva il tasto "Applica modifiche".

Teoricamente cosi dovrei essere "Indipendente" dal DVG

MarcoGG
10-12-2010, 15:51
Nono nessun mix , è che io nn volevo far modificare il campo del record dal DGV ,mi sembrava poco carino . invece selezionavo la cella , il suo contenuto viene riportato nella textbox e modificato , dopodiché si premeva il tasto "Applica modifiche".

Teoricamente cosi dovrei essere "Indipendente" dal DVG

Allora metti assieme quanto avevo già suggerito per la TextBox :
DGV.SelectedCells(0).Value = TextBox1.Text

Con :
Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
DA.Update(DS)
End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")

Ludo237
10-12-2010, 16:05
Questo nell evento DVG_CellClick ?

DGV.SelectedCells(0).Value = TextBox1.Text

Questo nel pulsante ApplicaModifiche ?


Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
DA.Update(DS)
End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")

Ok ora provo

MarcoGG
10-12-2010, 16:15
Eh, NO ! :doh: :D

Adesso ho capito perchè non va. Se vuoi aggiornare tutto dopo l'edit della TextBox, va tutto insieme nell'Applica-Modifiche :
DGV.SelectedCells(0).Value = TextBox1.Text
Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
DA.Update(DS)
End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")

Ludo237
10-12-2010, 16:20
Allora metti assieme quanto avevo già suggerito per la TextBox :
DGV.SelectedCells(0).Value = TextBox1.Text

Con :
Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
DA.Update(DS)
End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")

Eh, NO ! :doh: :D

Adesso ho capito perchè non va. Se vuoi aggiornare tutto dopo l'edit della TextBox, va tutto insieme nell'Applica-Modifiche :
DGV.SelectedCells(0).Value = TextBox1.Text
Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
DA.Update(DS)
End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")

Ti dovrebbero fare santo ! :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave:

per il tuo aiuto il minimo che mi sembrava oneroso fare è sostenere la tua pagina di FB (guarda la mia firma)

MarcoGG
10-12-2010, 16:50
Ti dovrebbero fare santo ! :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave: :ave:

per il tuo aiuto il minimo che mi sembrava oneroso fare è sostenere la tua pagina di FB (guarda la mia firma)

Grande ! ;)
E' proprio lo spirito giusto ! :)

Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.