Combo Box con più colonne

Una delle esigenze che spesso ricorrono usando la combobox e il databind è la possibilità di mostrare a display piu di un campo (proprietà o colonna) degli elementi della nostra fonte dati... ma purtoppo il displayMember offre la possibilità di specificare un solo nome di campo. Come fare dunque? La risposta che i più danno è quella di modificare ad ho la query in modo che risulti un campo espresione già formatta secondo le esisgenze del display... ma che brutto... perchè mai modellare così fortemente l'accesso ai dati secondo le esisgenze dell'interfaccia? :o

Oggi su microsoft.public.it.dotnet.vb ho dato questa rispota da cui vedrò di ricavare anche un tip o un articolo breve (sperando di non avere i miei soliti tempi geologici) :-p

http://groups.google.com/groups?hl=it&lr=&ie=UTF-8&selm=OfcZGImPEHA.808%40tk2msftngp13.phx.gbl

Non dimenticatevi l'ERRATA KORRIGE... ke nonostante fatto i test prima di postare non mi sono accorto di un enorme _bug_
http://groups.google.com/groups?hl=it&lr=&ie=UTF-8&selm=OQd1eKmPEHA.3044%40TK2MSFTNGP10.phx.gbl

posted @ venerdì 21 maggio 2004 01:39

Print

Comments on this entry:

# re: Combo Box con più colonne

Left by M.rkino at 12/10/2011 13:40
Gravatar
Wow mi stai riesumando un post del 2004 nel 2011! ;) Se non ricordo male la funzione era già fatta per trattare un numero n di colonne... un esempio su 3 colonne dovrebbe/potrebbe essere:

FillCombo(ComboBox1, dt, "ID", "{0} - {1} {2}", "ID", "Nome", "Cognome")

HTH

# re: Combo Box con più colonne

Left by Mariella at 12/10/2011 21:54
Gravatar
:-)
ciao e grazie per la velocità nella risposta però non so se così va bene! perchè io avevo modificato sia la classe "ItemFormatter" e la funzione "FillCombo" aggiungendo i campi (colonne) che mi interessano perchè dopo devo recuperare questi valori indipendentemente! (ad esempio inserirli in un form) e qui mi sono impantanata in quando non riesco a recuperarli! li ho tutti in una stringa e anche se decidessi di separarli, il mio problema e che non ho idea della natura dei dati per cui non saprei fare una funzione specifica per tokenizarli!
Invece avendo i metodi per estrarli per ogni colonna non avrei problemi!

grazie e ciao

# re: Combo Box con più colonne

Left by Mariella at 16/10/2011 00:59
Gravatar
ciao
io vorrei semplicemente avere la possibilità di recuperare i campi (niente client side javascript) io dicevo un "form" nel senso di un windows form. In pratica avere la possibilità di estrarre i campi per popolare delle textbox in un windows form!

# re: Combo Box con più colonne

Left by M.rkino at 17/10/2011 12:17
Gravatar
Scusa, in genero tratto web per cui pensavo si trattasse di cose web. Se è windows form puoi rivedere la funzione FillCombo mettendo nel value direttamente la row. Poi puoi riavere la tua riga velocemente così: "dim row as MyType = DirectCast(DirectCast(mycombo.SelectedItem, MyFormatter), MyType)"

M.

# re: Combo Box con più colonne

Left by Marco Barzaghi at 18/10/2011 18:23
Gravatar

La calsse ItemFormatter è da tenere AS IS. Rivedo la FillCombo togliendo il parametro ValueMember e rivedendo il codice come segue.

Public Sub FillCombo(ByVal Combo As ComboBox, ByVal source As DataTable, _
ByVal valueMember As String, ByVal formatDisplay As String, _
ByVal ParamArray displayMembers() As String)

=>

Public Sub FillCombo(ByVal Combo As ComboBox, ByVal source As DataTable, _
ByVal formatDisplay As String, _
ByVal ParamArray displayMembers() As String)

(...)

''''Dim value As Object = row.Item(valueMember)
Dim value As Object = row

list.Add(New ItemFormatter(value, description))

(...)

End Sub

Poi richiamo la procedura, senza il parametro rimosso.

FillCombo(ComboBox1, dt, "{0} {1}", "Nome", "Cognome")

Quando mi occorrerà recuperare i valori scriverò quanto segue

dim row as DataRow = DirectCast(ComboBox1.SelectedValue, DataRow)
dim nome = row.Item("Nome")
dim cognome = row.Item("Cognome")

HTH

# re: Combo Box con più colonne

Left by Mariella at 18/10/2011 18:33
Gravatar
ciao allora io ho provato a fare Dim riga As miotipo = DirectCast(DirectCast(combobox1.SelectedItem, MyFormatter), miotipo) dove miotipo è il tipo di dato che mi serve ad es string solo che non ho capito cos'è MyFormatter.

# re: Combo Box con più colonne

Left by markino at 18/10/2011 18:35
Gravatar
Considera solo l'ultimo esempio che ti ho postato.

# re: Combo Box con più colonne

Left by Mariella at 18/10/2011 22:15
Gravatar
ciao scusa ancora mi da un errore proprio su dim row as DataRow = DirectCast(ComboBox1.SelectedValue, DataRow) errore di casting su DataRow!
Senti se mi dai un indirizzo e-mail ti invio l'esempio che ho abbozzato e sicuramente ti rendi conto dove sbaglio! e cmq grazie per la tua disponibilità

# re: Combo Box con più colonne

Left by Mariella at 19/10/2011 12:52
Gravatar
3 invii e niente da fare provo a postare qui il codice va:

Codice inizio -----------------------

Public Class Form1


Public Sub FillCombo(ByVal Combo As ComboBox, ByVal source As DataTable, _
ByVal formatDisplay As String, _
ByVal ParamArray displayMembers() As String)

Dim list As New ArrayList
Dim row As DataRow


For Each row In source.Rows
Dim values(displayMembers.Length) As Object
Dim c As Integer
For c = 0 To displayMembers.Length - 1
values(c) = row.Item(displayMembers(c))
Next
'Dim description As String = String.Format(formatDisplay, displayMembers)
Dim description As String = String.Format(formatDisplay, values)

'Dim value As Object = row.Item(valueMember)
Dim value As Object = row

list.Add(New ItemFormatter(value, description))
Next
Combo.DataSource = list
Combo.ValueMember = "Value"
Combo.DisplayMember = "Description"
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim dt As New DataTable
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("Nome", GetType(String))
dt.Columns.Add("Cognome", GetType(String))
dt.Columns.Add("Indirizzo", GetType(String))
dt.Rows.Add(New Object() {1, "Marco", "Barzaghi", "Via Torquato"})
dt.Rows.Add(New Object() {2, "GB", "Anonymous", "via boo"})
dt.Rows.Add(New Object() {3, "Mariella", "Pulvirenti", "Via Roma 150"})
dt.AcceptChanges()
'FillCombo(ComboBox1, dt, "ID", "{0} | {1}", "Nome", "Cognome")
'FillCombo(ComboBox1, dt, "ID", "{0} - {1} {2}", "ID", "Nome", "Cognome")
FillCombo(ComboBox1, dt, "{0} {1} {2}", "Nome", "Cognome", "Indirizzo")
End Sub

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
'Label1.Text = ComboBox1.SelectedValue.ToString

Dim row As DataRow = DirectCast(ComboBox1.SelectedValue, DataRow)
Dim nome = row.Item("Nome")
Dim cognome = row.Item("Cognome")
Dim indirizzo = row.Item("Indirizzo")

TextBox1.Text = nome
TextBox2.Text = cognome
TextBox3.Text = indirizzo
End Sub
End Class

Codice fine ------------------------

ovviamente la classe ItemFormatter identica alla tua

# re: Combo Box con più colonne

Left by markino at 19/10/2011 17:53
Gravatar
Occorre rivedere la FillCombo. Riordina la sequenza finale di istruzioni come segue.

Combo.ValueMember = "Value"
Combo.DisplayMember = "Description"
Combo.DataSource = list

ti mando comunque il progetto funzionante via mail.

# re: Combo Box con più colonne

Left by Alessandro at 08/10/2012 22:20
Gravatar
Ciao, Grazie per la risposta, il mio problema era che, dopo aver impostato la combo multicolonna grazie alla tua classe, a fronte della selezione di uno degli elementi della combo, non mi aggiornava gli altri controlli textbox collegati in binding alla sorgente dati.
Ma ora leggendo i commenti precedenti e facendo le dovute modifiche per adattare il tutto al mio caso specifico, funziona tutto a meraviglia per cui ti ringrazio ancora e mi scuso per la richiesta inutile!

# re: Combo Box con più colonne

Left by M.rkino at 09/10/2012 01:15
Gravatar
@Alessandro nessun problema
Comments have been closed on this topic.
«giugno»
domlunmarmergiovensab
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789