2010-05-25 13 views
5

Ho un ListBox (MyListBox) sullo schermo e una casella di testo (MyTextBox).Winforms, databinding, Listbox e textbox

Il ListBox è pieno di una lista (Of T), che sono tutti articoli personalizzati.

Ora cerco di fare questo:

Il ListBox' origine dati è la lista (Of T).

Ora, quando un elemento cambia, voglio che la casella di testo sia aggiornata ad una particolare proprietà dell'elemento selezionato nel mio ListBox.

In Codice ciò significa:

Me.MyListBox.DisplayMember = "SelectionName" 
Me.MyListBox.ValueMember = "Id" 

MyTextbox.DataBindings.Add(New Binding("Text", Me._listOfItems, "SelectedItem.Comment", True, DataSourceUpdateMode.OnPropertyChanged)) 

Me.MyListBox.DataSource = Me._listOfItems 

questo non funziona. Ma quando lego a SelectedValue invece di SelectedItem funziona perfettamente.

Il _listOfItems è dichiarato come questa:

Dim _listOfItems As List(Of MyItem) = New List(Of MyItem)() 

Dove MyItem è questo:

public class MyItem 
{ 
    public string SelectionName { get; set; } 
    public int Id { get; set; } 
    public string Comment { get; set; } 
} 

ho provato l'override del ToString() in MyItem in modo che sarebbe usare quella. Ma neanche questo funziona.

A chi importa di provarlo?

Grazie!

-Snakiej

risposta

9

Uno dei modi più semplici, credo, sarebbe quella di utilizzare un BindingSource, impostandola come la proprietà ListBox.DataSource al BindingSource sul design.

  1. Lascia un BindingSource sul modulo;
  2. Imposta la proprietà ListBox.DataSource sul tuo BindingSource;
  3. Imposta le tue ValueMember e DisplayMember proprietà proprio come stai effettivamente facendo;
  4. Crea il tuo DataBinding per il tuo TextBox controllo e usa il tuo BindingSource come sorgente, usando la tua proprietà MyItem.Comment;
  5. Assegnare la proprietà List(Of MyItem)``to your Binding.DataSource`;
  6. La casella di testo deve seguire la proprietà Commento di CurrencyManager.CurrentItem, ovvero la corrente ListBox.SelectedItem.

In effetti, è necessario implementare l'interfaccia INotifyPropertyChanged per farlo funzionare correttamente.

Ma se tutto funziona perfettamente con il SelectValue, perché non lo usi?

+0

Il valore selezionato è l'ID, ho bisogno del commento. E non posso usarlo per chiamare il database :) Proverò la tua soluzione! – Snake

+0

Ho capito! Hai ragione, se quello che vuoi è offrire una scelta di scelta all'utente, non facciamolo con l'Id.= P –

+0

l'opzione 5 non è necessaria :) e per l'opzione 4: utilizzo questa associazione: nuovo Binding ("Testo", bindingSource1, "Commento", ...) poiché utilizza già la proprietà .Current del bindingSource ! Grazie! – Snake