2012-09-27 30 views
6

Tengo un formulario de captura para una orden de trabajo, y tiene un control CustomerBindingSource y WorksOrderBindingSource. La mayoría de los campos de edición están vinculados al WorksOrderBindingSource, con un ComboBox cuya lista está vinculada al CustomerBindingSource, y su SelectedValue está vinculado al campo CustomerId en el WorksOrderBindingSource. Esto es muy rutinario y estándar, no hay bromas aquí.¿Cómo puedo establecer un registro actual de BindingSource como nulo?

Luego, también tengo algunos campos de cuadros de texto en los que utilizo para mostrar las propiedades del cliente actualmente seleccionado, para la orden de trabajos actualmente editada. También he vinculado estos campos al CustomerBindingSource. Cuando se selecciona un cliente, estos campos muestran las propiedades de ese cliente como se esperaba.

Mi problema es cuando quiero utilizar el formulario para capturar una nueva orden de trabajo. Represento un nuevo objeto WorksOrder, con CustomerId == null y lo ato al WorksOrderBindingSource. No tengo ningún objeto en el CustomerBindingSource con un Id == null, por lo que, como era de esperar, el cuadro combinado desplegable está en blanco, pero la propiedad CustomerBindingSource.Current apunta al primer objeto del Cliente en ese origen de datos. Los campos de visualización vinculados al cliente muestran valores para ese cliente, mientras que aún no se ha seleccionado ningún cliente.

La única solución para esto que es aparente para mí parece torpe. En él, tengo dos fuentes de enlace tipeadas por el Cliente, una para un cliente seleccionado y para completar los campos de visualización del cliente, y otra simplemente para llenar el menú desplegable del cliente. Luego, tengo que manejar un evento de selección, y solo si se selecciona un cliente, encuentre ese cliente en el origen de enlace para los campos de visualización, y si no hay ninguno seleccionado, establezca el origen de datos para los campos de visualización en nulo. Esto se siente terriblemente torpe. ¿Hay alguna otra manera de lograr lo que quiero?

+0

¿Por qué no agregar un elemento "por favor-seleccione-un-cliente" a la fuente de enlace? – Bijan

+0

¿Qué sucede para obligar al usuario a guardar ediciones actuales para que se le asigne un CustomerID válido a su NewRow? –

Respuesta

1

me encontré con este tema con exactamente mi problema pero sin respuesta satisfactoria. Sé que es un tema viejo, pero alah ..

Terminé con una solución de trabajo: agregué un evento [PositionChanged] a mi bindingsource (sería su CustomerBindingSource).

 private void CustomerBindingSource_PositionChanged(object sender, EventArgs e) 
    { 
     if(<yourCombobox>.SelectedIndex==-1) 
     { 
      CustomerBindingSource.SuspendBinding(); 
     } 
     else 
     { 
      CustomerBindingSource.ResumeBinding(); 
     } 
    } 
0

Lo que yo uso para "limpiar" un BindingSource es establecer simplemente su origen de datos como esto:

CustomerBindingSource.DataSource = typeof (cliente);

Espero que esto ayude.

EDIT:

Para mayor claridad, cuando se establece la propiedad BindingSource.DataSource como se ha descrito, no hay nada que impida que los reasigne la fuente de datos original en un momento posterior:

//Retrieve customers from database 
List<Customer> Customers = WhatEverCallToDB(); 
CustomerBindingSource.DataSource = Customers; 

... 

//Later we need to blank the Customer fields on the Windows Form 
CustomerBindingSource.DataSource = typeof(Customer); 

... 

//Then again at a later point we can restore the BindingSource: 
CustomerBindingSource.DataSource = Customers; 

... 
+1

No deseo borrar el origen de enlace. Quiero que se sepa que no se selecciona ningún registro en la fuente de enlace, o 'activo'. – ProfK

+0

Pensé que querías decir que cuando creas un nuevo WorkOrder, quieres "en blanco" los campos relacionados con el Cliente. Si es así, entonces mi método funcionará, pero si malinterpreto su caso de uso, ¿podría aclararlo? –

+1

Quiero borrar los campos relacionados con el cliente, pero no quiero perder el conjunto de registros de clientes en 'CustomerBindingSource.DataSource'. Solo quiero que ninguno de esos registros sea seleccionado. – ProfK

Cuestiones relacionadas