2010-05-25 18 views
5

Tengo un ListBox (MyListBox) en mi pantalla, y un Textbox (MyTextBox).Winforms, databinding, Listbox y textbox

ListBox está lleno con una lista (De T), que son todos los elementos personalizados.

Ahora trato de hacer esto:

El cuadro de lista' fuente de datos es la lista (Of T).

Ahora cuando un elemento cambia, quiero que el cuadro de texto se actualice a una propiedad particular del elemento seleccionado en mi ListBox.

En este código 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 

esto no funciona. Pero cuando me uno a SelectedValue en lugar de SelectedItem, funciona perfectamente.

El _listOfItems está declarada como esto:

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

Dónde MyItem es la siguiente:

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

he intentado anular el ToString() en MyItem por lo que sería usar eso. Pero eso tampoco funciona.

¿Alguien se preocupa por probarlo?

Gracias!

-Snakiej

Respuesta

9

Uno de la manera más fácil, supongo, sería el uso de un BindingSource, configurándolo como la propiedad ListBox.DataSource a su BindingSource en el diseño.

  1. Coloque un BindingSource en su formulario;
  2. Establezca su propiedad ListBox.DataSource en su BindingSource;
  3. Establezca sus propiedades ValueMember y DisplayMember tal como lo está haciendo realmente;
  4. Haga su DataBinding para su control TextBox, y use su BindingSource como fuente, usando su propiedad MyItem.Comment;
  5. Asigne su propiedad List(Of MyItem)``to your Binding.DataSource`;
  6. Su TextBox debe seguir la propiedad Comment de CurrencyManager.CurrentItem, es decir, la actualmente ListBox.SelectedItem.

De hecho, es posible que necesite implementar la interfaz INotifyPropertyChanged para que funcione correctamente.

Pero si todo esto funciona perfectamente con SelectValue, ¿por qué no lo usas?

+0

El SelectedValue es el id, necesito el comentario. Y no puedo usar eso para llamar a la base de datos :) ¡Probaré tu solución! – Snake

+0

¡Lo tengo! Tiene razón, si lo que quiere es ofrecerle una selección de opciones al usuario, no lo hagamos con el Id.= P –

+0

opción 5 no es necesaria :) y para la opción 4: uso este enlace: nuevo Encuadernación ("Texto", bindingSource1, "Comentario", ...) ya que usa la propiedad .Current de bindingSource ! ¡Gracias! – Snake

Cuestiones relacionadas