Uso della Datagrid in un Windows form

domenica 04 dicembre 2005 - 01.33

riofly Profilo | Newbie

Ciao a tutti!
Ho fatto una windows form banale, con al suo interno un Datagrid collegata alla tabella di SQL Server [Dipendendi] del mio DB attraverso un DATASET.
Quindi il datagrid deve servire per mostrare l'elenco dei dipendenti, con il nome, cognome...ecc...ecc... e la provincia di residenza. Per far meglio caricare questa colonna ci ho messo un ComboBox. Ho faticato un po per riuscirsi...ma pare che funzioni abbastanza bene.
Modificando un record sualsiasi, all'inizio della modifica la riga viene marcata con l'icona della MATITA. Spostandosi di colonna o di riga questa matita viene sostituita dal triangolino nero.
Sull'evento di chiusura della form verifico se ci sono state delle modifiche dall'ultimo salvataggio, quindi chiedo all'utente se si devono salvare le modifiche. E fin quì tutto bene.

Il problema è che se si modifica una cella della datagrid e, senza spostare la selezione nel datagrid, vado a chiudere la form questa si chiude senza avvertire che c'è una modifica in corso dei dati.
A questo proposito avrei delle domande:
1) perchè il datagrid della microsoft non permette di definire celle di tipo COMBOBOX o un semplice TEXTBOX con ampiezza verticale variabile per far stare sempre e comunque il testo contenuto?
2) come faccio a invocare un salvataggio dei dati dal datagrid al Dataset?
3) come faccio a sapere se e quale riga del datagrid è in stato di modifica e quindi il suo contenuto non è sincronizzato con quello del dataset?
4) quanto è affidabile il datagrid della microsoft?
5) il programmatore del datagrid di VS.NET ha avuto problemi da piccolo?? =) ...oppure sono l'unico che non ci va d'accordo con quell'oggetto?
6) e la cosa più importante di tutte è.... riuscirò ad andare a sciare per capodanno???

Grazie anticipatamente per il vostro aiuto... spero di risolvermi sti problemi così mi metto l'anima in pace.
CIAO !

Brainkiller Profilo | Guru

Ciao vedo di provare a rispondere a qualcosa:

>1) perchè il datagrid della microsoft non permette di definire
>celle di tipo COMBOBOX o un semplice TEXTBOX con ampiezza verticale

E' possibile facendo un subclassing della DataGrid in modo da utilizzare controlli diversi come DropDown o immagini. Se provi ad utilizzare il Framework 2.0 il DataGrid è stato sostituito da DataGridView decisamente più evoluto.

>2) come faccio a invocare un salvataggio dei dati dal datagrid
>al Dataset?
>3) come faccio a sapere se e quale riga del datagrid è in stato
>di modifica e quindi il suo contenuto non è sincronizzato con
>quello del dataset?

Devo dire che su questo problema ci ho pensato un po'. A mio avviso durante la chiusura della Form se tu sei in modalità modifica non dovrebbe avvisarti, perchè la datagrid come anche Access sono costruiti così. Cioè il commit del dato avviene quando ti sposti in un altro record. Puoi provare a vedere l'evento CurrentCellChanged e vedere se ti può essere d'aiuto.

>4) quanto è affidabile il datagrid della microsoft?

Direi di sì, dipende anche da ciò che devi fare. Tutti i controlli sono estensibili quindi se hai bisogno di più funzionalità te le devi implementare. Dalla mia esperienza non ne ho mai avuto bisogno.

>5) il programmatore del datagrid di VS.NET ha avuto problemi
>da piccolo?? =) ...oppure sono l'unico che non ci va d'accordo
>con quell'oggetto?

Non si può pretendere al volo che funzioni tutto. La learning curve del DataGrid è abbastanza particolare perchè non è un controllo banale come gli altri. Spesso bisogna leggere molta documentazione.

>6) e la cosa più importante di tutte è.... riuscirò ad andare
>a sciare per capodanno???

Ma sì dai speriamo di sì :) La neve non manca, è già qualcosa.
ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

AntCiar Profilo | Expert

Ciao. Volevo risponderti alla domanda 2 e 3.

io fare in questo modo: alla chiusura sposto il focus su un oggetto nascosto dietro la grid, tipo un bottone, in modo che la griglia rilasci la riga modifiact e faccia si che la riga venga vista come modificata.

Poi per il salvataggio non mi preoccupo di vedere se sono state modificate righe, invoco il metodo Update del dataadapter e questo provvederà a tutto.

Ciao

riofly Profilo | Newbie

GRANDEEE...!! :) CI SONO RIUSCITO ! e nel modo elegante come piace a me !
L'idea di mettere il focus ad un altro controllo...si... ci avevo pensato, ed è la soluzione che per anni ho seguito in Access, ma non mi è mai piaciuta perchè poco professionale.

Anche questa che vi incollo non è il massimo, perchè mi costringe a salvare i dati anche se non vorrei... ma meglio così che altro.

Ecco il codice dell'evento Form_Closing:


Private Sub MyBase_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
GrdMedici.EndEdit(GrdMedici.TableStyles(0).GridColumnStyles(GrdMedici.CurrentCell.ColumnNumber), GrdMedici.CurrentCell.RowNumber, False)
BindManagerBase_Medici.EndCurrentEdit()
If DSArchivio.HasChanges Then
Dim risp As MsgBoxResult

risp = MsgBox("L'elenco dei Medici è stato modificato e non è stato salvato." & vbCrLf & _
"Salvare le modifiche prima di chiudere la maschera?", MsgBoxStyle.YesNoCancel Or MsgBoxStyle.Question, Me.Text)
Select Case risp
Case MsgBoxResult.Yes
SalvaRecord()
Case MsgBoxResult.No
Case MsgBoxResult.Cancel
e.Cancel = True
End Select
End If
End Sub

Ora devo risolvere altri problemi prima di poter dire "SI VA A SCIARE!"... Vediamo...

Grazie per l'aiuto! CIAO !

-- RioFly --
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