2009-03-30 18 views
5

Imagínese estas dos clases:vinculante en WinForms desplegable

class Part 
{ 
public string Name { get; set;} 
public int Id { get; set; } 
} 

class MainClass 
{ 
public Part APart { get; set;} 
} 

¿Cómo puedo enlazar MainClass a un cuadro combinado en un WinForm, por lo que muestra Part.Name (DisplayMember = "Name";) y el elemento seleccionado del combo establece el Propiedad APart de MainClass sin la necesidad de manejar ningún evento en el menú desplegable.

Por lo que yo sé, el establecimiento de ValueMember del ComboBox a "ID" significa que se va a tratar de poner aparte a un número (Id), que no está bien.

Espero que esto sea lo suficientemente claro!

+0

Buena pregunta. Siempre he hecho cosas por identificación nunca por objetos. – Tony

+0

¿alguien puede cambiar "propiedad" en el código a "público"? – Sung

Respuesta

1

Lo que está buscando es tener el ValueMember (= ComboBox.SelectedItem) ser una referencia del objeto en sí, mientras que DisplayMember es una propiedad única del elemento, ¿correcto? Por lo que yo sé, no hay una buena manera de hacer esto sin crear su propio ComboBox y haciendo el mismo vinculante, debido a la forma ValueMember y DisplayMember trabajo.

Pero, aquí hay un par de cosas que puede intento (suponiendo que tiene una colección de Part s en alguna parte):

  1. Sustituir el `ToString()` de `Part` para devolver el` Nombre `propiedad. Luego, establezca `ValueMember` de` ComboBox` en `" APart "` y deje `DisplayMember` nulo. (No comprobado, entonces no hay garantías)
  2. Puede crear una nueva propiedad en Parte para devolver una referencia a sí mismo. Establezca el 'ValueMember' a la nueva propiedad y 'DisplayMember' a `" Name "`. Puede parecer un truco, pero debería funcionar.
  3. Haz cosas divertidas con tu getter y setter `APart`. Perderá un poco de tipado fuerte, pero si convierte `APart` en un objeto y` MainClass` contiene la colección de `Part`s, puede establecerlo por` Id` (`int`) o` Part`. (Obviamente, usted querrá ser su creación por Id cuando se enlaza el cuadro combinado a ella.)
Part _APart; 
object APart 
{ 
    get {return _APart;} 
    set { 
     if(value is int) 
      _APart = MyPartCollection.Where(p=>p.Id==value).Single(); 
     else if(value is Part) 
      _APart = value; 
     else 
      throw new ArgumentException("Invalid type for APart"); 
    } 
} 
0

hice un poco de investigación y encontraron this article donde el autor ha sido capaz de unirse a las propiedades anidadas mediante la extensión del componente de fuente de unión estándar.
Lo he intentado y parece funcionar bien.

0

Si se establece el ValueMember del cuadro combinado a null, el enlace de datos devolverá el elemento seleccionado (es decir, la instancia de la Parte) en lugar del miembro especificado. Establezca DisplayMember en 'Nombre'.

+0

¿Puedes proporcionar un fragmento de trabajo de esto por favor? No puedo hacerlo para hacer lo que dice que hace al configurar ValueMember como nulo. – Khash

0

crear una clase de soporte para sostener la "información", y crear propiedades para todos los datos. A continuación, aplicar System.ComponentModel.INotifyPropertyChanged en dicha clase, algo así como:

private String _SelectedPart = String.Empty; 

public String SelectedPart 
{ 
    get 
    { 
     return _SelectedPart; 
    } 
    set 
    {    
     if (_SelectedPart != value) 
     { 
     _SelectedPart = value; 

     // helper method for handing the INotifyPropertyChanged event 
     PropertyHasChanged(); 
     } 
    } 
} 

entonces crear un "ObjectDataSource" para esa clase (Shift-Alt-D en VS2008 traerá eso mientras se mira en un formulario), entonces haga clic en el cuadro combinado y establezca las siguientes propiedades:

origen de datos, ajuste a la "BindingSource" ObjectDataSource que acaba de crear. DisplayMember, establecer en el nombre propertity de la lista de piezas ValueMember, establecer en el miembro ID de la lista de piezas DataBindings.SelectedValue, establecer en SelectedPart en el "BindingSource" que acaba de crear.

Sé que lo anterior suena complejo, y podría llevar un poco encontrar todas las partes que acabo de describir (desearía dar un tutorial o una captura de pantalla), pero realmente es MUY rápido hacerlo una vez que te acostumbras .

Esto, por cierto, se considera "vinculante de datos" en .NET y hay algunos buenos tutoriales que pueden brindarle más información.

+0

Gracias por su publicación sobre el enlace de datos. Sin embargo, esto no responde a la pregunta sobre el enlace al objeto de búsqueda en lugar de al id del objeto de búsqueda. – Khash