Como se puede adivinar, soy un poco nuevo .NET y sólo quiero hacer referencia a un control en un formulario de otro.

Por lo general me acaba de hacer el Formulario.De Control.De la propiedad, sino que no funciona y cada ejemplo que he encontrado a través de Google no funciona para mí.

Parece demasiado complicado con clases públicas, etc.

Hay una forma más sencilla de hacer esto? Estoy listo para tirar la toalla y simplemente utilizar una variable global en este punto.

Tengo el formulario que contiene el control quiero de referencia, frmGenerate que tiene un cuadro de texto llamado txtCustomerNo.

De esta forma a través de un evento de clic del botón quiero mostrar otra forma, frmCustomers, y que la forma de referencia el valor en txtCustomerNo.

frmCustomers.ShowDialog()

Tiene que ser algo simple que no soy el aferramiento.

Puede publicar su código? Su enfoque parece correcto en general.

OriginalEl autor Tom | 2010-12-17

8 Comentarios

  1. 4

    En el formulario con el control que desea para referencia:

    Public Property CustomerNo() As TextBox
        Get
            Return txtCustomerNo
        End Get
        Set(ByVal Value As TextBox)
            txtCustomerNo = Value
        End Set
    End Property

    En el formulario que desea hacer referencia al control:

    Dim CustomerNo as string = _sourceForm.CustomerNo.Text

    Es un mal diseño para hacer esto, pero es el método más simple – y debe establecer en su camino.

    Si son sólo interesante en el valor introducido en el cuadro de texto, a continuación, el siguiente podría ser mejor:

    Public ReadOnly Property CustomerNo() As String
        Get
            Return txtCustomerNo.Text
        End Get
    End Property

    La anterior requerirá la segunda forma de tener una referencia a la instancia real de la primera forma. Agregue el siguiente para la segunda forma:

    Private _sourceForm as frmGenerate
    
    Public Property SourceForm() As frmGenerate 
        Get
            Return _sourceForm
        End Get
        Set(ByVal Value As frmGenerate)
            _sourceForm = Value
        End Set
    End Property

    Ahora usted puede hacer lo siguiente cuando usted se encarga de la creación y puesta en marcha de su segunda forma:

    Dim customersForm as new frmCustomers
    customersForm.SourceForm = Me
    customersForm.Show()    

    EDICIÓN:
    He construido un proyecto de ejemplo para usted aquí:

    http://www.yourfilelink.com/get.php?fid=595015

    Hola, he añadido que el código exactamente y obtener una «Referencia a la no-miembro compartido requiere una referencia de objeto». Código en frmGenerate: Public ReadOnly Property Númerocliente() as String Get Return Me.txtCustomerNo.Texto End Get End Property. Código en frmCustomers abrió como un diálogo: frmGenerate.Númerocliente devuelve ese error. Es sólo a mí o es realmente demasiado complicado ot llegar al final voy a necesitar?
    Usted está tratando de acceder a la CLASE no es una INSTANCIA de la clase. Es por eso que usted está recibiendo la «referencia a la no-miembro compartido de error». Crear una instancia de la forma de objetivos en lugar de tratar de usar la antigua VB6 forma de «invocar» el formulario por su nombre. Es decir Dim frm = New MyForm, y, a continuación, frm.lo que sea, en lugar de la edad de MyForm.lo que sea…
    Que parece bastante simple, pero cuando me declare Dim frm = New frmGenerate y referencia txtCustomerNo, todo lo que veo es una cadena en blanco.
    Se está creando una nueva instancia. En su lugar usted necesita para enviar la instancia real de la forma a su segunda forma.

    OriginalEl autor Martin

  2. 1

    Usted necesita para asegurarse de que las propiedades de agregar son public, o no serán accesibles por otras clases.

    OriginalEl autor Oded

  3. 1

    Usted debería ser capaz de hacer lo que usted necesita para hacer referencia fuera de forma pública. En muchos casos eso es todo lo que se necesita.

    A veces, es útil crear un público de la propiedad o método. Y tiene el método de tomar el cuidado de los detalles. Por ejemplo, si sólo desea poder capaz de tener acceso al texto, puede crear una propiedad algo como esto (en C#).

    public string CustomerNo
    {
        get
        {
            return txtCustomerNo.Text;
        }
        set
        {
            txtCustomerNo.Text = value;
        }
    }

    OriginalEl autor Jonathan Wood

  4. 1

    Hacer un campo privado. Haga clic en «Refactorizar», seleccione «Encapsular Campo’. Esto creará automáticamente una propiedad pública para el campo.

    Otro enfoque es sobrecargar el constructor público.

    public CustomersForm(string property1, string property2...)
    {
         //Get the properties and do what is necessary.
    }
    
    //Parent Form
    
    CustomersForm frmCustomers = new CustomersForm(property1, property2..);

    También el envío de un control completo de la otra forma no es una buena estrategia. Compartir sólo los campos que son necesarios a través de las propiedades públicas/constructores.

    OriginalEl autor Aseem Gautam

  5. 1

    Una mejor manera de abordar esto es para pasar una referencia
    de un control en su clase, cambiar cualquier propiedad de allí
    con tu lógica, entonces «enviar» de vuelta a la forma de llamada.

    El truco aquí es asegurarse de que el código de la clase es el uso de la
    «ByRef» argumento en la llamada clase o de lo contrario no funcionará.
    En la memoria se hace referencia el mismo control, sin necesidad de crear nuevos
    propiedades, y que disminuye el código de fluencia.

    Por ejemplo, aquí es cómo usted puede deshabilitar un botón de su código de la clase.

    En el formulario, llame a su clase y pase el botón (o cualquier otro control):

    ' new the class your calling
    Dim CallClass As New ProgramCall
    ' pass the control as a by reference argument
    CallClass .SetUpTheCall("HOURLY", btnSendToBank)  

    Luego, en la clase:

    Public Sub SetUpTheCall(ByVal ParmToPass As String, ByRef btnSendToBank As Button)
    
    ' your class logic goes here...
    
    ' disable the send button on the calling form
    btnSendToBank.Enabled = False
    
    ' change the button text on the calling form
    btnSendToBank.text = "Disabled"

    OriginalEl autor Mike

  6. 1
    My.Forms.frmGenerate.txtCustomerNo.Text
    Bienvenido a Stackoverflow. ¿Te importaría ampliar su respuesta poco más para que los compañeros programadores para entender, cómo se ayuda a resolver el problema.

    OriginalEl autor Aronas

  7. 0

    Mientras que usted puede crear una propiedad en su segunda forma que devuelva los datos necesarios, usted puede apenas como fácilmente cambiar el Modificador propiedad de ese control. De forma predeterminada, los modificadores de los controles son privadas, y por lo tanto no es accesible a cualquier otra cosa que la forma actual. Haga clic en el control, y encontrar el Modificador de la propiedad. Establecer que para el Público, y usted será capaz de acceder a él desde fuera de la forma, tales como:

    Dim f As New SecondForm
    f.FirstNameTextBox.Text = "Bob"

    OriginalEl autor Brian M.

  8. 0

    Puedo guardar el nombre de la persona que inicia sesión en un cuadro de texto en el siguiente formulario después de iniciar la sesión como esta.
    Mi botón de inicio de sesión tiene las últimas líneas:
    Me.Hide() ( No A Mí.Close() )
    Admin.Show()
    Final

    Cuando el usuario introduce un nombre de usuario correcto y la contraseña, se oculta el formulario de inicio de sesión y abre la siguiente página, Admin.vb

    En el Admin_Load de la Administración.vb página como las últimas líneas me pone:

    Dim registra Como Cadena
    registra = inicio de Sesión.txtUser.Texto
    De inicio de sesión.Close(). ‘Cierre oculto de inicio de sesión.vb’
    End Sub

    Así, el usuario presiona el botón de inicio de sesión y se oculta el formulario de inicio de sesión con el valor que desee en el txtUser cuadro de texto. A continuación, se abre la página de Administración. El evento load de la página de Administración, se obtiene el valor de lo oculto página de inicio de sesión en el txtUser cuadro de texto y lo pone en el parámetro «registrada».
    Una vez que el valor se agarró, se cierra la página de inicio de sesión y las hojas de la sub. Todo sucede en un abrir y cerrar de ojos!
    Ahora que en cualquier lugar que desee utilizar el nombre de la persona que la sesión, como en un cuadro de texto, sólo tiene que utilizar «registrada».

    txtchangesby.Texto = registran

    Muy simple y funciona.

    OriginalEl autor Mark

Dejar respuesta

Please enter your comment!
Please enter your name here