View Full Version : [VB.NET 2010] Associare Textbox a Cella Datagrid
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 ?
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
;)
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 !
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 ?
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...
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
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... ;)
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
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:
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: .
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
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")
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
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")
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)
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 ! :)
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.