Contenuto Cella in DataGridView

lunedì 20 aprile 2009 - 18.30

pedro8a Profilo | Junior Member

Ho questo problema:
ho popolato un datagrid con i dati di una query.
Adesso quando faccio clic su una riga devo memorizzare il campo IdCliente in una variabile.
Questo mi server per aprire (attraverso una query ........Where IdCliente = IdCliente) un altro Frm con tutti i dati del cliente selezionato.



Codice:

recupero i dati...
MyDataAdapter = New OleDb.OleDbDataAdapter(StrSql, cn)
MyDataAdapter.Fill(MyDataSet, "Prova").ToString()
MyBinding.DataSource = MyDataSet.Tables("prova")

DataGridView.DataSource = MyBinding.DataSource

.....evento del datagrid....

Private Sub DataGridView_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView.MouseClick

IdCliente=????

End Sub

Come diavolo si fà?

TOPOAMORE Profilo | Expert

recuperalo dalla sorgente:

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

pedro8a Profilo | Junior Member

Ciao,
ho risolto così:

Private Sub DataGridView_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView.MouseClick

IdCliente = DataGridView.CurrentRow.Cells.Item(2).Value

End Sub

a questo punto apro il form con i dati del cliente:

StrSql = "Select * From TabClienti Where IdCliente=" & IdCliente
StrSql = StrSql & " And IdAzienda=" & IdAzienda

MyDataAdapter = New OleDb.OleDbDataAdapter(StrSql, cn)

MyDataAdapter.Fill(MyDataSet, "Cliente").ToString()

MyBinding.DataSource = MyDataSet.Tables("Cliente")

TxtNome.Text = MyDataSet.Tables("Cliente").Rows(0).Item("Nome")
TxtCognome.Text = MyDataSet.Tables("Cliente").Rows(0).Item("Cognome")

cn.Close()

L'utente modifica i dati..... poi ho messo un tasto sava. Ma come si salvano i dati?

esempio:
dati=TxtCognome.Text
dati.Update

o con Update .....

come si fà?

TOPOAMORE Profilo | Expert

Ciao,
per salvare dati fai un Update SQL

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
con un command appropiato e vai......

dimmi se ti serve una mano
ASP 2.0 - VB 2008

pedro8a Profilo | Junior Member

Ciao,
grazie ho risolto così:

BindingContext(Ds.Tables(0)).EndCurrentEdit()
Da.Update(Ds.Tables("Tabella1"))

Adesso voglio aggiungere campi ma non trovo la proprietà .AddNew

alexmed Profilo | Guru

Ciao
mi permetto di darti un piccolo consiglio

questa riga:

IdCliente = DataGridView.CurrentRow.Cells.Item(2).Value

non metterla nel MouseClick ma nel RowEnter, in questo modo anche se l'utente scorre le righe del DataGridView con le frecce o con li PgSu e Giù hai sempre il riferimento all'id corretto.

Poi se la modifichi così ancora meglio

Me.DataGridView1.Item(0, e.RowIndex).Value ' DOVE 0 (zero) corrisponde alla colonna dell'id, che può essere anche nascosta

Ciao



alexmed

pedro8a Profilo | Junior Member

In effetti la colonna è nascosta,
grazie mille

alexmed Profilo | Guru

Ciao
>Adesso voglio aggiungere campi ma non trovo la proprietà .AddNew
Prova a guardare la Proprietà OdbcDataAdapter.InsertCommand

Poi un'altra cosa
questa due righe
StrSql = "Select * From TabClienti Where IdCliente=" & IdCliente
StrSql = StrSql & " And IdAzienda=" & IdAzienda
a meno di esigenze particolari, puoi scriverla in una sola
StrSql = "Select * From TabClienti Where IdCliente=" & IdCliente & " And IdAzienda=" & IdAzienda
Possibilmente utilizzando i Parametri
StrSql = "Select * From TabClienti Where IdCliente= @idCliente And IdAzienda= @idAzienda"

MyDataAdapter.InsertCommand.Parameters.Add( "@idCliente", OdbcType.int, , "idCliente").Value = idCliente

Ciao




alexmed

pedro8a Profilo | Junior Member

Ciao,
ho risolto creando un command ed eseguendo una INSERT INTO oppure UPdate.

Ho un altro problemino:
ho messo un tasto Uscita e chiedo conferma di chiudere il programma.
Se l'utente sceglie Si tutto ok, il programma si chiude, ma se scegli No? In vb6 c'ra cancel=1 in vb.net?
Tutto naturalmente nell'evento FormClosed

Ho provato a far girare il programma in rete, ma mi dice che non si hanno le autorizzazioni per aprire il db, il programma comunque parte. Cosa sbaglio?

Altro problemino:
ho messo alcune textbox nel form, quando faccio clic sulla riga del datagrid si riempiono queste text.
Se però il campo è vuoto naturalmente va in errore. Come faccio ad azzerare la textbox quando il campo è vuoto?
Ho provato con Nuullable... ma?

Grazie

alexmed Profilo | Guru

Ciao

>ho messo un tasto Uscita e chiedo conferma di chiudere il programma.
>Se l'utente sceglie Si tutto ok, il programma si chiude, ma se scegli No? In vb6 c'ra cancel=1 in vb.net?
>Tutto naturalmente nell'evento FormClosed

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

Fermo restando che nel Button Exit metti solo Me.Close

>Ho provato a far girare il programma in rete, ma mi dice che non si hanno le autorizzazioni per aprire il db, il programma comunque parte. Cosa >sbaglio?

Se non ricordo male hanno già affrontato l'argomento nella stanza
http://www.dotnethell.it/forum/SQL-Server-MySQL-Access.aspx
Prova a cercare lì altrimenti apri un nuovo Thread sempre nella stessa stanza.

>Ho provato con Nuullable... ma?
Come le riempi le TextBox?

Ciao

alexmed

pedro8a Profilo | Junior Member

Il codice di uscita form funziona. Grazie

Per riempire la txt uso:

TxtAltriDatiDataDiNascita.Text = Me.DataGridView.Item(11, e.RowIndex).Value

alexmed Profilo | Guru

Sperando di aver centrato il problema prova con

if Me.DataGridView.Item(11, e.RowIndex).Value <> "" Then
TxtAltriDatiDataDiNascita.Text = Me.DataGridView.Item(11, e.RowIndex).Value
End if

Ciao
alexmed

pedro8a Profilo | Junior Member

Non va bene,
mi ritorna errore: "Cast non valido dalla stringa "" al tipo 'Date'
effettivamente il campo nel datagrid è la data di nascita.

Cliccando sulla riga del datagrid, in vb6, si spostava nel recordset. In questo caso bastava controllare che il valore del record raggiunto, non era null.
In vb .net?

Altro problemino:
ho messo nel form del dettaglio del cliente un DateTimePicker, quando apro il form con i dati del cliente ho scritto:

TxtNome.DataBindings.Add("Text", Ds.Tables("Tabella1"), "Nome")
TxtCognome.DataBindings.Add("Text", Ds.Tables("Tabella1"), "Cognome")
TxtArchiviaCome.DataBindings.Add("Text", Ds.Tables("Tabella1"), "ArchiviaCome")

DTPDataDiNascita.DataBindings.Add("Text", Ds.Tables("Tabella1"), "DataDiNascita")

Naturalente questa ultima riga è errata, ma come si corregge?

Rieccomi, trovato.... nella guida e funziona
DTPDataDiNascita.DataBindings.Add(New Binding("Value", Ds.Tables("Tabella1"), "DataDiNascita"))

il problema però è la registrazione della data nel db, io ho sctitto:

Dim DataDiNascita As Date

DataDiNascita = DTPDataDiNascita.Value.Date
StrSql = "INSERT INTO TabClienti (Idazienda, Cognome, Nome, ArchiviaCome, DataDiNascita) VALUES ( "
StrSql = StrSql & IdAzienda & " , '" & Cognome & "' , '" & Nome & "' , '" & ArchiviaCome & "' , #" & DataDiNascita & "#)"

Cmd1 = New OleDb.OleDbCommand(StrSql, cn)
Cmd1.ExecuteNonQuery()

ma non va bene perchè se inserisco 09/03/1976 viene registrato nel DB 03/09/1976

Ancora, ho messo la gestione degli errori:
Try
....................
.....................
Catch ex As Exception
MsgBox("Errore non Previsto", MsgBoxStyle.Critical)
End Try

Ma si può intercettare la riga che ha provocato errore? E il numero dell'errore come in vb6 Err.Number?

Se continuo con questo post, alla fine finisco il progetto, che sarebbe un piccolo gestionale per una palestra,
realizzato in vb6,
anzi quasi quasi metto a disposizione il codice già scritto. Che ne pensate?

Mi sà che mi tocca comprare un bel mega libro.... ma quale?

pedro8a Profilo | Junior Member

Ciao,
ho un dubbio,
quando inserisco un nuovo cliente in anagrafica, controllo che l'utente abbia inseritoi campi obbligatori e scivo:

if TxtNome.Text="" Or TxtCognome.Text="" _
then
msgbox ("Attenzione! Campi insufficenti")
else
............
end if

ma si può fare di meglio?

alexmed Profilo | Guru

Ciao

>Ma si può intercettare la riga che ha provocato errore? E il numero dell'errore come in vb6 Err.Number?
Si con ex.Message
quindi
Catch ex As Exception
MsgBox("Errore non Previsto: " & ex.Message, MsgBoxStyle.Critical)
End Try


>ma non va bene perchè se inserisco 09/03/1976 viene registrato nel DB 03/09/1976
Hai controllato le impostazioni internazionali?

al limite prova con DataDiNascita = DTPDataDiNascita.Value.Today()

------------------------------

>if TxtNome.Text="" Or TxtCognome.Text="" _
>then
>msgbox ("Attenzione! Campi insufficenti")
>else
>............
>end if

>ma si può fare di meglio?

Secondo me può bastare

Ciao



alexmed

pedro8a Profilo | Junior Member

Ciao Alex,
sei gentilissimo e io ignorantissimo di vb .net
ma mi piacerebbe risolvere alcune questioni


>>Ma si può intercettare la riga che ha provocato errore? E il numero dell'errore come in vb6 Err.Number?
>Si con ex.Message
>quindi
>Catch ex As Exception
>MsgBox("Errore non Previsto: " & ex.Message, MsgBoxStyle.Critical)
>End Try

Volevo intercettare la riga che ha provocato errori per il problema del datagrid che ti avevo già sottoposto.
Cioè quando faccio clic su una riga del datagridi si riempiono alcune textbox con i dati del db.
Queste righe nel datagrid sono invisibili all'tente, come la data di nascita.

Ho scritto questo problema nei precedenti post.

>
>
>>ma non va bene perchè se inserisco 09/03/1976 viene registrato nel DB 03/09/1976
>Hai controllato le impostazioni internazionali?

E dove si controllano?

>
>al limite prova con DataDiNascita = DTPDataDiNascita.Value.Today()

Lo provo sssssubito

>
>------------------------------
>
>>if TxtNome.Text="" Or TxtCognome.Text="" _
>>then
>>msgbox ("Attenzione! Campi insufficenti")
>>else
>>............
>>end if
>
>>ma si può fare di meglio?
>
>Secondo me può bastare

Perfetto

>
>Ciao
>
>
>
>alexmed

alexmed Profilo | Guru

Ciao Pietro
Scusa ma mi sono perso!
Potresti riepilogare cosa vorresti fare e quale errore vorresti gestire?

Ciao

alexmed

pedro8a Profilo | Junior Member

if Me.DataGridView.Item(11, e.RowIndex).Value <> "" Then
TxtAltriDatiDataDiNascita.Text = Me.DataGridView.Item(11, e.RowIndex).Value
End if

questa if non va bene,
mi ritorna errore: "Cast non valido dalla stringa "" al tipo 'Date'
effettivamente il campo nel datagrid è la data di nascita.

Cliccando sulla riga del datagrid, in vb6, si spostava nel recordset. In questo caso bastava controllare che il valore del record raggiunto, non era null, oppure che la cella del datagrid non era vuota e tutto funziona perfettamente.
In vb .net?

Altro problemino:
ho messo nel form del dettaglio del cliente un DateTimePicker, quando apro il form con i dati del cliente ho scritto:

TxtNome.DataBindings.Add("Text", Ds.Tables("Tabella1"), "Nome")
TxtCognome.DataBindings.Add("Text", Ds.Tables("Tabella1"), "Cognome")
TxtArchiviaCome.DataBindings.Add("Text", Ds.Tables("Tabella1"), "ArchiviaCome")

DTPDataDiNascita.DataBindings.Add("Text", Ds.Tables("Tabella1"), "DataDiNascita")

Naturalente questa ultima riga è errata, ma come si corregge?

Rieccomi, trovato.... nella guida e funziona
DTPDataDiNascita.DataBindings.Add(New Binding("Value", Ds.Tables("Tabella1"), "DataDiNascita"))

il problema però è la registrazione della data nel db, io ho sctitto:

Dim DataDiNascita As Date

DataDiNascita = DTPDataDiNascita.Value.Date
StrSql = "INSERT INTO TabClienti (Idazienda, Cognome, Nome, ArchiviaCome, DataDiNascita) VALUES ( "
StrSql = StrSql & IdAzienda & " , '" & Cognome & "' , '" & Nome & "' , '" & ArchiviaCome & "' , #" & DataDiNascita & "#)"

Cmd1 = New OleDb.OleDbCommand(StrSql, cn)
Cmd1.ExecuteNonQuery()

ma non va bene perchè se inserisco 09/03/1976 viene registrato nel DB 03/09/1976

Ancora, ho messo la gestione degli errori:
Try
....................
.....................
Catch ex As Exception
MsgBox("Errore non Previsto", MsgBoxStyle.Critical)
End Try

Ma si può intercettare la riga che ha provocato errore? E il numero dell'errore come in vb6 Err.Number?
Ex.Message mi da la descrizione dell'errore, ma la riga che ha provocato errore?

Se continuo con questo post, alla fine finisco il progetto, che sarebbe un piccolo gestionale per una palestra,
realizzato in vb6,
anzi quasi quasi metto a disposizione il codice già scritto. Che ne pensate?

Mi sà che mi tocca comprare un bel mega libro.... ma quale?

alexmed Profilo | Guru

Ciao
Ho pensato che allegarti un progettino possa aiutarci a capirci meglio.

Ciao

alexmed
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