Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Datagridview e richtextbox
venerdì 24 agosto 2007 - 18.39
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Giovanni_3478
Profilo
| Senior Member
293
messaggi | Data Invio:
ven 24 ago 2007 - 18:39
Ciao
Ho un datagridview collegato ad una tabella del db con 2 colonne : id, contenuto.
Vorrei che "contenuto" venisse visualizzato anzichè in un textbox (relativo al datagridview), in un richtextbox.
Come bisogna procedere?
SSUPERPIPPO
Profilo
| Guru
1.095
messaggi | Data Invio:
ven 24 ago 2007 - 22:59
>Ciao
Ciao
>Ho un datagridview collegato ad una tabella del db con 2 colonne : id, contenuto.
>Vorrei che "contenuto" venisse visualizzato anzichè in un textbox (relativo al datagridview), in un richtextbox.
>Come bisogna procedere?
Bisogna innanzitutto capire se per collegare il tuo DataGridView al database hai utilizzato i wizard oppure se hai fatto tutto via codice. Ti illustro entrambe le soluzioni.
WIZARD:
1. Selezioni la tua RichTextBox
2. Nelle proprietà del controllo selezioni DataBindings -> Text
3. cliccando sul menu a discesa, potrai selezionare il tuo DataSet, il DataTable e infine il campo che vuoi visualizzare (nel tuo caso 'Contenuto'
VIA CODICE:
Partendo dal presupposto che tu abbia creato un Dataset e un DataTable che hai collegato al tuo DataGridView, dovrai inserire questo codice per effettuare il binding:
Me.TuoRichTextBox.DataBindings.Add("Text", TuoDataTable, "Contenuto")
e il gioco è fatto.
Spero di essere stato sufficientemente chiaro, prova e fammi sapere.
Ciao
Alessandro
Giovanni_3478
Profilo
| Senior Member
293
messaggi | Data Invio:
sab 25 ago 2007 - 13:35
>Bisogna innanzitutto capire se per collegare il tuo DataGridView al database hai utilizzato i >wizard oppure se hai fatto tutto via codice.
Ho fatto tutto da codice.
Pensavo ci fosse una proprietà del datagridview che mi permetteva di sostituire i datagridTextbox con un richtextbox.
Come dici tu ho 2 controlli: il richtextbox e il datagridview.
La comodità del datagridview è che ti dà la possibilità non solo di visualizzare il record,
ma di inserirne un altro e fare delle modifiche.
Con 2 controlli (richtextbox e il datagridview) per fare l'insert
dovrò inserire un altro richtextbox, e gestire gli eventi di entrambi i controlli?
SSUPERPIPPO
Profilo
| Guru
1.095
messaggi | Data Invio:
sab 25 ago 2007 - 14:06
Non ho capito bene cosa devi fare...
riesci a spiegarti un pò meglio?
Giovanni_3478
Profilo
| Senior Member
293
messaggi | Data Invio:
sab 25 ago 2007 - 14:14
Scusa se sono stat poco chiaro.
Allora una volta inserito il richtextbox via codice con
Me.TuoRichTextBox.DataBindings.Add("Text", TuoDataTable, "Contenuto")
come procedo per fare l'insert, l'update e il delete?
SSUPERPIPPO
Profilo
| Guru
1.095
messaggi | Data Invio:
sab 25 ago 2007 - 14:18
Non hai utilizzato un DataAdapter per poporare il tuo DataTable?
Il DataAdapter funge da collettore tra il database e il tuo DataTable, quando hai aggiunto, eliminato o modificato i record contenuti nel DataTable, basta che richiami il metodo Update del DataAdapter per avviare la sincronizzazione dei dati verso il database fisico.
Non so se hai confidenza con l'argomento, eventualmente fammi sapere che ti posto un pò di codice.
Ciao
Alessandro
Giovanni_3478
Profilo
| Senior Member
293
messaggi | Data Invio:
sab 25 ago 2007 - 15:04
Per popolare il db del datagridview ho usato qualcosa del tipo
cmd100 = New SqlClient.SqlDataAdapter("Select id, cat_nome_fk, contenuto FROM Content WHERE (cat_nome_Fk = @cat_nomeFk) ", cnn1)
dt100 = New DataTable
cat100_nomeFkPar = New SqlClient.SqlParameter("@cat_nomeFk", SqlDbType.VarChar, 300)
cmd100.SelectCommand.Parameters.Add(cat100_nomeFkPar)
per fare un insert per esempio
Dim insert As New SqlClient.SqlCommand("INSERT INTO categorie (numero_categoria ,categoria_nomeFk, nome_categoria) VALUES (1, N'empty', @nome_categoria) ", cnn1)
Dim NomeCategoria_Par As New SqlClient.SqlParameter("@nome_categoria", SqlDbType.VarChar, 300)
insert.Parameters.Add(NomeCategoria_Par).Value = DataGridView1.Rows.Item(e.RowIndex).Cells(1).Value
insert.ExecuteNonQuery()
ma quali eventi devo usare rispettivamente del richtextbox e del datagridview?
per fare un insert dovrò usare 2 richtextbox(il primo mi visualizza la select, il secondo serve per inserire un record)?
SSUPERPIPPO
Profilo
| Guru
1.095
messaggi | Data Invio:
sab 25 ago 2007 - 15:52
>ma quali eventi devo usare rispettivamente del richtextbox e del datagridview?
>per fare un insert dovrò usare 2 richtextbox(il primo mi visualizza la select, il secondo serve per inserire un record)?
Scusami ma non ti seguo...
Vediamo se ho capito cosa ti serve.
Nella tua Form hai due controlli, uno de un DataGridView collegato ad una tabella, l'altro è un RichTextBox che conterrà il valore di una delle celle del DataGridView.
Tu vorresti che modificando il contenuto della RichTextBox si aggiorni anche la cella del DataGridView;
Ecco come devi fare:
1. Crei un DataSet con il DataTable con l'ausilio dell'oggetto DataAdapter (come hai già fatto)
2. Effettui il Binding del duo DataGridView in questo modo
Me.DataGridView1.DataSource = TuoDataSet.Tables("TuaTabella")
3. Effettui il Binding anche della RichTextBox
Me.RichTextBox1.DataBindings.Add("Text", TuoDataSet.Tables("TuaTabella"), "NomeCampo")
A questo punto se mandi in esecuzione il programma ti si presenterà un DataGridView riempito con i dati della tabella, cliccando su uno qualsiasi dei record del tuo DataGridView, automaticamente si aggiornerà anche il contenuto della RichTextBox.
Se tu aggiungi un nuovo record al DataGridView, potrai inserire direttamente le info dentro alla RichTextBox e automaticamente si aggiornerà anche il tuo DataGridView (quando ti sposti su an'altro record).
Intanto prova se così funziona, poi per l'update del Database fisico ti passo le istruzioni. Però prima verifica se funziona questo.
Ciao
Alessandro
Giovanni_3478
Profilo
| Senior Member
293
messaggi | Data Invio:
sab 25 ago 2007 - 18:30
Ciao
Dunque il codice l'ho provato e funziona
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim dt1 As New DataTable
cmd.Fill(dt1)
Me.DataGridView1.DataSource = dt1
Me.RichTextBox1.DataBindings.Add("text", dt1, "nome_categoria")
Per aggiornare i dati nel db fisico
si usa qualcosa come questo
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
Dim dt1 As DataTable = DataGridView1.DataSource
dt1.Rows(0).Delete()
cmd.Update(dt1)
Poi cambia il codice a seconda se è una insert delete o update.
Se la select è Select id, cat_nome_fk, contenuto FROM Plan_Content WHERE (cat_nome_Fk = @cat_nomeFk)
e
voglio associare solo id, cat_nome_fk al datagridview
e solo contenuto al richtextbox
come devo fare?
SSUPERPIPPO
Profilo
| Guru
1.095
messaggi | Data Invio:
sab 25 ago 2007 - 19:00
Per quanto riguarda l'update del Database sono da fare alcune precisazioni:
Il DataAdapter è un oggetto che permette al DataSet di interagire con il Database.
Quanto tu generi un DataSet/Datatable attreverso un DataAdapter, crei una copia lato client (disconnessa) della tabella di origine.
Tutte le modifiche/inserimenti/eliminazioni eseguite sulle righe non sono applicate al Database di destinazione fino a quando non si esegue il metodo Update del DataAdapter utilizzato.
Ogni DataRow assume un stato (DataRowState) che, prima di ogni modifica sarà 'unchanged', se un record viene modificato lo stato del datarow diventerà 'modified', se un record viene eliminato lo stato sarà 'deleted', se un record viene aggiunto lo stato sarà 'added'.
Premesso questo, quanto viene richiamato il metodo update del DataAdapter, vengono eseguite tutte le operazioni di INSERT, UPDATE e DELETE automaticamente in base allo stato di ogni DataRow del DataTable.
A questo punto il tutto sarà così strutturato:
DICHIARAZIONI A LIVELLO DI FORM
Dim TuoDataAdapter As New SqlDataAdapter
Dim TuaConnessione As SqlConnection
Dim TuoDataSet As New DataSet
ISTRUZIONI DA INSERIRE PER L'EVENTO LOAD DEL TUO FORM
' Stabilisci la connessione con il database
TuaConnessione = New SqlConnection("... TuaStringaConnessione ...")
Try
TuaConnessione.Open()
Catch ex As Exception
'
End Try
' Crea il tuo DataSet/DataTable
Dim SqlCmd As New SqlCommand
SqlCmd.CommandText = "SELECT ....."
SqlCmd.Connection = TuaConnessione
SqlCmd.CommandTimeout = 30
TuoDataAdapter .SelectCommand = SqlCmd
TuoDataAdapter .Fill(TuoDataSet, NomeTuaDataTable)
TuaConnessione.Close()
' Effettua il binding con i controlli
Me.DataGridView1.DataSource = TuoDataSet.Tables(TuaTabella)
Me.RichTextBox1.DataBindings.Add("Text", TuoDataSet.Tables(TuaTabella), "TuoCampo")
A QUESTO PUNTO CREI UN PULSANTE PER IL SALVATAGGIO CHE CONTERRA' QUESTO CODICE
TuoDataAdapter.Update(TuoDataSet.Tables("NomeTuaDataTable"))
In questo modo vengono eseguiti UPDATE/INSERT/DELETE sul tuo database.
Spero di essere stato esaustivo.
Se hai bisogno di aiuto sono a disposizione.
Ciao
Alessandro
Giovanni_3478
Profilo
| Senior Member
293
messaggi | Data Invio:
sab 25 ago 2007 - 19:40
>Se hai bisogno di aiuto sono a disposizione.
Grazie mille veramente
1) Probabilmente mentre scrivevi la risposta ho aggiunto al post:
....
Se la select è Select id, cat_nome_fk, contenuto FROM Plan_Content WHERE (cat_nome_Fk = @cat_nomeFk)
e
voglio associare solo id, cat_nome_fk al datagridview
e solo contenuto al richtextbox
come devo fare?
2) A QUESTO PUNTO CREI UN PULSANTE PER IL SALVATAGGIO CHE CONTERRA' QUESTO CODICE
TuoDataAdapter.Update(TuoDataSet.Tables("NomeTuaDataTable"))
------------------------------------------------------------------
A QUESTO PUNTO
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
SE NON AGGIUNGO
Dim dt1 As DataTable = DataGridView1.DataSource
dt1.Rows(0).Delete()
cmd.Update(dt1)
CIOE' se non intervengo sul dataset (o datatable), le modifiche non le realizza.
Non so perchè.
3) questo esula dal tema del post;
ne posso aprire un altro dimmi tu.
Quando salvo del testo
ad esempio
"Il premier Karamanlis punta l'indice contro i colpevoli: "Tanti incendi nello stesso momento e nello stesso posto non possono essere una coincidenza". Secondo quanto comunicato dalla Farnesina, tra le vittime o i coinvolti non ci...."
in un campo del db,
al testo vengono aggiunti nel record del db dei "quadratini" quando il testo va a capo.
Quando leggo il testo dal db con
dt1.Rows(i).Item(j).ToString
i quadratini scompaiono.
In questo piccolo applicativo per uso domestico,
ho aggiunto la funzione ricerca,
per cui il risultato della ricerca viene visualizzato in un richtextbox, in questo modo:
TESTO RICERCA: Karamanlis
RISULTATO RICERCA: "[in blu]Il premier[/in blu] [in rosso]Karamanlis[/in rosso] [in blu]punta l'indice contro i colpevoli: "Tanti incendi nello stesso momento e nello stesso posto non possono essere una coincidenza". Secondo quanto comunicato dalla Farnesina, tra le vittime o i coinvolti non ci....[/in blu]"
La proprietà rtf (che dà il risultato ricerca) è stata settata di logica così:
strRtf = "{\rtf1\ansi\ansicpg1252\deff0\deflang1040{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}{\colortbl ;\red255\green0\blue0;\red0\green0\blue128;}\viewkind4\uc1\pard\f0\fs17 " & Testo(cioè dt1.Rows(i).Item(j).ToString).
Il problema è che il testo cioè (dt1.Rows(i).Item(j).ToString)
"[in nero]Il premier[/in nero] [in rosso]Karamanlis[/in rosso] [in nero]punta l'indice contro i colpevoli: "Tanti incendi nello stesso momento e nello stesso posto non possono essere una coincidenza". Secondo quanto comunicato dalla Farnesina, tra le vittime o i coinvolti non ci....[/in nero]"
non rispetta i ritorni a capo.
C'è un modo per leggere dal db i ritorni a capo
ed esportarli nella proprietà rtf di un richtextbox?
Dimmi se non sono stato chiaro
SSUPERPIPPO
Profilo
| Guru
1.095
messaggi | Data Invio:
sab 25 ago 2007 - 19:58
>Se la select è Select id, cat_nome_fk, contenuto FROM Plan_Content WHERE (cat_nome_Fk = @cat_nomeFk)
>e
>voglio associare solo id, cat_nome_fk al datagridview
>e solo contenuto al richtextbox
>come devo fare?
Io nasconderei la colonna relativa del DataGridView una volta caricati i dati:
me.TuaDataGridView.Column(2).visible=false
>A QUESTO PUNTO
>Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) >Handles DataGridView1.CellEndEdit
>SE NON AGGIUNGO
>Dim dt1 As DataTable = DataGridView1.DataSource
>dt1.Rows(0).Delete()
>cmd.Update(dt1)
>CIOE' se non intervengo sul dataset (o datatable), le modifiche non le realizza.
>Non so perchè.
Ho dimenticato un passaggio importante, dopo aver creato il DataSet/DataTable con il DataAdapter inserisci queste istruzioni:
Dim CmdBuilder As SqlCommandBuilder = New SqlCommandBuilder(TuoDataAdapter)
TuoDataAdapter.InsertCommand = CmdBuilder.GetInsertCommand
TuoDataAdapter.DeleteCommand = CmdBuilder.GetDeleteCommand
TuoDataAdapter.UpdateCommand = CmdBuilder.GetUpdateCommand
Questo passaggio "Insegna" al tuo DataAdapter quanli istruzioni utilizzare per l'INSERT, l'UPDATE e il DELETE derivandole automaticamente in base alla SELECT di origine.
Se poi esegui l'update dovrebbe ora funzionare
>3) questo esula dal tema del post;
>ne posso aprire un altro dimmi tu.
Per un corretto utilizzo del forum e per rendere partecipi anche gli altri è meglio se apri un altro post.
Poi analizzo il problema e ti rispondo.
Ciao
Ale
Giovanni_3478
Profilo
| Senior Member
293
messaggi | Data Invio:
sab 25 ago 2007 - 20:17
>Io nasconderei la colonna relativa del DataGridView una volta caricati i dati
ok. Funziona
>Ho dimenticato un passaggio importante, dopo aver creato il DataSet/DataTable con il >DataAdapter inserisci queste istruzioni: ................................
Ok. Adesso funziona.
>Per un corretto utilizzo del forum e per rendere partecipi anche gli altri è meglio se apri un altro >post.
>Poi analizzo il problema e ti rispondo.
Ok. Griazie per l'aiuto e per la pazienza
Giovanni_3478
Profilo
| Senior Member
293
messaggi | Data Invio:
dom 26 ago 2007 - 12:38
Ciao
Quando eseguo il databinding
Me.DataGridView1.DataSource = TuoDataSet.Tables("TuaTabella")
Me.RichTextBox1.DataBindings.Add("Text", TuoDataSet.Tables("TuaTabella"), "NomeCampo")
mi dice
"in questo modo l'insieme avrebbe 2 associazioni alla stessa proprietà. Nome parametro: binding."
In pratica io ho "id", "cat_nome", "contenuto" come campi visualizzati nel datagridview
e solo "contenuto" visualizzato nel richtextbox.
A me serve visualizzare "contenuto" sia nel datagridview che nel richtextbox.
Come posso ovviare a questo problema?
SSUPERPIPPO
Profilo
| Guru
1.095
messaggi | Data Invio:
dom 26 ago 2007 - 12:42
>Ciao
Ciao
>Quando eseguo il databinding
>Me.DataGridView1.DataSource = TuoDataSet.Tables("TuaTabella")
>Me.RichTextBox1.DataBindings.Add("Text", TuoDataSet.Tables("TuaTabella"), "NomeCampo")
>mi dice
>"in questo modo l'insieme avrebbe 2 associazioni alla stessa proprietà. Nome parametro: binding."
Significa che il binding su quel campo è già stato effettuato. Devi quindi prima eliminare il vecchio binding in questo modo:
Me.RichTextBox1.DataBindings.Clear()
Ciao
Alessandro
Giovanni_3478
Profilo
| Senior Member
293
messaggi | Data Invio:
dom 26 ago 2007 - 12:46
Giusto
ciao
Torna su
Stanze Forum
Elenco Threads
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 !