none
Un consulta sobre controles de usuario. Me gustaría saber cómo se añade el siguiente detalle. RRS feed

  • Pregunta

  • Por ejemplo cuando dibujo un control Button sobre un formulario. Por defecto el botón tiene como texto Button1 o Button3

    Es decir el nombre de la instancia recién creada.

    En un control de usuario cómo hago para que al arrastrar el control sobre el formulario (modo diseño), el nuevo control de usuario adquiera como texto el nombre de la instancia, en otras palabras ¿Cómo obtengo ese nombre de instancia? que es el mismo texto del nombre del control, pero con un número que se añade automáticamente.



    • Editado James2016-2 domingo, 25 de octubre de 2020 1:49
    domingo, 25 de octubre de 2020 1:48

Todas las respuestas

  • automaticamente arrastras un control al formulario aparece el nombre que tiene dicho control si agregas otro del mismo tipo automaticamente a este sele incrementa un numero concatenado al nombre de dicho control indicando el numero de controles que hay del mismo tipo
    • Editado DANTE-3D domingo, 25 de octubre de 2020 18:55
    domingo, 25 de octubre de 2020 18:54
  • automaticamente arrastras un control al formulario aparece el nombre que tiene dicho control si agregas otro del mismo tipo automaticamente a este sele incrementa un numero concatenado al nombre de dicho control indicando el numero de controles que hay del mismo tipo

    Sí claro, entiendo que se crea automáticamente, pero me refiero cómo puedo obtener ese valor creado automáticamente desde dentro de la instancia de un control de usuario (ese creado desde el menú Proyecto\Agregar control de usuario...)

    Por ejemplo, en un control Button estándar ese valor lo asignan a su propiedad Text (que es su valor por defecto), obviamente ese valor creado automáticamente para el nombre, lo obtienen de algún lado, la consulta es de donde obtienen el valor para asignarlo a la propiedad Text cuando se crea una nueva instancia del botón.



    • Editado James2016-2 domingo, 25 de octubre de 2020 21:04
    domingo, 25 de octubre de 2020 21:02
  • no hace mucho hice mi propio boton en el texto que mostraba use un label y le puse como nombre Click Button cuando ponia varios de mis botones automaticamente el le agregaba un numero ok sobre tu pregunta eso lo hace visual studio de manera interna pero si en tu caso no pasa eso entonces toma el nombre del control base como referencia y dile que para la propiedad text de tu etiqueta si es que tienes una etiqueta o cualquier control y que el nombre sera igual al del control base odviando el nombre y solo extraes el numero que tiene al final y si ese no es el caso y solo quieres obtener ese nombre lo puedes obtener desde su evento Show que es el evento que se ejecuta cuando se muestra el control

        Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
            Dim nombre As String = Me.Text
            MsgBox(nombre)
        End Sub

    • Editado DANTE-3D lunes, 26 de octubre de 2020 0:43
    lunes, 26 de octubre de 2020 0:35
  • no hace mucho hice mi propio boton en el texto que mostraba use un label y le puse como nombre Click Button cuando ponia varios de mis botones automaticamente el le agregaba un numero ok sobre tu pregunta eso lo hace visual studio de manera interna pero si en tu caso no pasa eso entonces toma el nombre del control base como referencia y dile que para la propiedad text de tu etiqueta si es que tienes una etiqueta o cualquier control y que el nombre sera igual al del control base odviando el nombre y solo extraes el numero que tiene al final y si ese no es el caso y solo quieres obtener ese nombre lo puedes obtener desde su evento Show que es el evento que se ejecuta cuando se muestra el control

        Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
            Dim nombre As String = Me.Text
            MsgBox(nombre)
        End Sub

    Hola, creo que no me expliqué bien, lo que dices es correcto y así funciona también mi control de usuario, o sea arrastro el control al formulario y le pone por ejemplo Control1, al siguiente Control2, Control3... y así, hasta allí funciona, es correcto, eso lo asigna automáticamente a la propiedad Name, como en un control Button que lo llama Button1, Button2 y así.

    Lo que trato de averiguar, es cómo puedo obtener el texto de ese nombre automático recién creado y visualizarlo ya sea en un Label, un MessageBox, o en cualquier propiedad que visualice texto.

    Porque si visualizo la propiedad Name (desde el código del propio control de usuario) me visualiza el nombre original del control que está bien, pero cómo puedo obtener el nombre de la instancia desde dentro del control original, no sé si ahora se entiende. No es muy prioritario, pero es un detalle que me gustaría saber cómo se puede conseguir.


    • Editado James2016-2 lunes, 26 de octubre de 2020 22:32
    lunes, 26 de octubre de 2020 22:32
  • ok a ver si le entiendo lo que me dices es que quieres el nombre de la nueva variable que esta instanciando al control  por ejemplo  tienes una variable llamada InstanciaFrm que hace referencia a tu formulario si extraes el nombre lo que te muestra es por ejemplo Form1 pero lo que quieres es que te muestre como nombre InstanciaFrm si es eso lo que quieres se me ocurren algunas formas de obtener ese nuevo nombre aunque este haciendo referencia a un control por ejemplo
    Public Class Form1
    
        'variable public de instancia
        Public Instancia_Frm As Form
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            'Instanciamos nuestro control que en este caso es el formulario
            Instancia_Frm = Me
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'Extraemos todos los nombres de los mienbros de instancia que estan creados 
            'esto nosda una lista de miembros por ello hacemos una comprobacion con un If Then. una palabra contenida en dicho nombre para a si obtener una busqueda mas exacta
            For Each Nombre As Reflection.MemberInfo In Me.GetType.GetMembers(Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance)
                If Nombre.Name.Contains("_Frm") Then
                    MsgBox(String.Format("Nombre de nueva instancia: {0}", Nombre.Name))
                End If
            Next
        End Sub
    
    End Class
    
    Si no es lo que busca al menos ese ejemplo sirve para buscar miembros de un objecto jejeje lo importante es que estamos para ayudarle a si que siga preguntando y no se preocupe que el que aprende es el que  estudia y pregunta lo que no sabe para a si aprenderlo la programacion no es tarea facir pero si aprendes todos los ejemplos que le sean posible notaras que al momento de programar te sera mas facir encontrarle la logica a las cosas que queremos hacer al momento de programar
    martes, 27 de octubre de 2020 12:58
  • Gracias de todos modos, recién lo veo.
    miércoles, 28 de octubre de 2020 0:56
  • Hola James

    Alguna actualización sobre tu consulta?

    Saludos

    --------------------------------------------------------------------------------

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    jueves, 29 de octubre de 2020 21:24
    Moderador
  • Hola James

    Alguna actualización sobre tu consulta?

    Saludos

    --------------------------------------------------------------------------------

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    No gracias, solo a la espera de que quizá alguien la vea y responda.
    jueves, 29 de octubre de 2020 22:31
  • Hola James20116-2 lo que tu quieres es que al arrastrar tu control creado obtengas el nombre de ese control?

    viernes, 30 de octubre de 2020 14:58
  • Hola James20116-2 lo que tu quieres es que al arrastrar tu control creado obtengas el nombre de ese control?

    Hola, te explico de nuevo, estoy seguro que se debe poder, solo que creo que no me deje entender. Aquí voy:

    Cuando arrastro un control Button, ocurre lo siguiente:

    Obsérvese que VB.NET le asigna automáticamente a la nueva instancia, en su propiedad Name el mismo nombre del control pero con un número, para diferenciarlo de otras instancias del mismo control. 

    En un control de usuario cualquiera hace exactamente lo mismo, a su propiedad Name le asigna el nombre del control de usuario con un número, para diferenciarlo de otras instancias del mismo control.

    Hasta allí, OK, se entiende. Sobre eso no hay duda.

    La consulta es la siguiente: Observa que al arrastrar el control Button el mismo nombre de la propiedad Name (que es automático) se le asigna a la propiedad Text. Lo que trato de hacer es emular eso, o sea si a mi control de usuario le agrego digamos una etiqueta Label, cómo le asigno a su propiedad Text de ese label el nombre generado automáticamente al arrastrar y crear una nueva instancia.

    Esa asignación se debe realizar en el código del control original, no de la instancia creada. ¿Pero óomo obtengo ese nombre que se creó automáticamente? 

    Si aun así no se entiende me dices y trato de aclarar. Es un poco enredado para explicarlo, pero es sencillo.

    En pocas palabras quiero emular el comportamiento de Button que le asigna a su propiedad Text de la nueva instancia el valor creado atuomáticamente en su propiedad Name.

    ------------------------------------

    Más claro: Crea un control de usuario y agrégale una etiqueta y trata que funcione así: Que cuando arrastres el control al formulario el texto de la etiqueta label visualice automáticamente el nombre de esa instancia.



    • Editado James2016-2 domingo, 1 de noviembre de 2020 19:48
    domingo, 1 de noviembre de 2020 19:43
  • OK para eso te sirve el evento HandleCreated y dentro pones algo como esto
       Private Sub UserControl1_HandleCreated(sender As Object, e As EventArgs) Handles Me.HandleCreated
            For Each controles As Control In Me.Parent.Controls
                If TypeOf controles Is UserControl Then
                    Me.Name = Me.Text
                    Exit For
                End If
            Next
        End Sub
    despues de poner ese codigo cada ves que arrastres el control de usuario a un control contenedor como lo es por ejemplo un formulario el texto que este en la propiedad Text se agrega a la propiedad Name
    domingo, 1 de noviembre de 2020 21:08
  • OK para eso te sirve el evento HandleCreated y dentro pones algo como esto
       Private Sub UserControl1_HandleCreated(sender As Object, e As EventArgs) Handles Me.HandleCreated
            For Each controles As Control In Me.Parent.Controls
                If TypeOf controles Is UserControl Then
                    Me.Name = Me.Text
                    Exit For
                End If
            Next
        End Sub
    despues de poner ese codigo cada ves que arrastres el control de usuario a un control contenedor como lo es por ejemplo un formulario el texto que este en la propiedad Text se agrega a la propiedad Name

    Hola, me parece que en lo que me dices está la solución de lo que trato de hacer pero aún no logro que haga exactamente lo que quiero. Debe funcionar así:

    Crea un control de usuario y agrégale una etiqueta (solo eso para probar).  Al arrastrar ese control sobre el formulario, la etiqueta que contiene debe visualizar el nombre que se le asignó al control automáticamente.

    domingo, 1 de noviembre de 2020 23:05
  • si solo cambia el

    Me.Name = Me.text

    por algo como

    Me.Label1.Text = Me.Name

    domingo, 1 de noviembre de 2020 23:50
  • si solo cambia el

    Me.Name = Me.text

    por algo como

    Me.Label1.Text = Me.Name

    No me sale 😢

    Yo deseo que al primer control le ponga MiControl1, al segundo MiControl2 y al tercero MiControl3, o sea que le ponga el nombre del botón creado, pero solo le pone el nombre del control de usuario:

    Este es el código:

    Public Class MiControl
      Private Sub UserControl1_HandleCreated(sender As Object, e As EventArgs) Handles Me.HandleCreated
        For Each controles As Control In Me.Parent.Controls
          If TypeOf controles Is UserControl Then
            Me.Label1.Text = Me.Name
            Exit For
          End If
        Next
      End Sub
    
    End Class

    lunes, 2 de noviembre de 2020 1:27
  • que raro yo lo probe con un label y si me funciona. al label le pone el nombre del control
    lunes, 2 de noviembre de 2020 5:58
  • que raro yo lo probe con un label y si me funciona. al label le pone el nombre del control
    Le pone el nombre en tiempo de ejecución, pero no en tiempo de diseño, o sea cuando arrastro no se lo cambia. Puse el código en un proyecto en blanco solo con un formulario, qué será.
    lunes, 2 de noviembre de 2020 14:18
  • Ok a mi no me pasa eso pero una solucion podria ser haciendo algo como esto
     Private Sub Boton_HandleCreated(sender As Object, e As EventArgs) Handles Me.HandleCreated
            Dim controles As Control
            Static cont As Integer = 0
            For Each controles In Me.Parent.Controls
                If TypeOf controles Is UserControl Then
                    cont += 1
                    Me.Label1.Text = Me.Name.Replace("1", cont.ToString)
                End If
            Next
        End Sub
    Prueba ese codigo a ver si funciona. ya que en la pc que estoy no tiene visual studio instalado pero logicamente deberia de funcionar

    • Editado DANTE-3D lunes, 2 de noviembre de 2020 14:42
    lunes, 2 de noviembre de 2020 14:40
  • Ok a mi no me pasa eso pero una solucion podria ser haciendo algo como esto
     Private Sub Boton_HandleCreated(sender As Object, e As EventArgs) Handles Me.HandleCreated
            Dim controles As Control
            Static cont As Integer = 0
            For Each controles In Me.Parent.Controls
                If TypeOf controles Is UserControl Then
                    cont += 1
                    Me.Label1.Text = Me.Name.Replace("1", cont.ToString)
                End If
            Next
        End Sub
    Prueba ese codigo a ver si funciona. ya que en la pc que estoy no tiene visual studio instalado pero logicamente deberia de funcionar

    mm, para ser franco no me gusta mucho esa solución, de verdad agradezco que te tomes el tiempo para responder, me gustaría obtener el mismo valor creado porque ocurre que a veces no es correlativo ese número, cuando se borran algunos controles que recién se añadieron o cuando se les cambia de nombre a algunos de ellos.

    De todos modos gracias por todo, voy a seguir intentando, aunque no es algo vital que me impida seguir avanzando, me gustaría hacerlo así.

    lunes, 2 de noviembre de 2020 16:23