DataGridView, BindingSource e Collection

lunedì 15 dicembre 2008 - 09.43

Teech Profilo | Expert

Ho una classe collection con la quale gestisco delle entità 'Commesse':
Public Class Commesse Inherits BindingList(Of Commessa) ...
Ogni 'Commessa' contenuta nella collection implementa un'interfaccia ICommessa:
Public Interface ICommessa ReadOnly Property Codice() As String ReadOnly Property Descrizione() As String ReadOnly Property Scadenze() As Date ReadOnly Property Articolo() As IArticolo ReadOnly Property Cliente() As ICliente End Interface
Come si può notare, la commessa ha 2 proprietà che come tipo sono classi da me gestite (Articolo e Cliente)

Utilizzo un BindingSource per popolare una DataGridView:
'Popola il controllo BindingSource cm = New comm.Commesse() bs = New BindingSource bs.DataSource = cm 'Popola la DataGridView dgvCommesse.DataSource = bs
Perchè le colonne Articolo e Cliente nel DataGridView vengono create ma rimangono vuote (senza dato all'interno di nessuna cella)? Ho controllato in Debug e gli oggetti Articolo e Cliente, per ogni commessa, sono correttamente inizializzati.
Non so dove ricercare il problema...

Grazie dell'eventuale aiuto...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

freeteo Profilo | Guru

Ciao,
il motivo è che il dato che loro hanno da visualizzare è complesso, quindi non visualizzano niente, anche perchè cosa (quale proprietà) dovrebbero visualizzare dell'oggetto "Cliente" che hai?

Per ovviare questa cosa, puoi implementarti tu una colonna, che visualizzi dei dati complessi, andando per reflection a prendersi il valore.
Questo post tratta proprio questa soluzione: http://www.dotnethell.it/forum/messages.aspx?ThreadID=23287 dove si parla di qualcosa di simile, ossia andare a cambiare la visualizzazione del dato dentro ad una cella.
In quell'esempio si va a cercare la proprietà che è una collection e si genera una stringa (con lo struingbuilder) etc... tuo caso è più semplice perchè ti basta andare a prendere una singola proprietà e visualizzare quella.

La strada che volevo segnalarti era cmq quella...

il codice è in C# ma fai sempre presto a tradurlo con un traduttore online tipo: http://www.carlosag.net/Tools/CodeTranslator/


Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Teech Profilo | Expert

>Ciao,
>il motivo è che il dato che loro hanno da visualizzare è complesso, quindi non visualizzano niente, anche perchè cosa (quale proprietà) dovrebbero >visualizzare dell'oggetto "Cliente" che hai?
Speravo che con l'override del metodo ToString venisse visualizzato quello, tipo nelle ListBox... Ovviamente avevo già provato prima di postare
>Per ovviare questa cosa, puoi implementarti tu una colonna, che visualizzi dei dati complessi, andando per reflection a prendersi il valore.
>Questo post tratta proprio questa soluzione: http://www.dotnethell.it/forum/messages.aspx?ThreadID=23287 dove si parla di qualcosa di simile, ossia >andare a cambiare la visualizzazione del dato dentro ad una cella.
Grazie, molto chiaro... Però in questo modo sono costretto a "disegnarmi" le colonne della griglia a priopri (tramite designer o a runtime), mentre utilizzando il BindingSource come DataSource del DataGridView il tutto funziona automaticamente. Una modalità che mi permetta di mantenere questo automatismo non esiste e non può esistere, se ho capito bene... Nulla di tragico, ma è da fare

Intanto grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

freeteo Profilo | Guru

>Grazie, molto chiaro... Però in questo modo sono costretto a
>"disegnarmi" le colonne della griglia a priopri (tramite designer
>o a runtime), mentre utilizzando il BindingSource come DataSource
>del DataGridView il tutto funziona automaticamente.
si beh puoi fare tutto come prima, ma poi quando hai le colonne nella gridview (tirate dentro con drag&drop magari) puoi andare a cambiarti la singola colonna, impostando il tuo tipo e modificando la PropertyName di quest'ultima...un lavoro fa fare ma sicuramente non di grosso peso.



>Una modalità che mi permetta di mantenere questo automatismo non esiste e
>non può esistere, se ho capito bene... Nulla di tragico, ma è
>da fare
probabilmente si può fare, magari decorando la proprietà dell'entità con qualche attributo...ma sinceramente non l'ho mai fatto


Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Teech Profilo | Expert

Effettivamente è la soluzione che vedo più immediata e fattibile...
Grazie mille!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
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