none
Actualizar textbox con datos de tablas distintas a la del BindingNavigator

    Question

  •  

    Hola. Necesito algo muy simple pero no sé bien cómo hacerlo en VB .NET 2005.

     

    Tengo un form con un bindingnavigator, con los campos "Código cliente", "Código transportista", "Código tarifa", etc. y que son clave primaria en otras tablas relacionadas con la del dataset del bindingnavigator. Lo que necesito es que en otros textbox aparezcan datos de estas tablas relacionadas, como "Nombre cliente", "Nombre transportista", "Descripción tarifa", y que se actualicen siempre que el usuario cambie de registro con el bindingnavigator (ya sea moviéndose, creando o eliminando registros, etc).

     

    ¿Hay algún evento genérico del bindingnavigator o del form que intercepte un cambio de registro para hacer ahí la actualización de estos textbox? ¿Hay alguna otra manera más sencilla? Os ruego me proporcionéis una muestra del código necesario.

     

    Muchas gracias y salu2.

    Friday, January 09, 2009 2:16 AM

Answers

  • Hola de nuevo Bobsoft,

     

    te has explicado perfectamente. Si tienes un BindingNavigator, este debes tenerlo asociado a un objeto BindingSource. Este BindingSource tiene una serie de eventos que te indican cuando se ha movido un elemento (tienes los eventos "PositionChanged", "CurrentChanged", "CurrentItemChanged", etc.. Con esto deberías poder capturar cuando el usuario se ha movido a otro elemento del DataSource (en tu caso, cuando ha cambiado de fila del DataTable).

     

    Ahora, lo que yo haría sería: añadir otro objeto BindingSource, que tenga como DataSource el DataSet que contiene las tablas a las que debes bindar los TextBox que quieres refrescar cuando el usuario cambie de fila. Este BindingSource tiene una propiedad llamada DataMember en la que debes especificar que DataTable del DataSet quieres que sea el origen de datos.

     

    Bindas los TextBox al nuevo objeto BindingSource (esto deberás hacerlo por código, mírate el enlace que te pasé antes).

     

    Cuando captures el evento conforme el usuario ha cambiado de fila, coges el ID de la nueva fila (ID de cliente o el que necesites) y se lo pasas a una función que lo que hará será filtrar en nuevo objeto BindingSource con ese ID, de forma que los TextBox se refresquen con los nuevos datos.

     

    Algo tal que así (esquematizado muy simple!):

     

    Code Snippet

    private void bindingSource1_PositionChanged(object sender, EventArgs e)

    {

    DataRow row = bindingSource1.Current as DataRow;

    string id = row[0] as string;

    bindingSource2.Filter=string.Format("IDCliente={0}", id);

    }

     

     

     

    Esto es lo que yo haría.

     

    Espero haberte ayudado!

     

    Si te sirve, porfavor, marca la respuesta como válida! Wink

     

    Gracias y suerte!

     

    Friday, January 09, 2009 12:05 PM

All replies

  • Hola BobSoft,

     

    deberías tener esos textBox bindados al DataSource del bindingnavigator. De esa forma, al moverte por un lado, actualizarias el otro. Para ello, debes utilizar la clase BindingSource.

     

    Aqui tienes más información:

     

    http://msdn.microsoft.com/es-es/library/system.windows.forms.bindingsource(VS.80).aspx

     

    Espero que te sirva!

     

    Si es así, porfavor, marca la respuesta como válida! Wink

     

    Gracias y suerte!

    Friday, January 09, 2009 11:22 AM
  • Hola Javier.

     

    Gracias por tu respuesta. He modificado mi pregunta porque quizás no la había expuesto bien.

     

    En el Datasource del bindingnavigator tengo la tabla correspondiente al form (por ej. la de cabecera de pedidos) y en esa tabla no están los campos que quiero añadir al form, sino en otras tablas relacionadas con ella. Quizás haya alguna forma de añadir al datasource estos datos de otras tablas pero no sé bien cómo hacerlo. Además, son muchos los campos clave que tengo en el form y quizás no sea la mejor forma ni la que mejor rendimiento dé, el añadir todas estas tablas relacionadas en el datasource del bindingnavigator (tampoco sé cómo hacerlo, porque solo he encontrado documentación sobre bindar tablas maestro detalle pero no campos sueltos).

     

    Yo esperaba hacer las búsquedas sobre otros datasets con dichas tablas que ya tengo creados, en algún método llamado desde la captura de los eventos de cambio de registro del bindingnavigator, pero tampoco sé dónde capturar este cambio de registro. De todas formas, si estimas que la mejor manera es vincular estos datos de alguna forma y que cambien automáticamente al cambiar de registro, también me valdría.

     

    Si sigo sin explicarme bien, por favor indicádmelo y pongo un ejemplo más detallado. Gracias.

     

    Friday, January 09, 2009 11:42 AM
  • Hola de nuevo Bobsoft,

     

    te has explicado perfectamente. Si tienes un BindingNavigator, este debes tenerlo asociado a un objeto BindingSource. Este BindingSource tiene una serie de eventos que te indican cuando se ha movido un elemento (tienes los eventos "PositionChanged", "CurrentChanged", "CurrentItemChanged", etc.. Con esto deberías poder capturar cuando el usuario se ha movido a otro elemento del DataSource (en tu caso, cuando ha cambiado de fila del DataTable).

     

    Ahora, lo que yo haría sería: añadir otro objeto BindingSource, que tenga como DataSource el DataSet que contiene las tablas a las que debes bindar los TextBox que quieres refrescar cuando el usuario cambie de fila. Este BindingSource tiene una propiedad llamada DataMember en la que debes especificar que DataTable del DataSet quieres que sea el origen de datos.

     

    Bindas los TextBox al nuevo objeto BindingSource (esto deberás hacerlo por código, mírate el enlace que te pasé antes).

     

    Cuando captures el evento conforme el usuario ha cambiado de fila, coges el ID de la nueva fila (ID de cliente o el que necesites) y se lo pasas a una función que lo que hará será filtrar en nuevo objeto BindingSource con ese ID, de forma que los TextBox se refresquen con los nuevos datos.

     

    Algo tal que así (esquematizado muy simple!):

     

    Code Snippet

    private void bindingSource1_PositionChanged(object sender, EventArgs e)

    {

    DataRow row = bindingSource1.Current as DataRow;

    string id = row[0] as string;

    bindingSource2.Filter=string.Format("IDCliente={0}", id);

    }

     

     

     

    Esto es lo que yo haría.

     

    Espero haberte ayudado!

     

    Si te sirve, porfavor, marca la respuesta como válida! Wink

     

    Gracias y suerte!

     

    Friday, January 09, 2009 12:05 PM
  • Gracias Javier. No había caído en los eventos del BindingSource. He estado haciendo pruebas para ver qué eventos utilizar para capturar el cambio de registro. He probado combinaciones de PositionChanged, CurrentChanged, CurrentItemChanged y otros eventos, pero ninguna funciona siempre bien, hay situaciones en los que no se refrescan los textbox con los nuevos datos, seguramente porque el evento se produce antes de que se carguen con los datos del nuevo registro los campos con las claves foráneas (código cliente, etc.) que "alimentan" estos textbox. Por ej., pasa si tengo x registros y borro el x-1; al cargar el último no se refrescan los textbox.

     

    La única combinación que parece funcionar más o menos bien es llamar al refresco simultáneamente en PositionChanged y ListChanged. Lo malo es que ListChanged se produce un montón de veces cuando cambio un dato en un registro existente y pulso Guardar (creo que se produce el mismo nº de veces que campos hay en el DataTable), lo cual ralentiza la carga del registro pues cada vez que se llama, se buscan los datos de cada textbox a refrescar.

     

    ¿Conoces la mejor combinación de eventos del BindingSource para que no se te escape ningún cambio de registro y además se produzcan después de haber cargado los nuevos datos en el form?

     

    Friday, January 09, 2009 3:55 PM
  • SALUDOS..

    Soy nuevo en la programación con Visual Basic 2010, tengo un formulario de datos personales con botones, agregar, buscar, modificar, y eliminar, y quisiera que al ingresar la cédula en un textbox9 y haga click en Button2(Buscar) me busque todos los registros de la base de datos, los demas textbox con los datos personales nombre, apellido, cedula, los tengo enlazados con BindingSource, y puedo moverlos con un BindingNavigator pero no se como es la sintaxis del BindingSource para buscar, agregar, modificar y eliminar registros.

    ¿podrias darme un ejemplo del codigo fuente que se usa en estos caso?

     

     

    Wednesday, July 06, 2011 11:26 PM