Foros del Web » Programación para mayores de 30 ;) » .NET »

Ayuda en c# (acceder a array de Clase/Struct members en varios forms)

Estas en el tema de Ayuda en c# (acceder a array de Clase/Struct members en varios forms) en el foro de .NET en Foros del Web. Hola saludos amigos, queria plantearles una gran duda y ayuda a la vez sobre c#, resulta que estoy programando un sistemita que guarde unos datos ...
  #1 (permalink)  
Antiguo 10/08/2009, 21:36
Avatar de ciberedwuard2003  
Fecha de Ingreso: agosto-2009
Mensajes: 10
Antigüedad: 14 años, 8 meses
Puntos: 0
Pregunta Ayuda en c# (acceder a array de Clase/Struct members en varios forms)

Hola saludos amigos, queria plantearles una gran duda y ayuda a la vez sobre c#, resulta que estoy programando un sistemita que guarde unos datos en un array de objetos de una clase, tengo creada mi clase, el problema esta en que quiero que los valores internos de la clase se mantengan y se puedan acceder desde diversos forms.

este es el codigo de mi clase:

public class CEquipos
{
private string _Nombre;
public string nombre
{
get { return _Nombre; }
set { _Nombre = value; }
}
}


para ser un poco mas claro, lo que quiero es que al declarar una matriz de objetos para esta clase:

CEquipos[] equipos = new CEquipos[3];

quiero asignar valores a esa matriz desde diversos formularios, ejemplo

//--para form1------

equipos[0].nombre = "juan";


//--para form2------
equipo[1].nombre = "pedro";


luego en un form3 quiero leer los datos que se guardaron en los otros forms, algo asi:

Debug.WriteLine(equipo[0].nombre+" "+equipo[1].nombre);

sin embargo no he podido hacer que funcione, cuando creo una nueva instancia de "equipo" dentro de cada form mediante el codigo:

CEquipos[] equipos = new CEquipos[3];

c# crea un nuevo grupo de objetos pero validos solo para el form actual yo quiero es que ese array de 3 objetos sean accesibles en todo el programa (en los 3 forms) y que se mantengan los datos que se le asignan a la clase.


Espero que me puedan ayudar pues tengo esta gran duda con respecto a c#, yo vengo de programacion en VB y bueno es claro que no es lo mismo en cuanto a la programacion, agradeceria cualquier ayuda y bueno si pueden postear algun ejemplo para guiarme.

Gracias espero sus respuestas
  #2 (permalink)  
Antiguo 11/08/2009, 00:51
Avatar de erick_arcini  
Fecha de Ingreso: julio-2005
Ubicación: Jaltenco / DF
Mensajes: 1.723
Antigüedad: 18 años, 9 meses
Puntos: 50
Respuesta: Ayuda en c# (acceder a array de Clase/Struct members en varios forms)

Hola ciberedwuard2003, lo que puedes hacer es crear una propiedad por cada Form e ir asignado esta propiedad en cada uno de ellos y así ir sobreescribiendo cada una de las mismas, por ejemplo

Form 1
Código:
private CEquipo _objeto;
public heredaObjeto as CEquipo
{
 Set{}
 Get{}
}


private bla bla bla....()
{
frm.heredaObjeto = _objetoHeredado;//imaginando que frm es un Form 2
}

Form 2
Código:
private CEquipo _objeto;
public heredaObjeto as CEquipo
{
 Set{}
 Get{}
}


private bla bla bla....()
{
frm.heredaObjeto = _objetoHeredado; //imaginando que frm es un Form 3
}
si cada uno de los forms llamados es cargado como modal no tienes problemas al heredarlo, ya que todo entra en la misma función en la cual hiciste la declaración del form, pero, en caso de que no fuera así lo que tendrías que hacer es crear como globales cada uno de los forms para poder llamar a sus propiedades desde cualquier otro método.
__________________
Mejoremos nuestro país, ayudemos al planeta... próximamente.
  #3 (permalink)  
Antiguo 11/08/2009, 02:21
Avatar de ciberedwuard2003  
Fecha de Ingreso: agosto-2009
Mensajes: 10
Antigüedad: 14 años, 8 meses
Puntos: 0
Pregunta Respuesta: Ayuda en c# (acceder a array de Clase/Struct members en varios forms)

Saludos [erick_arcini] ante todo gracias por tu pronta respuesta, bueno te comento que aun tengo las dudas, he investigado un poco hacerca de clases y herencias en c# pero la verdad no entiendo mucho, lo que quiero hacer realmente es lo siguiente:

tengo una clase ya creada:
class CEquipos
{

private string _Nombre;
public virtual string nombre
{
get { return _Nombre; }
set { _Nombre = value; }
}
}

----- bien, ahora quiero es que en un form (ejemplo form1) yo le asigne valores a esa clase heredada

form1.clase_heredada.nombre = "lo que sea";

y en otro form (ejemplo form2) yo pueda es leer los cambios que se hicieron a la clase global (es decir CEquipos), supongo que form2 debe heredad tambien a Cequipos pero lo que quiero es que cuando herede mantenga los cambios que se hicieron en form1.

bueno esto es algo asi como cuando uno necesita una variable global, pero en mi caso quiero es probar con clases como lo hace c#, pero ahora no se si con un bloque struct seria lo mismo? o seria mas facil? o que otra recomendacion pudieran hacer.

yo programaba en VB y utilizaba estructuras globales colocando
dim miestructura(X) as estructura
miestructura(1).mienbro = valor

algo asi. ahora de verdad que no se como seria en c#, nuevamente pido si pueden ayudarme y de ante mano muchas gracias.
  #4 (permalink)  
Antiguo 11/08/2009, 04:44
 
Fecha de Ingreso: agosto-2009
Mensajes: 27
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Ayuda en c# (acceder a array de Clase/Struct members en varios forms)

Prueba con Cross Page PostBack. Lo que haríamos sería, desde una página origen, obtener unos datos de esta desde la página actual. En la página destino añades la directiva:

@PreviousPageType VirtualPath="~/anterior.aspx"

y luego en el evento Load recoges el dato de la siguiente forma (ejemplo):

TextBox txtNombre = (Textbox) Page.PreviousPage.FindControl("TextBox1");
String nombre = txtNombre.Text;

En tu caso yo lo haría utilizando un HiddenField al final de la página donde cargaría la estructura cargada. En este caso sería recogerlo del valor del Hidden, pasarlo a un object y convertirlo a tu array de estructura. Sino, siempre te queda recurrir a las Session
  #5 (permalink)  
Antiguo 11/08/2009, 07:51
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 10 meses
Puntos: 220
Respuesta: Ayuda en c# (acceder a array de Clase/Struct members en varios forms)

entonces debes declarar a tu clase como public y static para que ya no tengas que instanciar la clase y poder tomar todos los datos cuando sea modificado por cualquier form

Código C#:
Ver original
  1. class CEquipos
  2. {
  3.     private static string _Nombre;
  4.     public static string nombre
  5.    {
  6.       get { return _Nombre; }
  7.       set { _Nombre = value; }
  8.    }
  9. }
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones

Última edición por Dradi7; 11/08/2009 a las 13:31
  #6 (permalink)  
Antiguo 11/08/2009, 13:24
Avatar de erick_arcini  
Fecha de Ingreso: julio-2005
Ubicación: Jaltenco / DF
Mensajes: 1.723
Antigüedad: 18 años, 9 meses
Puntos: 50
Respuesta: Ayuda en c# (acceder a array de Clase/Struct members en varios forms)

Cita:
Iniciado por kayfaxx Ver Mensaje
Prueba con Cross Page PostBack. Lo que haríamos sería, desde una página origen, obtener unos datos de esta desde la página actual. En la página destino añades la directiva:

@PreviousPageType VirtualPath="~/anterior.aspx"

y luego en el evento Load recoges el dato de la siguiente forma (ejemplo):

TextBox txtNombre = (Textbox) Page.PreviousPage.FindControl("TextBox1");
String nombre = txtNombre.Text;

En tu caso yo lo haría utilizando un HiddenField al final de la página donde cargaría la estructura cargada. En este caso sería recogerlo del valor del Hidden, pasarlo a un object y convertirlo a tu array de estructura. Sino, siempre te queda recurrir a las Session
Haber, haber, momento, eso que dices tu esta bien, pero creo que aquí el brother necesita ayuda en el aspecto de que es un windows form, o me equivoco???

Cita:
Iniciado por Dradi7 Ver Mensaje
entonces debes declarar a tu clase como public y static para que ya no tengas que instanciar la clase y poder tomar todos los datos cuando sea modificado por cualquier form

Código C#:
Ver original
  1. class CEquipos
  2. {
  3.     private static string _Nombre;
  4.     public static string nombre
  5.    {
  6.       get { return _Nombre; }
  7.       set { _Nombre = value; }
  8.    }
  9. }
aún así tiene que estar transportando la clase por cada uno de los forms:

codigo para form1 (Lo pongo en forma de algoritmo por que no recuerdo por el momento la sintaxis como tal, a parte de que mi arroz se esta quemando )
Código:
case form1
{
    clase heredada
    {//TODO: El contenido de tu clase CEquipos}

     private CEquipos objHeredado;
     public CEquipos heredaTuClase
     {
          get
         {
               return objHeredado;
         }
         set
         {
               objHeredado = value;
          } 
     }


     Form1_Load()
     {
            //TODO: tu código de manejo va aquí y si deseas instancia tu clase...
     }  

//suponiendo que de btnAbrir tienes que llamar a otro form (llamdo Form2) en este ejemplo, entonces

     btnAbrir_Click blablabla
     {
          Form2 obj = new Form2();
          obj.heredaTuClase = objHeredado; //fijate en esta propiedad y en el siguiente bloque de code va a aparecer también.
          obj.showDialog();
          ...
         

     }

}
Código para tu clase form2
Código:
case Form2
{
    clase heredada
    {//TODO: El contenido de tu clase CEquipos}

     private CEquipos objHeredado;
     public CEquipos heredaTuClase
     {
          get
         {
               return objHeredado;
         }
         set
         {
               objHeredado = value;
          } 
     }


     Form1_Load()
     {
            //TODO: aqui hacemos la carga de lo que se te antoje
     }  

//suponiendo que de clicn en btnAdios para regresar al otro form, entonces

     btnAdios_Click blablabla
     {
           objHeredado.Items.Add(xOBJ); //siponiendo que tu clase hereda de system.collection
           this.close(); //que facil :borracho:
     }

}
ahora bien, en tu Form1, si depuras con un punto de interrupción después del showdialog te darás cuenta que tu objeto ya tiene otro registro insertado directamente del Form2, no sin antes devolverlo primero, como?, bueno pues por eso tienes el set:

En Form1 después del showdialog:
Código:

this.objHeredado = obj.heredaTuClase; //obj es Form2

Espero eso te ayude, sino deja que llegue a la oficina y hago pruebas para ver mas o menos como podrías heredar mejor ese objeto, mientras deja ir a la cocina a cambiar mi arroz de cazuela por que ya se me pego
__________________
Mejoremos nuestro país, ayudemos al planeta... próximamente.
  #7 (permalink)  
Antiguo 11/08/2009, 13:31
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 10 meses
Puntos: 220
Respuesta: Ayuda en c# (acceder a array de Clase/Struct members en varios forms)

no te estas confundiendo si creo una nueva clase en el proyecto solomente bastaria con hacerle asi:

CEquipos.Nombre = "Hola"; // Digamos en el form1

y para recibirlo en el form2
CEquipos.Nombre;

en cambio tu estas declarando la clase dentro del formulario y solo funcionaria cuando estes llamando un form desde otro form. Pero lo que yo he puesto es como si fuera una variable global en todo el proyecto sin necesidad de instanciar la clase como tu lo estas haciendo
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #8 (permalink)  
Antiguo 12/08/2009, 01:38
Avatar de ciberedwuard2003  
Fecha de Ingreso: agosto-2009
Mensajes: 10
Antigüedad: 14 años, 8 meses
Puntos: 0
De acuerdo Respuesta: Mi Solucion (usando Collections+class objects)

Hola que tal ante todo quiero dale las gracias a los panas kayfaxx, Dradi7 y erick_arcini.

con respecto a sus respuesta me fueron de mucha ayuda sin embargo probando y aceptando sus sugerencias:

a) en cuanto a SystemCollection, herencia y transportar la clase-objeto a cada form (erick_arcini)

b) en cuanto a usar clase publica y static (Dradi7)

he intentado es lo siguiente:

manejar 3 clases en un fichero aparte (ej: misClases.cs)
donde su logica es la siguiente:

1-se crea una clase llamada "Equipo" la cual contiene parametros/variables de cada equipo

2-se crea una clase de coleccion de equipos (Collection Objects) usando una propiedad de NetFrameWork System.Collections.CollectionBase la cual hereda las propiedades-metodos de la clase "Equipo"

3-se crea una clase maestra publica (bueno una clase mas pero quise llamarla asi para que se entienda que engloba a otras) llamada "CEquipos" que contiene una coleccion de equipos internamente y que permite acceder a las propiedades de ellos

--codigo del fichero miClases.cs -----------------------------------------
//clase equipo
public class equipo
{
//variables internas
private string _Nombre;

//procedimientos o parametros publicos
public string nombre
{
get { return _Nombre; }
set { _Nombre = value; }
}
}

//clase de tipo Collection que hereda las propiedades-metodos de la clase "equipo"
//usa la tecnica de Herencia de la P.O.O (programacion orientada a objetos)
public class CollectionEquipos : System.Collections.CollectionBase
{
private int CantEquipos; //varaible que guarda la cantidad de equipos de la coleccion

//propiedades
public void addEquipo(equipo objEquipo)
{
CantEquipos++; //incrementa la cantidad de equipos

//asigna el nombre predeterminado del nuevo equipo creado
objEquipo.nombre = "equipo" + CantEquipos;

this.List.Add(objEquipo); //agrega un nuevo objeto de tipo equipo a la coleccion
}

public void removeEquipo(int equipoNum)
{
//verifica si el equipo a remover es valido en la coleccion
if (equipoNum <= Count - 1 || equipoNum >= 0)
{
this.List.RemoveAt(equipoNum); //elimina el equipo de la coleccion
}
}

public int cantidadEquipos()
{
return this.CantEquipos; //devuelve la cantidad de equipos de la coleccion
}

//para acceder internamente a un item de la coleccion
//es igual a cuando usamos: miobjeto[X].propiedad
public equipo this[int equipoNum]
{
//retorna el objeto padre (en este caso la clase "equipo")
get { return ((equipo)(this.List[equipoNum])); }

//asigna
set { this.List[equipoNum] = value; }
}
}

//clase Maestra "CEquipo" que contiene una coleccion de "equipos"
public class CEquipos
{
CollectionEquipos objCollection = null; //crea ub objeto Collection

//constructor (publico)
public CEquipos()
{
objCollection = new CollectionEquipos(); //crea una coleccion de equipos
}

//devuelve la coleccion de equipos
public CollectionEquipos Equipo
{
get { return this.objCollection; }
}
}

-fin fichero-------------------------------


bien espero que hasta este punto se entienda, ahora vamos a los forms
para formMain que es el formulario principal, en el creo una instancia de la clase maestra "CEquipos" asi:

//crea un objeto de Equipos tipo estatico (privado)
private static CEquipos objEquipos = new CEquipos();

//para que el objeto sea accedido en otros forms
public static CEquipos getEquipos()
{
return objEquipos;
}

Nota: si se preguntan xq getEquipos() ?? es bueno para que el objeto creado en este form pueda ser usado en otros forms (esta funcion publica de tipo "CEquipos" permite exportar el objeto de forma global para otros forms)

ok ahora (todavia sigo en frmMain ojo!!) en mi funcion Load() creo 3 equipos y los asocio a la coleccion de "CEquipos"

//cuando inicia el formulario
private void Form1_Load(object sender, EventArgs e)
{
//agrego 3 equipos a objetoEquipos
objEquipos.Equipo.addEquipo(new equipo());
objEquipos.Equipo.addEquipo(new equipo());
objEquipos.Equipo.addEquipo(new equipo());

//imprimo la cantidad de equipos
Debug.WriteLine("Se han creado "+objEquipos.Equipo.cantidadEquipos()+" equipo(s)");

}

adicionalmente este form permite llamar a otro form por lo cual tiene un boton que muestra otro form (y en este otro form es donde voy a modificar algunos valores de la coleccion de equipos)

//cuando hace clic en el boton nuevoForm
private void btnNuevoForm_Click(object sender, EventArgs e)
{

//recorro antes de llamar el nuevo form la coleccion y muestro en pantalla que contiene esa coleccion
foreach (equipo objEquipo in objEquipos.Equipo)
{
Debug.WriteLine("ANTES del nuevo form="+ objEquipo.nombre);
}

//llama a un nuevo form
frm_equipos frmEquipos = new frm_equipos();
frmEquipos.ShowDialog(this);

//ahora despues de que cierre el form2 (frm_equipos) se comprueban si la coleccion de equipos sufrio cambios, para ello vuelvo a recorrer la coleccion
foreach (equipo objEquipo in objEquipos.Equipo)
{
Debug.WriteLine("DESPUES del nuevo form=" + objEquipo.nombre);
}
}

con esto termina la codificacion en frmMain....

ahora en form2 (que lo llame frm_equipos) cuando inicia en su propiedad Load() este modifica los datos SOLO!! del equipo1, mientras que los equipos 2 y 3 se mantienen iguales, su codigo:

//cuando inicia el formulario
private void frm_equipos_Load(object sender, EventArgs e)
{

//crea un objeto local pero asigna a este el objeto que fue creado en (formMain), deberia ser esto una especie de herencia local!!
CEquipos objEquipoLocal = frm_main.getEquipos();

//ahora cambia la propiedad de uno de ellos
objEquipoLocal.Equipo[0].nombre = "equipo1 MODIFICADO EN FORM2";
}

como se puede observar lo que hice aqui fue asignar a un objeto local otro objeto creado e instanciado en frmMain, y a este objeto local lo trabajo en su coleccion: equipo[0] que viene a ser un equipo asignado a la clase Collection Objects con lo cual puedo manipularlo como quiera dentro de este form y otros foms tambien.

Bueno por ultimo esta la salida del programa cuando lo ejecute:


Se han creado 3 equipo(s)

ANTES del nuevo form=equipo1
ANTES del nuevo form=equipo2
ANTES del nuevo form=equipo3

##aqui fue cuando se llamo a form2 y se hizo el cambio, luego se cerro el form2 y devolvio esto en frmMain:

DESPUES del nuevo form=equipo1 MODIFICADO EN FORM2
DESPUES del nuevo form=equipo2
DESPUES del nuevo form=equipo3

como se puede apreciar la coleccion solo sufrio cambios en equipo1 mientras que los otros se mantienen iguales y disponibles para futuras modificaciones en el programa.

Bueno con esto considero que es la mejor respuesta a mi propia pregunta sin embargo le agradezco mucho su colaboracion panas!! ya que bueno ahora si puedo seguir trabajando en mi proyecto...

Por ultimo les pido o les invito a ustedes y a cualquier otro que vea este post a que realice una prueba y si pueden plantear otros metodos o soluciones mucho mas simples basado en lenguaje c#

cualquier cosa no duden en avisarme e iguao yo seguire en contacto en este foro.
Gracias y saludos...
  #9 (permalink)  
Antiguo 12/08/2009, 01:52
Avatar de erick_arcini  
Fecha de Ingreso: julio-2005
Ubicación: Jaltenco / DF
Mensajes: 1.723
Antigüedad: 18 años, 9 meses
Puntos: 50
Respuesta: Ayuda en c# (acceder a array de Clase/Struct members en varios forms)

Dradi7, tienes toda la razón, dejo la clase que hice para que mas o menos se de una idea.

Código c#:
Ver original
  1. class CEquipos
  2. {
  3.     private static List<string> listado = new List<string>();
  4.     public static List<string> retornaDato
  5.     {
  6.         get
  7.         {
  8.             return listado;
  9.         }
  10.     }
  11.  
  12.     private static string _Nombre = string.Empty ;
  13.     public static string recibeDato
  14.     {
  15.         set
  16.         {
  17.             listado.Add(value);
  18.         }
  19.     }
  20. }


__________________
Mejoremos nuestro país, ayudemos al planeta... próximamente.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:35.