Poliformismo e DataGridView

martedì 03 febbraio 2009 - 16.45

Teech Profilo | Expert

Ho un'iterfaccia IComponente dove dichiaro la struttura per oggetti di vario tipo (Lavorazioni, Materiali, Tempi Macchina, ecc...) tutti che implementano questa interfaccia.
Ho una collection che popolo con oggetti che implementano l'interfaccia IComponente
Public Class Componenti Inherits BindingList(Of IComponente)
Ogni oggetto ha una proprietà Quantità che varia come tipo: su Lavorazioni è un TimeSpan in sola lettura, su Materiali è un Double, su Tempi Macchina è un TimeSpan ReadWrite, ecc... Per questo motivo non ho dichiarato questa proprietà nell'interfaccia ma su ogni singola classe che la implementa.
Per popolare la collection uso il seguente codice:
Select Case cp.Tipo Case "L" Me.Items.Add(New Lavorazione(CType(cp, IComponenteDB))) Case "M" Me.Items.Add(New Materiale(CType(cp, IComponenteDB))) Case "P" Me.Items.Add(New Programmazione(CType(cp, IComponenteDB))) Case "E" Me.Items.Add(New LavorazioneEsterna(CType(cp, IComponenteDB))) Case "T" Me.Items.Add(New TempoMacchina(CType(cp, IComponenteDB))) Case ... End Select
Ora vorrei visualizzare la collection in un DataGridView ed esporre anche la proprietà Quantità, ma ovviamente, essendo la collection di classi IComponente la proprietà non è presente "direttamente" negli oggetti, ma dovrei effettuare un cast per ogni riga.
Per assegnare i dati al DataGridView uso il seguente sistema nell'evento Load del Form:
DataGridView.DataSource=collection
Come posso effettuare il cast ed in quale evento del DataGridView?
Ho provato nell'evento RowsPrePaint del DataGridView ma non sono riuscito ad effettuare il cast: come posso fare?
La proprietà DataBoundItem è ReadOnly e altre proprietà che mi restituiscono l'oggetto che corrisponde alla riga non l'ho trovata.

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

EDIT

Jeremy Profilo | Guru

>Ogni oggetto ha una proprietà Quantità che varia come tipo: su
>Lavorazioni è un TimeSpan in sola lettura, su Materiali è un
>Double, su Tempi Macchina è un TimeSpan ReadWrite, ecc... Per
>questo motivo non ho dichiarato questa proprietà nell'interfaccia
>ma su ogni singola classe che la implementa.

In questo caso potresti dichiararla, nell'interfaccia come tipo Object....un pò come la proprietà Current del BindingSource(tanto per intenderci) e successivamente eseguire il cast su TimeSpan,Double,etc...etc.... in funzione della classe che stai usando e che implementa l'interfaccia.

Se invece il caso fosse più complicato, ti prego di scusarmi per il consiglio inutile.

Facci sapere..
ciao.

Teech Profilo | Expert

Il fatto di non implementare nell'interfaccia la proprietà di tipo Object l'avevo studiata e le motivazioni sono 2:
1. Ho pensato che un domani potrei gestire dei componenti "a corpo" quindi senza quantità
2. Odio scrivere la parola "Object" nel codice (fisima mia)

Ho comunque risolto con lo stesso sistema che utilizzo per visualizzare proprietà che hanno come tipo delle classi complesse: l'evento CellFormatting e una serie di Cast... Nell'evento CellFormating uso questo tipo di codice:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Spero possa ritornare utile

Ciao!!!
--------------
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