Datagrid e Winform...

martedì 05 luglio 2005 - 22.31

astroman Profilo | Junior Member

Ciao a tutti,
sono nuovo di C# e vengo da anni di programmazione WEB...e devo dire che mi risulta veramente ostico capire come funzioni un datagrid...Cerco di spigarmi un pò meglio...
Allora, per inserire i dati in un datagrid con un dataset non c'è nessun problema...il problema è che non riesco a gestire le interazioni degl'utenti con il datagrid...
In particolare:
Una volta fatto il binding del dataset al datagrid, come faccio a far selezionare tutta una riga della griglia quando l'utente clicca sul datagrid e, per esempio, mettere su una variabile statica l'ID dell'elemento selezionato?(In questo modo potrei aprire un'altra form per visualizzare i dati della riga indicata per modificarli o cancellarli).
Principalmente è questo il mio problema..ed è abbastanza urgente...avete consigli o anche dei suggerimenti su dove potrei trovare una guida esaustiva?

Han Profilo | Newbie

Inanzitutto devi scrivere le successive linee di codice sotto l'evento:

"Private Sub DataGrid1_DoubleClick ()"

all'interno del form dove hai posizionato il datagrid.
Con questa routine cliccando sul Datagrid selezioni l'intera riga.
Dopodiché devi indicizzare il Datagrid:

Dim dt As DataTable = Me.DataGrid1.DataSource
Dim dr As DataRow = dt.Rows(Me.DataGrid1.CurrentRowIndex)

In questo modo potrai andare a prelevare i singoli parametri del Dataset:

If VarType(dr(0)) = 1 Then
Convert.ToString(dr(0))
dr(0) = String.Empty
x = dr(0)
Else
x = dr(0, DataRowVersion.Current)
End If

Dove 0 (indice) è la prima colonna del Dataset e x la variabile dove immagazzini il suo contenuto.
Non ti resta che mandare il valore di x insieme alla chiamata a un altro form di visualizzazione dei dati. Sfruttando i Dataset e il valore di x (eventualmente campo chiave ID) potrai visualizzare tutti i dati della riga o solo quelli che più ti interessano.
Puoi anche evitare di usare un altro OleDB estraendo tutti i dati a uno a uno dalla riga col metodo sopra citato e inviarli a uno a uno assieme alla chiamata al form di visualizzazione, ma amesso che tu non abbia problemi di esubero di dataset ti sconsiglio di evitarlo, è una soluzione poco elegante.

astroman Profilo | Junior Member

>Inanzitutto devi scrivere le successive linee di codice sotto
>l'evento:
>
> "Private Sub DataGrid1_DoubleClick ()"
>
>all'interno del form dove hai posizionato il datagrid.
>Con questa routine cliccando sul Datagrid selezioni l'intera
>riga.
>Dopodiché devi indicizzare il Datagrid:
>
>Dim dt As DataTable = Me.DataGrid1.DataSource
>Dim dr As DataRow = dt.Rows(Me.DataGrid1.CurrentRowIndex)
>
>In questo modo potrai andare a prelevare i singoli parametri
>del Dataset:
>
>If VarType(dr(0)) = 1 Then
> Convert.ToString(dr(0))
> dr(0) = String.Empty
> x = dr(0)
>Else
> x = dr(0, DataRowVersion.Current)
>End If
>
>Dove 0 (indice) è la prima colonna del Dataset e x la variabile
>dove immagazzini il suo contenuto.
>Non ti resta che mandare il valore di x insieme alla chiamata
>a un altro form di visualizzazione dei dati. Sfruttando i Dataset
>e il valore di x (eventualmente campo chiave ID) potrai visualizzare
>Puoi anche evitare di usare un altro OleDB estraendo tutti i
>dati a uno a uno dalla riga col metodo sopra citato e inviarli
>a uno a uno assieme alla chiamata al form di visualizzazione,
>ma amesso che tu non abbia problemi di esubero di dataset ti
>sconsiglio di evitarlo, è una soluzione poco elegante.
>
>

Umm interessante...anche se faccio un pò fatica ad interpretare il codice dato che è VB.NET e io conosco C# e devo sviluppare in quest'ultimo linguaggio...

Cmq, se non ho capito male, devo gestire l'evento doubleclick del datagrid per far si che, visivamente, l'intera riga risulti "selezionata"(di colore blu per intendersi :D)?E all'interno di quell'evento inserire il codice che m'hai passato?

Concettualmente ho capito in discorso e, effettivamente, lo credevo più complicato...ma diciamo che "voglio" complicarlo, cioè che il campo ID della riga non lo voglio far visualizzare all'utente bensì metterlo come riferimento per la riga quando viene selezionata...che mi consigli di fare?

Han Profilo | Newbie

Che tu non voglia farlo vedere all'utente mi sembra logico, del resto il campo ID non ha quasi mai un contenuto utile all'infuori del identificare univocamente quella riga rispetto che un'altra. Però non ho ben capito cosa vorresti fare poi con questi dati.

Dal canto mio mi è capitato più di una volta di dover passare dalle informazioni di un datagrid alla visualizzazione dei dati selezionati in un secondo form pieno di tetbox, uno per ogni campo che ho voluto estrarre da quella riga. Come ti ho detto prima hai due modi.

O estrai manualmente dal datagrid tutti i dati e li mandi a uno a uno al nuovo form (indirizzandoli direttamente al textbox rispettivo) oppure puoi crearti l'OleDB e relativo Dataset con la query di cui parlavamo prima (LIKE?), dopodiché nel form di visualizzazione per ogni Textbox selezioni nel campo "datasource" presente nelle opzioni il dataset su cui hai fatto la selezione, e nel campo displaymember invece scegli la singola colonna: in questo modo basandosi sul campo chiave che gli hai passato (avendo lui caricato nel dataset solo la riga selezionata) nei textbox che avrai impostato dovrebbero apparire automaticamente le informazioni relative alla stessa riga.

In merito alla differenza di linguaggio non posso venirti incontro più di così, purtroppo non sono nemmeno io una cima d'esperienza, spero d'averti fornito spunti sufficienti per arrangiare il tutto; non dovrebbe essere comunque proibitivo, da quel che ho letto in giro (manuali cartacei e on-line) dovrebbe essere tutto più che compatibile.

Han Profilo | Newbie

Rettifico, della query non citavo qui, ma in un thread analogo che puoi trovare facilmente in questo forum.

astroman Profilo | Junior Member

Si hai ragione, forse sono stato 1 pò confuso nell'esprimermi...adesso cerco di spiegarti meglio...
Allora quello che vorrei fare, sintentizzando, con sta benedetta datagrid è:

1)L'utente clicca nel datagrid e visivamente tutta la riga cambia di colore (per intenderci, prendendo tutte le colonne e colorandole con il "blu", come quando premo all'estrema sinistra del datagrid).
2)Per nascondere visivamente il campo "ID", che abbiamo capito entrambi cos'è...come si fà?
3)Quando l'utente ha selezionato una riga di interesse, preme un pulsante esterno al datagrid, apre una nuova form e li carico i dati, passando solo l'ID del DB della riga selezionata e aprendo un nuovo dataset...questo perchè in questo form posso avere le 3 opzioni, di creare, modificare o cancellare il record...

So che forse chiedo troppo...ma non è che se hai qualche idea o qualche codice già fatto me lo posti come esempio?:D

Han Profilo | Newbie

1) Non so che dirti, io per selezionare una riga intera, come hai accennato tu, clicco una volta all'estremità sinistra di essa, non conosco altri modi.

2)Non so come si possa nascondere un singolo campo (presente per forza nel Dataset) dal Datagrid, io mi sono limitato nell'impostazione dell'OleDB a spostare l'ID in fondo alla lista delle colonne nel Dataset, in modo tale da visualizzarlo come ultima colonna del datagrid;

3)Per utilizzare un tasto esterno dovrai riuscire a raccogliere l'indice della riga selezionata da poter poi gestire per prendere i dati (per me è complicato); se invece crei nel form del datagrid una routine di questo tipo:

Private Sub DataGrid1_DoubleClick ()

potrai permettere all'utente di selezionare la riga con un doppio click; mettendo poi in questa routine puoi permetterti di fare diverse cose:

estrarre i dati a uno a uno:
'indicizzazione del datagrid
Dim dt As DataTable = Me.DataGrid1.DataSource
Dim dr As DataRow = dt.Rows(Me.DataGrid1.CurrentRowIndex)
dim x as string
'estrazione valore della colonna 0
If VarType(dr(0)) = 1 Then
Convert.ToString(dr(0))
dr(0) = String.Empty
x = dr(0)
Else
x = dr(0, DataRowVersion.Current)
End If

dove x è la variabile su cui immagazzini il valore estratto e 0 è l'indice delle colonne (che varia a tua discrezione a seconda del campo che vuoi estrarre)

una volta estrapolato x puoi mandarlo al nuovo form e usarlo come parametro di confronto per usare una query di selezione.

OleDbDataAdapter1.SelectCommand.Parameters("campo").Value = _TextBox1.Text()
DataSet11.Clear()
OleDbDataAdapter1.Fill(DataSet11, "tabella")

Aggiungendo la prima riga nel load del nuovo form assieme ai successivi e necessari "clear" e "fill" (e scrivendo "LIKE?" nel campo criteri della colonna (che hai scelto di usare come parametro di selezione) nella finestra "generare query" all'interno delle impostazioni dell'OLEDB) ottieni nel dataset solo le righe (in questo caso la riga) che rispondono nel loro campo "campo" al valore presente nel "textbox1.text()"

Infine sfruttando le proprietà dei textbox "datasource" e displaymember" concludi il cerchio.

Mi rendo conto di non essere molto chiaro, scusami.

astroman Profilo | Junior Member

No no tranquillo, ho capito il discorso in pieno...in effetti forse l'evento doubleclick mi permette sia di tracciare quello che vuol fare l'utente su quella riga...oppure potrei fare 2 metodi, in cui uno sfrutto l'evento click setto i parametri...bah che casino che sono questi datagrid, ma non potevano farli meno complicatO??

astroman Profilo | Junior Member

Alla fine ho risolto in modo totalmente differente...in pratica sull'MSDN ho trovato il codice per creare una ListView con il databing...beh alla fine ho usato quello perchè molto + facile ad usare e fà esattamente quello che mi serve! :D


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