ListBox WnForms, diverso da ListBox WebForm Asp.NET?

martedì 12 giugno 2007 - 19.26

gigi90 Profilo | Senior Member

Come posso memorizzare come elemento di una listbox un elemento al suo interno composto da testo(che verra visualizzato e valore, che costituisce il valore che memorizza l'elemento, proprio come ho sempre fatto con le listbox di asp.Net: quando infatti voglio aggiungere un elemento alla listbox, il metodo Add(object item), chiede solo un'oggetto(che verra visualizzato, ma non il valore, eppure esiste la proprità selected value, e quando si associa un origine dati, chiede la procedura guidata cosa memorizzare come valore e cosa visualizzare.
Come posso risolvere??

Grazie per l'attenzione!!

the_follet Profilo | Newbie

Ciao Gigi,
a suo tempo cercai anche io il modo di impostare manualmente il campo "value" di una listbox (o combobox) winform.
Purtroppo, e non capisco il perchè sinceramente, pare che non sia possibile.

Sembra che il campo "value" possa essere utilizzato solo con il databinding tramite l'istruzione listbox.databinding.valuemember = "{nomecampo}"

E' curioso che in ambiente ASP, invece, la possibilità di assegnare il valore manualmente ci sia...

Diciamo che è passato un pò di tempo da quando feci questa ricerca, se qualcuno potesse smentirmi ne sarei lieto visto che la cosa interessa parecchio anche a me :D

Saluti.
Luca

the_follet Profilo | Newbie

Ad ogni modo, pensandoci, possono esistere varie soluzioni alternative.

Innanzitutto, per esempio, potresti crearti una classe che espone i due campi (o, meglio ancora, proprietà) che ti interessano, quello testo e quello valore:
Obj.MyValue
Obj.MyDisplayedText

Dopodichè ti crei una collection di questi oggetti (tramite una arraylist, ad esempio) "parallela" alla listbox, nel senso che ogni volta che aggiungi, modifichi o elimini un elemento dalla listbox lo fai anche nella arraylist:

Dim CollectionOggetti as new ArrayList
Dim MyObj as Obj
Dim Testo as String = "Prova"
Dim Valore as Integer = 100

MyObj = New Obj
MyObj.MyDisplayedText = Testo
MyObj.MyValue = Valore

ListBox.Items.Add(Testo)
CollectionOggetti.Add(Obj)
(reitera l'inserimento con un pò di oggetti diversi)

In questo modo, utilizzando "listbox.selectedindex" (magari con l'evento selectedindexchanged), ti recuperi dalla arraylist l'oggetto selezionato ed il relativo campo valore:

TextBox1.Text = CollectionOggetti(listbox.selectedindex).MyValue


Teoricamente potresti anche utilizzare il databinding per collegare la listbox alla Arraylist, ma purtroppo non sarebbe "dinamico": una volta assegnato il DATASOURCE, la listbox verrebbe riempita con tutti gli elementi IN QUEL MOMENTO presenti nella collection, ma tutte le modifiche successive (aggiunta, modifica e cancellazione di elementi dalla collection) verrebbero ignorate. Per cui dovresti assegnare il datasource a nothing e poi di nuovo alla collection ogni volta che si verifica un cambiamento nell'elenco. Un refresh forzato e continuo, in pratica, e non so quanto possa interessarti.
Per rendere dinamico il databinding occorrerebbe implementare un'interfaccia che neanche ricordo come si chiami... per cui non posso aiutarti

Spero di averti dato qualche utile spunto per risolvere il problema, ma se qualcun altro conosce soluzioni meno laboriose e più efficaci mi farebbe piacere saperlo.
Ciao.
Luca
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