Como acceder a controles de un formulario desde otra clase?

Iniciado por Rakzo-Fimbres, 29 Junio 2008, 23:01 PM

0 Miembros y 1 Visitante están viendo este tema.

Rakzo-Fimbres

En Visual Basic.NET no hay problema, ya que cuando estamos en una clase solamente hacemos esto (un ejemplo):
'ProgressBar1.Value = 20 'Si hacemos esto, no reconocera el objeto, tendriamos que agregar...
frmMain.ProgressBar1.Value = 20


Pero al hacer lo mismo en C#, no reconoce las propiedades de la progressbar ni el objeto.. cómo lo puedo solucionar?

SeniorX

Yo lo que hago es en la clase form1 hago un:
Funciones fn = new Funciones();
ProgressBar1.Value = fn.valorBarra();


Donde Funciones es la clase que tiene una funcion que se llama valorBarra que retorna un int.

Ojala quede claro! Sino pregunta

Suerte!
try {
     live();
}
catch (ShitHappensException ex) {
MessageBox.Show(ex.Solution)
}

Precaución: La programacion puede producir adiccion

Rakzo-Fimbres

#2
O sea haces una funcion?

A lo mejor me expliqué mal men.. Aver un ejemplo..

Digamos que tenemos "Form1" y agregamos una clase "Clase1"
En Form1 agregué un botón btnComenzar y con un Text = "Comenzar"

Ahora, trabajo con la clase, y al estar allí necesito cambiar el valor Text de btnComenzar a:
btnComenzar = "Pausar"

Pero al escribir btnComenzar, me aparece el error:
El nombre "btnComenzar" no existe en el contexto actual

Es decir como acceder a los controles del Form1 desde la Clase1

SenirX me podrias dar un ejemplo más claro por favor.
Gracias..

MANULOMM

claro, no puedes acceder asi de facil, pues cuando hace esto:

    Form A = new Form();

creas una nueva instancia, y es alli donde se crean los controles... tendrias que crearte un metodo estatico que llamarias desde la clase para que cambie el texto del control.

Atentamente,


Juan Manuel Lombana
Medellín - Colombia


zheo

El problema que tienes suena a que en VB.NET -dios sabe por qué oscura razón- si no especificas el ámbito de las variables miembra éstas se consideran publicas. En C# por el contrario son privadas por defecto -lo que debería ser lógico y normal... di tú que VB nunca fue muy lógico ni muy normal.

Por tanto en VB puedes hacer algo como
form1.BarraProgreso.Value
y en C# no, porque en el primero tienes acceso público a la variable miembro, y en el segundo no

Si lo que quieres es acceder desde una clase a una variable miembro de otra clase y modificarla tienes muchas soluciones. La más sencilla es establecer la variable miembro como pública, algo realmente chapucero.

También puedes exponer la variable miembro como una propiedad, pero en este caso sería como establecerla pública pero escribiendo más.

Algo un poco más elegante es exponer en tu clase form1 el dato que necesitas de la variable miembro como una propiedad (o método), por ejemplo:

public class Form1 : System.Windows.Forms.Form
{
  ...
  private ProgressBar ProgressBar1 ;
  ...
 
  public int ProgressBarValue
  {
     get { return this.ProgressBar1.Value; }
     set { this.ProgressBar1.Value = value; }
  }
   ...
}


y entonces podrías hacer:

Form1 form1 = new Form1();

form1.ValorBarraProgreso = 20;


Pero en tu caso particular (acceder a form1 desde otra clase) tendrías que tener una referencia a la instancia de form1 para poder acceder a la propiedad que acabas de crear. Eso lo puedes hacer pasándo form1 como referencia en el constructor de la clase y guardándola en una variable miembro privada a la clase (Dependency Injection):

public class class1
{
    private Form1 _mainForm;

    public class1(Form1 f)
    {
         //TODO: test f == null
         _mainForm = f;
    }

    public void SetFormProgressBarValue(int value)
    {
         _mainForm.ProgressBarValue= value;
    }
}

Sólo hay 10 tipos de personas: las que saben binario y las que no.

¿Quieres programar un videojuego? Si quieres unirte pulsa aqui

Rakzo-Fimbres

Gracias a todos por su ayuda, he solucionado mi problema.

Tema cerrado  :P