2011-06-29 64 views
6

Estoy usando un bindingsource en mi aplicación de formularios de Windows para rellenar algunos cuadros de texto, etc. en mi opinión. La vinculación funciona bien, pero ¿cómo puedo anular mi bindingSource de mi objeto?desvinculando bindingsource

bindingSource.DataSource = new Foo();//OK 
bindingSource.DataSource = null;//Not ok 

Si trato de desvincular estableciendo data = null me sale una excepción:

System.ArgumentException: No se puede enlazar a la propiedad o la columna de barras en la origen de datos. Nombre de parámetro: DataMember

no quiero para eliminar todos los enlaces a mis controles (no tengo mucho), pero me gustaría suspender vinculante siempre y cuando el BindingSource no tiene datos ....

Encontré una solución como esta bindingSource.DataSource = typeof(Foo); pero ¿es esta LA FORMA?

+0

¿Qué tipo es 'Foo'? – Tim

+5

solo un Foo obviamente – Gluip

Respuesta

0

No estoy al tanto de un .Data de propiedades del objeto BindingSource, pero hay una propiedad .DataSource, que se puede ajustar a nulo:

bindingSource.DataSource = null; 

Esto libera el origen de enlace de los datos. Sin embargo, mirando el reference for BindingSource.DataSource:

DataSource property    List results 
---------------------------- ------------------------------------------- 
null with DataMember set  Not supported, raises ArgumentException. 

Si estás utilizando un DataMember, no se puede establecer el origen de datos a nula y sin una excepción.

Lamentablemente no sé si su solución alternativa es una forma adecuada de hacerlo, pero al menos ahora sabemos que no se puede unir simplemente a nulo cuando se establece un DataMember.

+0

gracias por mirarlo. Me quedaré con la solución – Gluip

5

El tipo de "solución" es en realidad lo que hace el diseñador de formularios de Windows cuando configura el origen de datos de BindingSource en el PropertyGrid, y selecciona un tipo de "orígenes de datos de proyecto".

Mire el código generado en el archivo * .designer.cs para su formulario.

Utilizamos este "truco" en uno de nuestros productos, y ha funcionado bien desde hace muchos años.

Saludos

0

mrlucmorin le dieron la respuesta correcta. Está funcionando y es la manera correcta de manejar tal situación.

Sin embargo, no funcionará si su DataSource es de tipo DataTable. En tal caso, es posible que desee jugar con bs.RaiseListChangedEvents = false; antes de anular el BindingSource.DataSource y establecerlo en true después de asignar un nuevo DataSource. Inmediatamente después de establecerlo en verdadero, no olvide restablecer los enlaces con bs.ResetBindings(true);

Tenga en cuenta que esto podría causar que los datos de sus controles con datos 'antiguos' se eliminen.

Cuestiones relacionadas