Newsgroup: it.comp.lang.visual-basic
Titolo: [VB 2010] Combobox con riga vuota.

Ciao a tutti.
Mi si ï¿œ presentato il "solito" problema di avere alcune combo con la 
prima riga vuota, popolate all'apertura del form; serviranno come 
scelta di parametri per un filtro. La riga vuota naturalmente ha lo 
scopo di ignorare quel parametro.
 
Ho fatto una sub del genere:
 
    Public Sub RigaVuotaCombo(ByRef DT As DataTable, ByRef Combo As 
ComboBox, ByRef Campo As String)
        Dim Riga As DataRow = DT.NewRow
        Riga(0) = 0 'valorizzo l'indice
        Riga(1) = "" 'valorizzo la stringa vuota
        DT.Rows.InsertAt(Riga, 0) 'inserisco la riga
        Combo.ItemsSource = DT 'assegno la sorgente alla combo
        Combo.DisplayMemberPath = Campo  'assegno il campo da 
visualizzare
    End Sub
 
E' una schifezza? Se sï¿œ, quale ï¿œ il modo corretto di farlo?
Ho cercato in rete, ma onestamente ho trovato "milioni" di righe, che 
raggiungevano lo stesso risultato.
Grazie.
 
-- 
Fabrizio
 
 

 
 
 
Io utilizzerei una struttura o una classe Chiave-Valore. La istanzierei
N volte un una collection (magari una ObservableCollection) che darei in
pasto alla combo.
 
 
Esempio facile:
 
Public Structure stcChiaveValore
    Public Property Chiave As String 'Valore che serve al programma
    Public Property Valore As String 'Valore che vede l'utente
End Structure
 
 
Public Sub NomeFunzione()
 
    Dim OBSListaValoriCombo As New ObservableCollection(Of stcChiaveValore)
 
    Dim myStcMykeyValue As New stcChiaveValore
 
    'Primo valore "vuoto" della combo
    myStcMykeyValue.Chiave = ""
    myStcMykeyValue.Valore = "Selezionare un elemento"
 
 
    'Altri valori della combo
 
    myStcMykeyValue = New stcChiaveValore
    myStcMykeyValue.Chiave = "1"
    myStcMykeyValue.Valore = "Pippo"
 
    myStcMykeyValue = New stcChiaveValore
    myStcMykeyValue.Chiave = "2"
    myStcMykeyValue.Valore = "Pluto"
 
    myStcMykeyValue = New stcChiaveValore
    myStcMykeyValue.Chiave = "3"
    myStcMykeyValue.Valore = "Topolino"
 
 
    'Qui dico di prendere la ObservableCollection come source
    MiaComboBox.ItemsSource = OBSListaValoriCombo
 
    'Qui dico di prendere la proprietà "Chiave" della struttura come
valore da utilizzare
    MiaComboBox.SelectedValuePath = "Chiave"
    'Qui dico di prendere la proprietà "Valore" della struttura come
valore da mostrare all'utente
    MiaComboBox.DisplayMemberPath = "Valore"
 
 
End Sub
 
Volendo fare ancora più pulito e MVVM puoi assegnare la
ObservableCollection (chiamiamola OC) alla Combo da XAML invece che da
code-behind.
La cosa si complica un pochino perchè la OC deve diventare una proprietà
del form, e quindi non devi dichiararla nella funzione ma deve essere una:
 
Public Property OBSListaValoriCombo As New ObservableCollection(Of
stcChiaveValore)
 
Poi da XAML:
 
<ComboBox DisplayMemberPath="Valore" SelectedValuePath="Chiave"
ItemsSource="{Binding Path=OBSListaValoriCombo, Mode=OneWay}" />
 
Sono andato a memoria, scrivendo a mano quindi non è detto che qualcosa
non mi sia sfuggito. Comunque cercando su internet con le parole Key
Value trovi un pò di roba.
 
Nicola
 
 

 Nicola
 
Intanto grazie 1.000 Nicola, mi studio il tuo codice.
Rispetto alla mia, è una questione di "purismo"? Pazienta, sono un novizio :)
 
F.

 Rispetto alla mia, � una questione di "purismo"? Pazienta, sono un novizio :)
 
Si e no.
Diciamo che se domani vuoi cambiare la sorgente dei dati puoi modificare solo
la parte riguardante il popolamento della observablecollection lasciando fisso
tutto il resto. Viceversa, se domani vuoi eliminare la combo e sostituirla con,
ipotesi, una datagrid resta tutto uguale fino alla observablecollection e
cambia solo il pezzo di binding alla datagrid.
 
Su piccoli progetti pu� sembrare uno spreco di tempo ma alla lunga ripaga.
 
Nicola
 

 Nicola
Ho capito ed è quello che auspicavo mi venisse indicato.
Ti ringrazio ;-)