• Viernes 8 de Noviembre de 2024, 16:46

Autor Tema:  sobre un evento  (Leído 2073 veces)

junahu

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
sobre un evento
« en: Miércoles 10 de Junio de 2009, 02:23 »
0
Hola amigos, quisiera saber si es posible crear un evento que afecte a todos los controles de un formulario; por ejemplo los controles TextBox que tengo en un formulario.
Podría añadirlos uno a uno, pero ¿se puede crear uno que afecte a todos los TexBox?.
Programo en Visual Basic Net 9.0.

Saludos y Gracias

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: sobre un evento
« Respuesta #1 en: Miércoles 10 de Junio de 2009, 13:48 »
0
A todos los controles no es conveniente, porque necesitaría tener un punto de unión es decir un textbox tendrá un evento textchanged, pero un timer jamás va a tener un evento textchanged porque no tiene una propiedad text, del mismo modo un picturebox podrá tener un evento ImageLoaded pero el timer no tiene propiedad picture ni propiedad image de modo que en base a qué propiedad deberá dispararse el evento, es decir cuando y porqué ?. El criterio debe ser unificado o sería un caos.

Justamente por eso cada tipo de objetos si que pueden ser unificados en torno a un evento que tienen en común, es decir, en este caso no es necesario crear un evento para ello, ya existe... sucede que no sabrás como utilizarlo...

Crea 4 textbox, haz dobleclick sobre el primero (textbox1) en el procedimiento de evento que se muestra en el código escribe:
messagebox.show ( sender.name & ": " & sender.text    )
Ahora todo lo que tienes que hacer es conectar los otros textbox a este evento,  cambia la vista en las propiedades desde propiedades a la de eventos, los otros textbox podrás engancharlos al mismo evento que que acabamos de escribir, incluso podrás engancharlo a ottros eventos diferentes y  de otros objetos, pero entonces como sabrás si el evento fue textchanged u otro ?.
si lo quieres hacer manualmente escribes al final de la firma del método ' private sub Tebox1_Textchanged(.....) handles Textbox1.Textchanged añades los demás ' , handles textbox2.TextChanged, handles Textbox3.Textchanged, etc...
No seas caótico, se coherente. Siempre podrás unificar en el mismo evento diferentes objetos cuya propiedad sea común y cuyo tratamiento sea común si no es el caso estárás haciendo un código complejo para nada... por probar, siempre podrás hacerlo.

En fin si hemos llegado a un lenguaje de objetos no tendría mucho sentido volver a generar código espagueti...
«Ma non troppo»
----> ModoVacaciones = False<----

junahu

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: sobre un evento
« Respuesta #2 en: Miércoles 10 de Junio de 2009, 21:08 »
0
muchas gracias Nebire.
Creo que dejé muy corta la pregunta, porque de la forma que me dices  es como lo hago.
El problema es que al pinchar en una pistola de código de barras, el resultado va al textbox activo; y estoy buscando una forma con la que  pueda reconocer el código y liste los valores de ese código.
En este momento lo he hecho de esta forma:
Cree un botón para activar la pistola y bloqueo todos los textbox menos uno, que es el que recoge el código que lista los datos.
Pero no puedo hacer otra cosa porque tiene que estar activado ese texbox.

Yo intentaba que no tuviese que desactivar los demás textbox, pero si se introduce en alguno de ellos un valor y resulte que es igual al código que lanza la pistola, me listaría los datos que pertenecen a otro campo.

Mochas gracia Nebire y saludos

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: sobre un evento
« Respuesta #3 en: Jueves 11 de Junio de 2009, 04:03 »
0
Pués no, no te explicaste bien, antes preguntabas como lograr que varios controles respondan a un evento, ese tema está resuelto, pero ahora dices que no es ese tu problema.
Lo cierto es que la pregunta del primer mensaje si la entendí (aunque no fuera eso lo que querías preguntar), en cambio ahora tengo mis dudas sobre si entendí correctamente tu problema.

Para hacer preguntas correctamente tienes que aislar el problema del caso que ter atañe, si no consigues separar lo uno de lo otro sólo ayuda a la confusión.

De acuerdo a lo que creo que haber entendido será con lo que te conteste, si equivoqué tu explicación intenta redefinirlo con más claridad.
 
Vamos a ver, parece ser que tienes varios textbox y parece ser que tienes un botón que al activarlo pasa unos datos al textbox activo (no entiendo para qué)... luego dices que tienes que desactivar textbox para que en el caso de que al introducir un dato y dicho dato coincida con el que se ingresa a través de ese botón no produzca un error porque luego genera unos datoa extra tomados de otros campos...

Bueno si esto es así, el problema es bastante sencillo, tanto que me hace dudar, al punto que me obliga a preguntarme si he interpretado correctamente tu cuestión o si estás haciendo una idiotez...
Si un textbox contiene un código específico que difiere del código que deben ejecutar otros textbox, entonces la solución es atender dicho textbox en su propio evento aparte del resto. Reunir el disparo de eventos de varios controles a un mismo método sólo tiene sentido si todos ellos comparten el mismo código, si cada textbox ha de hacer una cosa distinta, no sólo no es adecuado sino absurdo reunir los eventos en un único método, porque luego tendré que separar lo que debe hacer uno de otro.

en el supuest caso de que todos los textbox ejecuten el mismo código pero además luego cada uno (o determinados de ellos) ejecuten adicionalmente o alternativamente otro código, entonces debes resolverlo de 1 de 2 maneras:
Si reúnes los disparo de evento en un mismo método  , si hay código que se ejecuta de modo particular previo al código común debes seleccionar el origen:
Código: vb.net
  1.  
  2. private sub textbox1_textchanged(....) handles textbox1.textchanged, ....
  3.    ' 1º  código particular previo de cada caso, si no hat código previo particular para cada caso, esta selección se elimina  
  4.    select case sender.name.ToUpper
  5.              case "TEXTBOX1"
  6.                      ' código particular para este caso...
  7.            case "TEXTBOX2"
  8.                     ' código particular para este caso
  9.           cas else
  10.                  ' código previo particular para el resto
  11.     end select
  12.  
  13.   ' 2º código común (si existe) para todos los textbox
  14.  
  15.  ' 3º código particular después del código común (si existe) para cada caso
  16.   select case sender.name.ToUpper
  17.              case "TEXTBOX8888"
  18.                      ' código particular para este caso...
  19.            case "TEXTBOX345", "TEXTBOX21", "TEXTBOX45", "TEXTBOX23" ' por ejemplo si 4 textbox comparten el mismo código
  20.                     ' código particular para este caso
  21.           case "TEXTBOX_PISTOLA"
  22.                     ' código particular para este caso de pistola
  23.     end select
  24.  ' si procede pueden disponerse más pares ( como el paso 2º y 3º) que pudieran ser necesarios
  25. end sub
  26.  
  27.  

Como puedes ver puedes seleccionar que textbox ha sido el que cambió su texto para hacer la acción requerida, si tien antes o después del código común que hacer alguna cosa, pués con la selección previa y/o posterior se especifica el código para ese caso concreto que no comparte con todos.
Si los casos son muy complejos, entonces no conviene unificar los eventos en uno, si no que cada textbox tenga su evento o unir sólo los que actúen igual.
Código: vb.net
  1.  
  2. private textbox567_TextChanged(...) handles Textbox567.textChanged
  3.      '1º  código para este caso particular previo a un código común que comparte (si se da el caso)
  4.  
  5.     ' 2º código que comparte con otros controles (si se da el caso)
  6.       call TextboxCódigocompartido  ' invoca una rutina que realiza un código que comparten varios textbox
  7.  
  8.    '3º código particular (si se da el caso) posterior a un código común
  9.  
  10.  ' si hay más pasos donde se alternan código compartido y código particular se repiten los pasos 2º y 3º tantas veces como sea necesario.
  11. end sub
  12.  
  13. ' Hacer lo propio con el resto de textbox...
  14.  
  15.  

En fin, yo no veo que tengas que deshbilitar textbox para que se ejecute un código o se identifique tal o cual cosa correctamente, salvo que no haya entendido bien lo que tratas de explicar.
Pero vamos si simplemente no quieres que un textbox ejecute un código en la forma que dices, tal vez el código debas ejecutarlo en el propio botón... Además un textbox se utiliza para que un usuario introduzca manualmente datos, si estos datos han de preceder de un origen distinto que una introducción manual entonces el control adecuado no es un textbox, sino un label... que muestra el usuario los datos pero no le permite modificarlos y/alternativamente si precisa que luego el usuario modifiique manualmente dichos datos puede proveerse un textbox, pero decidir esto va en consonancia con las especificaciones del problema que sólo tu conoces y que no logras explicar bien o por lo menos yo no te entiendo.

Si pusieras código sería más fácil explicar lo que quieres y más fácil ofrecer una solución que 'oyendo al vuelo' y 'respondiendo al vuelo'
«Ma non troppo»
----> ModoVacaciones = False<----

junahu

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: sobre un evento
« Respuesta #4 en: Sábado 13 de Junio de 2009, 22:54 »
0
gracias de nuevo Nebire.

A ver si me se explicar mejor ahora:
- creo un formulario donde quiero listar los valores de artículos de una tienda.
- tengo 10 textbox en un formulario que nos lista los valores de un datatable.
- estos textbox están enlazados al datatable con un BindingSource.
- en este formulario puedo ver todos los artículos de la tienda.
- tambien puedo añadin nuevos, modificar y eliminar los articulos.

- creo otro textbox y un botón para activar la pistola de código de barras:
  Utilizo un nuevo botón y otro textbox para obligar a que el textbox activo sea este. Esto lo hago por que si se pincha en la pistola de código de barras (al pinchar, manda el valor del código al textbox activo) manda el valor a cualquier textbox que este activo.

Pero ya he encontrado la posibilidad de no utilizar el botón y el textbox. Como la pistola termina con enter, utilizo el evento KeyPress para reconocer que se ha utilizado la pistola.