Datagridview e richtextbox

venerdì 24 agosto 2007 - 18.39

Giovanni_3478 Profilo | Senior Member

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

>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

>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

Non ho capito bene cosa devi fare...

riesci a spiegarti un pò meglio?

Giovanni_3478 Profilo | Senior Member

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

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

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

>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

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

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

>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

>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

>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

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

>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

Giusto


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