none
Error 'AtencionCajas.EstadoCaja2()' es método, que no es válida en el contexto indicado_ RRS feed

  • Pregunta

  • Hola, como va? Soy nuevo en todo esto y estoy aprendiendo con tutoriales y demás a programar en C#.

    Estoy teniendo unos errores que no estoy pudiendo resolver y agradecería muchísimo que me ayuden ^_^.

    Tengo un problema para resolver de una simulación de atención de cajas de un supermercado. Lo pude resolver de la forma que indicaba el tutorial, creando una clase Caja, y  luego haciendo todo el proceso de simulación en el evento de clic de un botón de Windows Form, para que me lo mostrara en los label correspondiente.

    Pero me pareció en realidad que lo ideal sería tener dos clases, una Clase Caja con las propiedades de las cajas, y luego una clase "AtencionCajas" que tuviera como atributos -creo que se dicen atributos :p - 3 objeto 'caja', y luego en sus métodos todo el proceso, para luego llamar o invocar esos métodos para mostrar los resultados en los label directamente al apretar el botón. De esta manera, si tuviera varios supermercados (aunque no era el problema) no tenía que codificar todos los procesos de nuevo, y simplemente creando un objeto atencioncajas nuevo, obtener los resultados.

    Ahí me encontré con los inconvenientes que voy a poner, aunque simplifiqué todo este problema para mostrar solamente el estado de la caja de distintas maneras, a ver si podía resolver el problema. Pero no pude, y por estoy aca :p.

    Voy a poner esta versión simple, ya que resolviendo esto, podría resolver lo que indicaba arriba.

    Tengo un Windows Forms, con un botón (button1). Tiene 3 label. Al presionar el botón, cada label me tendría que mostrar el estado de la caja. Los 3 label de aca los hice para probar las distintas maneras de poder obtenerlo.

    El proyecto esta compuesto por el Form1.cs compuesto por lo indicado arriba. Y luego hay un Caja.cs donde está la caja definida con lo que sería una lista tipo cola (pero aca no la estaría usando para nada todavía) y lo que me interesa para el inconveniente, con la propiedad 'estado'.

    Luego está AtencionCajas.cs que tiene un objeto de la clase Caja, y lo crea en el constructor. Y el método que cree para probar, como indico ahora:

    El label1, es creando la caja directamente al hacer clic en el botón, y muestro la propiedad estado de la misma. Aca sale ok.

    Las otras dos opciones son las que me tiran error y no puedo resolver y no se como darle la vuelta para hacerlas de esta manera.

    En el label2 lo que quise hacer (y no me salio :p) es mostrar la propiedad del objeto caja2 , que debería haberse creado al crear el objeto at1 que lo contiene (o este fue mi razonamiento). Acá me tira: "El nombre 'caja2' no existe en el contexto actual"

    En el label3 se me ocurrió hacer un método dentro de la clase AtencionCajas que retornara el estado de la "caja2" que crea la clase 'padre'. Acá me tira: Error CS0119 'AtencionCajas.EstadoCaja2()' es método, que no es válida en el contexto indicado WindowsFormsApp3 C:\Users\Guardia\source\repos\WindowsFormsApp3\WindowsFormsApp3\Form1.cs 27 Activo

    Les dejo el código:

    Caja.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace WindowsFormsApp3
    {
        class Caja
        {
            class Nodo
            {
                public int info;
                public Nodo sig;
            }
            private Nodo raiz,fondo;
            private int estado;
            public int Estado
            {
                set
                {
                    estado = value;
                }
                get
                {
                    return estado;
                }
            }
            public Caja()
            {
                raiz = null;
                fondo = null;
                estado = 0;
            }
            public bool Libre()
            {
                if (estado == 0)
                    return true;
                else
                    return false;
            }
            public bool Vacia()
            {
                if (raiz == null)
                    return true;
                else
                    return false;
            }
            public void Insertar(int info)
            {
                Nodo nuevo = new Nodo();
                nuevo.info = info;
                nuevo.sig = null;
                if(Vacia())
                {
                    fondo = nuevo;
                    raiz = nuevo;
                }
                else
                {
                    fondo.sig = nuevo;
                    fondo = nuevo;
                }
            }
            public int Extraer()
            {
                if (!Vacia())
                {
                    int informacion = raiz.info;
                    if (raiz == fondo)
                    {
                        raiz = null;
                        fondo = null;
                    }
                    else
                    {
                        raiz = raiz.sig;
                    }
                    return informacion;

                }
                else
                    return int.MaxValue;
            }

        }
    }

    AtencionCajas.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace WindowsFormsApp3
    {
        class AtencionCajas
        {
            private Caja caja2;
            public AtencionCajas()
            {
                caja2 = new Caja();
            }
            public int EstadoCaja2()
            {
                return caja2.Estado;
            }
           

        }
    }

    Form1.cs*:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    namespace WindowsFormsApp3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Caja caja1 = new Caja();
                AtencionCajas at1 = new AtencionCajas();
                label1.Text = caja1.Estado.ToString();
                label2.Text = caja2.Estado.ToString();
                label3.Text = at1.EstadoCaja2.ToString();
            }
        }
    }

    Los errores:

    la línea del label2:

    Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
    Error CS0103 El nombre 'caja2' no existe en el contexto actual WindowsFormsApp3 C:\Users\Guardia\source\repos\WindowsFormsApp3\WindowsFormsApp3\Form1.cs 26 Activo

    la línea del label3

    Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
    Error CS0119 'AtencionCajas.EstadoCaja2()' es método, que no es válida en el contexto indicado WindowsFormsApp3 C:\Users\Guardia\source\repos\WindowsFormsApp3\WindowsFormsApp3\Form1.cs 27 Activo

    Bueno, espero haber sido claro y no haber escrito tanto!! Agredezco por la ayuda que me puedan dar!!!

               

    lunes, 2 de abril de 2018 15:58

Respuestas

  • Gracias Jose por la respuesta!!

    La 3 me quedó resuelta, me faltaban los paréntesis, que tonto no darme cuenta.

    Con respecto a la 2, no se supone que se crea caja2 al crear el objeto at1?? 

    class AtencionCajas
        {
            private Caja caja2;
            public AtencionCajas()
            {
                caja2 = new Caja();
            }

    Y supone bien.  Pero entonces, ¿dónde está definida caja2?  La respuesta es:  En la clase AtencionCajas.  NO en la clase Form1 que es donde usted está tratando de accederla.

    Si quiere acceder a la caja2, tiene que hacer at1.caja2.  PERO:  La variable caja2 de AtencionCajas es privada!!!  No podrá accederla así a menos que la declare pública.


    Jose R. MCP
    Code Samples

    martes, 3 de abril de 2018 5:09
    Moderador

Todas las respuestas

  • El error en la línea 2 es porque caja2 no está definido dentro del formulario Form1 en ninguna parte.  Solamente veo una variable caja1 que es de tipo Caja.  ¿caja2?  En ninguna parte del código del formulario.

    El error en la línea 3 se da porque no pone paréntesis. at1.EstadoCaja2().ToString();


    Jose R. MCP
    Code Samples


    martes, 3 de abril de 2018 4:44
    Moderador
  • Gracias Jose por la respuesta!!

    La 3 me quedó resuelta, me faltaban los paréntesis, que tonto no darme cuenta.

    Con respecto a la 2, no se supone que se crea caja2 al crear el objeto at1?? 

    class AtencionCajas
        {
            private Caja caja2;
            public AtencionCajas()
            {
                caja2 = new Caja();
            }

    martes, 3 de abril de 2018 4:55
  • Gracias Jose por la respuesta!!

    La 3 me quedó resuelta, me faltaban los paréntesis, que tonto no darme cuenta.

    Con respecto a la 2, no se supone que se crea caja2 al crear el objeto at1?? 

    class AtencionCajas
        {
            private Caja caja2;
            public AtencionCajas()
            {
                caja2 = new Caja();
            }

    Y supone bien.  Pero entonces, ¿dónde está definida caja2?  La respuesta es:  En la clase AtencionCajas.  NO en la clase Form1 que es donde usted está tratando de accederla.

    Si quiere acceder a la caja2, tiene que hacer at1.caja2.  PERO:  La variable caja2 de AtencionCajas es privada!!!  No podrá accederla así a menos que la declare pública.


    Jose R. MCP
    Code Samples

    martes, 3 de abril de 2018 5:09
    Moderador
  • Muchas Gracias Jose!!! Me ayudaste un montón y comprendí el tema del lugar desde donde se definen los objetos!!!

    Guardia

    martes, 3 de abril de 2018 14:28