[VB2005] BindingSource e ListView

domenica 05 ottobre 2008 - 10.17

Teech Profilo | Expert

Stò cercando di capire se è possibile assegnare una collection tipizzata ad una ListView...
Per prima cosa ho la mia classe base contenente i dati:
Public Class Dato Private _Codice As Integer Private _Descrizione As String Private _Altro As String Sub New() End Sub Public Property Codice() Get Return _Codice End Get Set(ByVal value) _Codice = value End Set End Property Public Property Descrizione() Get Return _Descrizione End Get Set(ByVal value) _Descrizione = value End Set End Property Public Property Altro() Get Return _Altro End Get Set(ByVal value) _Altro = value End Set End Property Public Overrides Function ToString() As String Return Me.Codice.ToString + " - " + Me.Descrizione End Function End Class

Ho un form contenente dei controlli DataGridView (dgv1), Listbox (lb1) e Listview(lv1)
Al caricamento del form inizialmente popolo una collection (per semplicità utilizzo una List), di seguito creo un BindingSource poi associo i dati ai controlli:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Così va bene ma vedete che non c'è la ListView quando popolo i dati...
E' possibile creare un'associazione simile? Ho controllato ma non ho trovato nulla riguardo ListView e Collection type-safe... Un aiutino? Grazie
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

freeteo Profilo | Guru

ciao,
allora un'associazione diretta come "DataSource" la listview non la permette, sinceramente mi sembra "una mancanza" di questo ottimo controllo, che permette solo l'aggiunta di ListItem e non binding diretto.
Invece se usi altri controlli più semplici come "ListBox" ce l'hai e quindi riesci a bindare facilmente.

Però potresti pensare di estendere la ListView normale, esporre questa proprietà, e dentro al set della proprietà viene fare il codice di aggiunta dei vari item.
Nelle tue form, invece di usare la LsitView normale, usi la tua, tanto tutto si comporta come quella normale, solo che in più hai questa funzionalità.

Ti do il codice della listview che lo fa:
class MiaListView : ListView { public string DisplayMember { get; set; } private IEnumerable _datasource; public IEnumerable DataSource { get { return _datasource; } set { _datasource = value; if (_datasource != null) PopolaListView(); } } private void PopolaListView() { foreach (object oggetto in _datasource) { ListViewItem item = new ListViewItem(); //--- se hai impostato alcune proprietà che vuoi vedere if (!string.IsNullOrEmpty(DisplayMember)) { PropertyInfo prop = oggetto.GetType().GetProperty(DisplayMember); item.Text = prop.GetValue(oggetto, null) as string; } else item.Text = oggetto.ToString(); this.Items.Add(item); } } }
come vedi da codice ti basta impostare la proprietà aggiunta "DisplayMember", che è la proprietà dell'oggetto che vuoi vedere poi a video, e ovviamente la DataSource con la collection (List<T> o array etc...basta che sia una collection) e poi da codice si arrangia lei a farti gli add degli items.

Questo è uno spunto, poi va migliorato sicuramente, ma su questa strada secondo me ce la fai a farti quello che ti serve, e magari lo puoi anche riciclare in futuri progetti, una volta ultimato.


* ps: il codice è in c# perchè adesso non ho comodo vb, prova a vedere di tradurlo tramite un traduttore come questo:
http://www.carlosag.net/Tools/CodeTranslator/Default.aspx
e magari ritocca dove serve.

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Teech Profilo | Expert

Non so come ringraziarti per la risposta chiara ed esauriente...
Ora proverò ma credo che è un'ottima traccia da seguire
--------------
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