none
Una parte del menú no me funciona en consola C# 2019 RRS feed

  • Pregunta

  • Buenas compeñeros y compeñaras:

    Tengo un menú que no entiendo el motivo que no me funciona bien.

    Ver Zoom.

    Se ha hecho un esquema de todas las opciones para tener una vista rápida y una posible facilidad de compresión.

    Si nada más ejecutar el programa o aplicación, pulso Enter, muestra las opciones aue son A, B y C, señalo Salir, pulso Enter vuelve al reloj, como debe ser, así susecibamente. Hasta ahí todo bien.

    El problema es cuando estoy en la opción indicada aquí.

    En el menú principal.

    Paso 1). Pulsar Enter

    Paso 2). Seleccionar Oopción C y pulsar Enter.

    Paso 3). Seleccionar opción C-1 y pulsara Enter.

    Paso 4). Pulsar NO, sale en la opción donde aparece las opciones A, B y C, hasta ahí todo bien.

    Paso 5). Selecciono Salir y pulso Enter. ¡¡¡ERROR!!! Debe entrar en el MENÚ PRINCIPAL y me aparece la opción llamada Estás en la opción C-1 donde elijes otra vez SI o No.

    ¿Qué es lo que ocurre?

    ¿Por qué no sale que vaya a la opción del Menú principal?

    Dejo el código hehco hasta el momento.

    Código C#:

    using System;
    
    namespace Menu_consola_16_cs
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Título de la ventana.
                Console.Title = "Menú de opciones";
    
                // Tamaño ventana consola.
                // X anchura.
                Console.WindowWidth = 20;
    
                // Y altura.
                Console.WindowHeight = 5;
    
                // Oculto el cursor.
                Console.CursorVisible = false;
    
                // Almacena la tecla pulsada en la variable.
                ConsoleKey teclaInicial;
    
                // Fondo verde.
                Console.BackgroundColor = ConsoleColor.Green;
    
                // Letras negras.
                Console.ForegroundColor = ConsoleColor.Black;
    
                do
                {
                    // Limpiar pantalla.
                    Console.Clear();
    
                    // Posición del cursor del título del MENÚ PRINCIPAL.
                    Console.SetCursorPosition(0, 0);
    
                    // Título.
                    Console.Write("   MENÚ PRINCIPAL   ");
    
                    // Pocisión de la hora.
                    Console.SetCursorPosition(4, 2);
    
                    // Formato numérico dd/MM/yyyy.
                    Console.Write(DateTime.Now.ToString("ddd dd MMM"));
    
                    // Almacena en la variable una tecla pulsada.
                    teclaInicial = Console.ReadKey(true).Key;
    
                    // ¿Haz pulsado la tecla Enter?
                    if (teclaInicial == ConsoleKey.Enter)
                    {
                        // Sí. Se ejecuta esta función.
                        MenuPrincipal();
                    }
                } while (teclaInicial != ConsoleKey.Escape);
            }
    
            #region Menú Principal.
            public static void MenuPrincipal()
            {
    
                // Contador de teclas y navegador.
                int opcion = 0;
                bool salir = false;
                // Capturar tecla para luego validar.
                ConsoleKey tecla;
    
                do
                {
                    //******************************************************************
                    // Dibujo el menú principal.
    
                    // Rellenar fondo verde.
                    Console.BackgroundColor = ConsoleColor.Green;
    
                    // Letras negras.
                    Console.ForegroundColor = ConsoleColor.Black;
    
                    // Limpiar pantalla.
                    Console.Clear();
    
                    switch (opcion)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("> Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("  Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("  Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("  Salir.            ");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("  Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("> Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("  Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("  Salir.            ");
                            break;
                        case 2:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("  Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("  Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("> Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("  Salir.            ");
                            break;
                        case 3:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("  Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("  Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("  Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("> Salir.            ");
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
    
                    // Fin de pintar el menú principal.
                    //******************************************************************
    
                    // Leer tecla ingresada por el usuario.
                    tecla = Console.ReadKey(true).Key;
    
                    // Validar el tipo de tecla.
                    if (tecla == ConsoleKey.Enter)
                    {
                        switch (opcion)
                        {
                            case 0:
                                OpcionA();
                                break;
                            case 1:
                                OpcionB();
                                break;
                            case 2:
                                OpcionC();
                                break;
                            case 3:
                                salir = true;
                                break;
                            default:
                                break;
                        }
                    }
    
                    if (tecla == ConsoleKey.DownArrow)
                    {
                        opcion++;
                    }
    
                    if (tecla == ConsoleKey.UpArrow)
                    {
                        opcion--;
                    }
    
                    // Si está en la última opción, salta a la primera.
                    if (opcion > 3)
                    {
                        opcion = 0;
                    }
    
                    // Si está en la primera posición, salta a la última.
                    if (opcion < 0)
                    {
                        opcion = 3;
                    }
                    // Uso la tecla escape como salida.
                } while (salir == false);
            }
            #endregion
    
            #region Opción A (0).
            public static void OpcionA()
            {
                ConsoleKey teclaOpcionA;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción A.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("Salir.");
    
                    // Almacena el teclado pulsado en la variable teclaSubMenuA.
                    teclaOpcionA = Console.ReadKey(true).Key;
    
                } while (teclaOpcionA != ConsoleKey.Enter);
            }
            #endregion
    
            #region Opción B (1).
            public static void OpcionB()
            {
                // Contador de teclas y navegador.
                int opcionB = 0;
                bool salirB = false;
    
                // Capturar tecla para luego validar.
                ConsoleKey teclaOpcionB;
                Console.Clear();
                do
                {
                    switch (opcionB)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción B.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("> SubOpción B-1.    ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  SubOpción B-2     ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción B.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  SubOpción B-1.    ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> SubOpción B-2     ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 2:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción B.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  SubOpción B-1.    ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  SubOpción B-2     ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("> Salir.            ");
                            break;
                        default:
                                Console.Write("Fuera de rango.     ");
                        break;
                    }
    
                    // Leer tecla ingresada por el usuario.
                    teclaOpcionB = Console.ReadKey(true).Key;
    
                        // Validar el tipo de tecla.
                        if (teclaOpcionB == ConsoleKey.Enter)
                        {
                            switch (opcionB)
                            {
                                case 0:
                                    OpcionB1();
                                    break;
                                case 1:
                                    OpcionB2();
                                    break;
                                case 2:
                                    salirB = true;
                                    break;
                                default:
                                Console.Write("Fuera de rango.     ");
                                    break;
                            }
                        }
    
                        if (teclaOpcionB == ConsoleKey.DownArrow)
                        {
                            opcionB++;
                        }
    
                        if (teclaOpcionB == ConsoleKey.UpArrow)
                        {
                            opcionB--;
                        }
    
                        // Si está en la última opción, salta a la primera.
                        if (opcionB > 2)
                        {
                            opcionB = 0;
                        }
    
                        // Si está en la primera posición, salta a la última.
                        if (opcionB < 0)
                        {
                            opcionB = 2;
                        }
                } while (salirB == false);
            }
            #endregion
    
            #region Opcion B-1.
            public static void OpcionB1()
            {
                ConsoleKey teclaOpcionB1;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción B-1.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para    ");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("volver atrás.       ");
    
                    // Almacena el teclado pulsado en la variable teclaSubMenuA.
                    teclaOpcionB1 = Console.ReadKey(true).Key;
    
                } while (teclaOpcionB1 != ConsoleKey.Enter);
            }
            #endregion
    
            #region Opcion B-2.
            public static void OpcionB2()
            {
                ConsoleKey teclaOpcionB2;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción B-2.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para    ");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("volver atrás.       ");
    
                    // Almacena el teclado pulsado en la variable teclaSubMenuA.
                    teclaOpcionB2 = Console.ReadKey(true).Key;
    
                } while (teclaOpcionB2 != ConsoleKey.Enter);
            }
            #endregion
    
            #region Opción C (2).
            public static void OpcionC()
            {
                // Contador de teclas y navegador.
                int opcionC = 0;
                bool salirC = false;
    
                // Capturar tecla para luego validar.
                ConsoleKey teclaOpcionC;
                Console.Clear();
                do
                {
                    switch (opcionC)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("> Color 1.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 2.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Opción C-1.       ");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 1.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> Color 2.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Opción C-1.       ");
                            break;
                        case 2:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 1.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 2.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("> Opción C-1.       ");
                            break;
                        case 3:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("> Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 4:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("  Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("> Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 5:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("  Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 6:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("  Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("> Salir.            ");
                            break;
    
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
    
                    // Leer tecla ingresada por el usuario.
                    teclaOpcionC = Console.ReadKey(true).Key;
    
                    // Validar el tipo de tecla.
                    if (teclaOpcionC == ConsoleKey.Enter)
                    {
                        switch (opcionC)
                        {
                            case 0:
                                // Fondo azul.
                                Console.BackgroundColor = ConsoleColor.Blue;
    
                                // Letras blancas.
                                Console.ForegroundColor = ConsoleColor.White;
                                break;
                            case 1:
                                // Fondo verde.
                                Console.BackgroundColor = ConsoleColor.Green;
    
                                // Letras negras.
                                Console.ForegroundColor = ConsoleColor.Black;
                                break;
                            case 2:
                                OpcionC1();
                                break;
                            case 3:
                                // Fondo negro.
                                Console.BackgroundColor = ConsoleColor.Black;
    
                                // Letras rojo.
                                Console.ForegroundColor = ConsoleColor.Red;
                                break;
                            case 4:
                                // Fondo negro.
                                Console.BackgroundColor = ConsoleColor.Black;
    
                                // Letras rojo.
                                Console.ForegroundColor = ConsoleColor.Yellow;
                                break;
                            case 5:
                                // Fondo negro.
                                Console.BackgroundColor = ConsoleColor.Red;
    
                                // Letras rojo.
                                Console.ForegroundColor = ConsoleColor.DarkRed;
                                break;
                            case 6:
                                salirC = true;
                                break;
                            default:
                                Console.Write("Fuera de rango.     ");
                                break;
                        }
                    }
    
                    if (teclaOpcionC == ConsoleKey.DownArrow)
                    {
                        opcionC++;
                    }
    
                    if (teclaOpcionC == ConsoleKey.UpArrow)
                    {
                        opcionC--;
                    }
    
                    // Si está en la última opción, salta a la primera.
                    if (opcionC > 6)
                    {
                        opcionC = 0;
                    }
    
                    // Si está en la primera posición, salta a la última.
                    if (opcionC < 0)
                    {
                        opcionC = 6;
                    }
                } while (salirC == false);
            }
            #endregion
    
            #region OpcionC-1.
            public static void OpcionC1()
            {
                // Contador de teclas y navegador.
                int opcionC1 = 0;
                bool salirC1 = false;
    
                // Capturar tecla para luego validar.
                ConsoleKey teclaOpcionC1;
                Console.Clear();
                do
                {
                    Console.Clear();
    
                    switch (opcionC1)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C-1.");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  SI");
                            Console.SetCursorPosition(16, 2);
                            Console.WriteLine("> NO");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C-1.");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> SI");
                            Console.SetCursorPosition(16, 2);
                            Console.WriteLine("  NO");
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
    
                    // Leer tecla ingresada por el usuario.
                    teclaOpcionC1 = Console.ReadKey(true).Key;
    
                    // Validar el tipo de tecla.
                    if (teclaOpcionC1 == ConsoleKey.Enter)
                    {
                        switch (opcionC1)
                        {
                            case 0:
                                MenuPrincipal();
                                Console.Clear();
                                break;
                            case 1:
                                OpcionSI();
                                break;
                            default:
                                Console.Write("Fuera de rango.     ");
                                break;
                        }
                    }
    
                    // Flecha derecha.
                    if (teclaOpcionC1 == ConsoleKey.RightArrow)
                    {
                        opcionC1++;
                    }
    
                    // Flecha izquierda.
                    if (teclaOpcionC1 == ConsoleKey.LeftArrow)
                    {
                        opcionC1--;
                    }
    
                    // Si está en la última opción, salta a la primera.
                    if (opcionC1 > 1)
                    {
                        opcionC1 = 0;
                    }
    
                    // Si está en la primera posición, salta a la última.
                    if (opcionC1 < 0)
                    {
                        opcionC1 = 1;
                    }
                } while (salirC1 == false);
            }
            #endregion
    
            #region opcionSI del sub menú C-1.
            public static void OpcionSI()
            {
                ConsoleKey teclaOpcionB1;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción SÍ.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para    ");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("volver atrás.       ");
    
                    // Almacena el teclado pulsado en la variable teclaOpciónB1.
                    teclaOpcionB1 = Console.ReadKey(true).Key;
    
                } while (teclaOpcionB1 != ConsoleKey.Enter);
            }
            #endregion
        }
    }
    

    ¿Alguna idea?

    Gracias por leer y/o ayudar.


    http://electronica-pic.blogspot.com

    viernes, 28 de febrero de 2020 6:10

Respuestas

  • Hola Metaconta

    Ya caí en que es lo que ocurre. Cuando llamas a MenuPrincipal() en la opción NO del submenú OpciónC1, se ejecuta ese método. Al dar Enter en la opción Salir del mismo, este termina, y continúa la ejecución en el submenú OpciónC1, que es donde invocaste a MenuPrincipal(). Escrito de este modo, no hay forma de solucionarlo el problema.

    Por qué pasa esto? Porque estás programando mal los menús desde el vamos. 

    Te paso un método que ejecuta un menú y retorna el índice de la opción elegida, así podes reescribir todo tu programa, de forma más eficiente, que funcione, y en muchas menos lineas.

            // DoMenu: Ejecuta el menú y retorna: -1 -> Se pulsó Esc | De 0 a Nro de menús - 1 -> índice de opción elegida
            private static int DoMenu(string title, string[] options)
            {
                int a, index = 0;
                ConsoleKey key;
                Console.Clear();
                Console.SetCursorPosition(12, 2);
                Console.Write(title);
    
                do
                {
                    for (a = 0; a < options.Length; a++)
                    {
                        Console.BackgroundColor = ConsoleColor.Black;
                        if (a == index)
                            Console.BackgroundColor = ConsoleColor.Blue;
                        Console.SetCursorPosition(4, 4 + a);
                        Console.Write(options[a]);
                    }
    
                    key = Console.ReadKey(true).Key;
    
                    if (key == ConsoleKey.UpArrow || key == ConsoleKey.LeftArrow)
                    { 
                        index--;
                        if (index < 0) 
                            index = options.Length - 1;
                    }
                    else if (key == ConsoleKey.DownArrow || key == ConsoleKey.RightArrow)
                    { 
                        index++;
                        if (index == options.Length) 
                            index = 0;
                    }
                    else if (key == ConsoleKey.Enter)
                    {
                        return index;
                    }
    
                } while (key != ConsoleKey.Escape);
    
                return -1;
            }
    

    Espero que te sea útil, y cualquier duda que tengas, aquí estoy.

    Saludos

    Pablo


    • Propuesto como respuesta Pablo RubioModerator viernes, 28 de febrero de 2020 15:50
    • Marcado como respuesta Metaconta sábado, 29 de febrero de 2020 8:38
    viernes, 28 de febrero de 2020 13:32
  • Hola Metaconta

    Yo solia hacerlo de esta manera

    creaba una clase controladora del menu

    con 3 parametros en el constructor

    la lista de cadenas a mostrar

    la posicion en x

    la posicion en y

    public class MenuBarras
    {
        private int index = 0;
        private int x;
        private int y;
        private List<string> cadenas;
    
        public List<string> Cadenas
        {
            get { return cadenas; }
            set { cadenas = value; }
        }
    
        public MenuBarras(List<string> cadena, int x, int y)
        {
            this.x = x;
            this.y = y;
            cadenas = cadena;
            DrawMenu();
            DrawTextos();
        }
    
        public void gotoXY(int v1, int v2, string cadena)
        {
            Console.SetCursorPosition(v1, v2);
            Console.WriteLine(cadena);
        }
    
        private void DrawMarco(int v1, int v2, int v3, int v4)
        {
            gotoXY(v1, v2, "╔");
            gotoXY(v1, v4, "╚");
            gotoXY(v3, v2, "╗");
            gotoXY(v3, v4, "╝");
    
            for (int i = v1 + 1; i < v3; i++)
            {
                gotoXY(i, v2, "═");
                gotoXY(i, v4, "═");
            }
            for (int i = v2 + 1; i < v4; i++)
            {
                gotoXY(v1, i, "║");
                gotoXY(v3, i, "║");
            }
        }
    
        private void DrawTextos()
        {
            int x = this.x + 1;
            int y = this.y + 1;
            cadenas.Add("Salir");
            for (int i = 0; i < cadenas.Count; i++)
            {
                if (i == index)
                {
                    Console.BackgroundColor = ConsoleColor.Blue;
                    Console.ForegroundColor = ConsoleColor.Yellow;
                }
                else
                {
                    Console.BackgroundColor = ConsoleColor.Black;
                    Console.ForegroundColor = ConsoleColor.White;
                }
                gotoXY(x, y, cadenas[i]);
                y++;
            }
            cadenas.Remove("Salir");
        }
    
        private void DrawMenu()
        {
            int maxSizeCad = 5;
            foreach (var item in cadenas)
            {
                if (item.Length > maxSizeCad)
                    maxSizeCad = item.Length;
            }
            DrawMarco(x, y, x + maxSizeCad + 1, y + cadenas.Count + 2);
        }
    
        private void EraseMenu()
        {
            int maxSizeCad = 5;
            foreach (var item in cadenas)
            {
                if (item.Length > maxSizeCad)
                    maxSizeCad = item.Length;
            }
            Console.BackgroundColor = ConsoleColor.Black;
            Console.ForegroundColor = ConsoleColor.White;
            for (int i = x; i < x + maxSizeCad + 2; i++)
                for (int j = y; j <= y + cadenas.Count + 2; j++)
                {
                    gotoXY(i, j, "   ");
                }
    
        }
    
        public int Seleccion(ConsoleKey key)
        {
            int ret = -1;
            if (key == ConsoleKey.DownArrow)
            {
                if (index < cadenas.Count)
                    index++;
                else
                    index = 0;
            }
            if (key == ConsoleKey.UpArrow)
            {
                if (index > 0)
                    index--;
                else
                    index = cadenas.Count;
            }
            if (key == ConsoleKey.Enter)
            {               
                ret = index;
            }
            if (key == ConsoleKey.Escape)
                ret = cadenas.Count;
            DrawTextos();
            if (ret == cadenas.Count)
                EraseMenu();
            return ret;
        }
    }
    

    y para llamarlo

    private static void Main(string[] args)
    {
        List<string> Cadenas = new List<string>() { "Uno", "Dos", "Tres", "Cuatro" };
        List<string> Cad01 = new List<string> { "Uno Uno", "Uno Dos", "Uno Tres" };
        List<string> Cad02 = new List<string> { "Dos Uno", "Dos Dos", "Dos Tres" };
        List<string> Cad03 = new List<string> { "Tres Uno", "Tres Dos", "Tres Tres" };
        List<string> Cad04 = new List<string> { "Cuatro Uno", "Cuatro Dos", "Cuatro Tres" };
    
       
        Console.CursorVisible = false;
        MenuBarras mb = new MenuBarras(Cadenas, 1, 1);
    
        while (true)
        {
            ConsoleKey opc = Console.ReadKey(true).Key;
    
            int res = mb.Seleccion(opc);
            if (res != -1)
            {
                if (res == Cadenas.Count)
                    break;
                else
                {
                    MenuBarras m;
                    switch (res)
                    {
                        case 0:
                            m = new MenuBarras(Cad01, 15, 2);
                            while (true)
                            {
                                ConsoleKey op = Console.ReadKey(true).Key;
                                res = m.Seleccion(op);
                                if (res != -1)
                                {
                                    if (res == Cad01.Count)
                                        break;
                                    else
                                    {
                                        m.gotoXY(0, 24, $"has seleccionado [{Cad01[res]}]        ");
                                    }
                                }
                            }
                            break;
    
                        case 1:
                            m = new MenuBarras(Cad02, 15, 3);
                            while (true)
                            {
                                ConsoleKey op = Console.ReadKey(true).Key;
                                res = m.Seleccion(op);
                                if (res != -1)
                                {
                                    if (res == Cad02.Count)
                                        break;
                                    else
                                    {
                                        m.gotoXY(0, 24, $"has seleccionado [{Cad02[res]}]        ");
                                    }
                                }
                            }
                            break;
    
                        case 2:
                            m = new MenuBarras(Cad03, 15, 4);
                            while (true)
                            {
                                ConsoleKey op = Console.ReadKey(true).Key;
                                res = m.Seleccion(op);
                                if (res != -1)
                                {
                                    if (res == Cad03.Count)
                                        break;
                                    else
                                    {
                                        m.gotoXY(0, 24, $"has seleccionado [{Cad03[res]}]        ");
                                    }
                                }
                            }
                            break;
    
                        case 3:
                            m = new MenuBarras(Cad04, 15, 2);
                            while (true)
                            {
                                ConsoleKey op = Console.ReadKey(true).Key;
                                res = m.Seleccion(op);
                                if (res != -1)
                                {
                                    if (res == Cad04.Count)
                                        break;
                                    else
                                    {
                                        m.gotoXY(0, 24, $"has seleccionado [{Cad04[res]}]        ");
                                    }
                                }
                            }
                            break;
                    }
                }
            }
        }
        Console.CursorVisible = true;
    }
    

    Selccion me retorna el index del elmento seleccionado y usaria un case

    si es el ultimo elento que sera salir en este caso y siempre esta por defecto al final

    porque asi lo dispuse para no tener que escribir slir en cada menu o submenu

    se retorna al padre de ese menu y borra el menu de pantalla.

      Le puedes poner todos los submenus que decees.

    revisalo y si te funciona genial

    • Propuesto como respuesta Pablo RubioModerator viernes, 28 de febrero de 2020 15:50
    • Marcado como respuesta Metaconta sábado, 29 de febrero de 2020 8:38
    viernes, 28 de febrero de 2020 14:11
  • Hola Metaconta

    Acá está el programa escrito en muchas menos lineas, con la clase Menu. Fijate de leer y captar el método DoMenu(), así no seguis escribiendo los menús en muchas lineas y repitiendo los strings (ja ja) y todo, además es genérico como hice ese métdodo. Creo que se podría generalizar aún más, algo como una clase MenuTree, pero quizás con lo que tenemos por ahora vamos bien. 

    using System;
    
    namespace MyMenu
    {
        class Program
        {
            static void Main(string[] args)
            {            
                Menu Principal, OpcionA, OpcionB, OpcionC;
                Menu OpcionB1, OpcionB2, OpcionC1, OpcionSI;
                ConsoleKey tecla;
                int irAtras = 0;
                int opcion;
    
                Principal = new Menu("", 0, new string[] { "Opción A", "Opción B", "Opción C", "Salir" });
                OpcionA = new Menu("Estás en Opción A.", 0, new string[] { "Pulsa Enter para salir." });
                OpcionB = new Menu("Estás en Opción B.", 0, new string[] { "Subopción B-1.", "Subopción B-2.", "Salir." });
                OpcionC = new Menu("Estás en Opción C.", 0, new string[] { "Color 1.", "Color 2.", "Opción C-1." });
                OpcionB1 = new Menu("Estás en Opción B-1.", 0, new string[] { "Pulsa Enter para volver atrás." });
                OpcionB2 = new Menu("Estás en Opción B-2.", 0, new string[] { "Pulsa Enter para volver atrás." });
                OpcionC1 = new Menu("Estás en Opción C-1.", 1, new string[] { "SI", "NO" });
                OpcionSI = new Menu("Estás en Opción Sí.", 0, new string[] { "Pulsa Enter para volver atrás." });
    
                do 
                {
                    Console.BackgroundColor = ConsoleColor.Black;
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.Clear();
                    Console.SetCursorPosition(10, 1);
                    Console.Write("MENÚ PRINCIPAL");
                    Console.SetCursorPosition(10, 3);
                    Console.Write(DateTime.Now.ToString("ddd dd MMM"));
    
                    tecla = Console.ReadKey(true).Key;
    
                    if (tecla == ConsoleKey.Enter) 
                    {
                        while (true) 
                        {
                            opcion = Principal.DoMenu();
                            if (opcion == -1)
                                break;
                            else if (opcion == 0)
                            {
                                while (true)
                                {
                                    opcion = OpcionA.DoMenu();
                                    if (opcion == -1)
                                        break;
                                    else if (opcion == 0)
                                        break;
                                }
                            }
                            else if (opcion == 1)
                            {
                                while (true)
                                {
                                    opcion = OpcionB.DoMenu();
                                    if (opcion == -1)
                                        break;
                                    else if (opcion == 0)
                                    {
                                        while (true)
                                        {
                                            opcion = OpcionB1.DoMenu();
                                            if (opcion == -1)
                                                break;
                                            else if (opcion == 0)
                                                break;
                                        }
                                    }
                                    else if (opcion == 1)
                                    {
                                        while (true)
                                        {
                                            opcion = OpcionB2.DoMenu();
                                            if (opcion == -1)
                                                break;
                                            else if (opcion == 0)
                                                break;
                                        }
                                    }
                                    else if (opcion == 2)
                                        break;
                                }
                            }
                            else if (opcion == 2)
                            {
                                while (true)
                                {
                                    opcion = OpcionC.DoMenu();
                                    if (opcion == -1)
                                        break;
                                    else if (opcion == 2)  // opción 3, la Opción C-1 
                                    {                      // la 1 y la 2 no hacen nada, por eso ni pregunto por ellas
                                        while (true)
                                        {
                                            opcion = OpcionC1.DoMenu();
                                            if (opcion == -1)
                                                break;
                                            else if (opcion == 0)
                                            {
                                                while (true)
                                                {
                                                    opcion = OpcionSI.DoMenu();
                                                    if (opcion == -1)
                                                        break;
                                                    else if (opcion == 0)
                                                        break;
                                                }
                                            }
                                            else if (opcion == 1)
                                            {
                                                irAtras = 1;
                                                break;
                                            }
                                        }
                                        if (irAtras > 0)
                                        {
                                            irAtras--;
                                            break;
                                        }
                                    }
                                }
                            }
                            else if (opcion == 3) 
                                break;
                        }
                    }
    
                } while (tecla != ConsoleKey.Escape);
            }
        }
    
        class Menu
        {
            private string title;      // título
            private string[] options;  // cadenas de opciones
            private int layout;        // si es vertical 0, horizontal 1
            private int index = 0;     // índice de opción
    
            public Menu(string title, int layout, string[] options)
            {
                this.title = title;
                this.layout = layout;
                this.options = options;
            }
    
            // DoMenu: Ejecuta el menú y retorna: -1 -> Se pulsó Esc | De 0 a Nro de menús - 1 -> índice de opción elegida
            public int DoMenu()
            {
                int a;
                ConsoleKey key;
                Console.BackgroundColor = ConsoleColor.Black;
                Console.ForegroundColor = ConsoleColor.White;
                Console.CursorVisible = false;
                Console.Clear();
                Console.SetCursorPosition(12, 2);
                Console.Write(title);
    
                do
                {
                    for (a = 0; a < options.Length; a++)
                    {
                        Console.BackgroundColor = ConsoleColor.Black;
                        if (a == index)
                            Console.BackgroundColor = ConsoleColor.Blue;
                        if (layout == 0)
                            Console.SetCursorPosition(4, 4 + a);
                        else
                            Console.SetCursorPosition(4 + a * 12, 4);
                        Console.Write(options[a]);
                    }
    
                    key = Console.ReadKey(true).Key;
    
                    if (key == ConsoleKey.UpArrow || key == ConsoleKey.LeftArrow)
                    {
                        index--;
                        if (index < 0)
                            index = options.Length - 1;
                    }
                    else if (key == ConsoleKey.DownArrow || key == ConsoleKey.RightArrow)
                    {
                        index++;
                        if (index == options.Length)
                            index = 0;
                    }
                    else if (key == ConsoleKey.Enter)
                    {
                        return index;
                    }
    
                } while (key != ConsoleKey.Escape);
    
                return -1;
            }
        }
    }

    Saludos

    Pablo


    • Marcado como respuesta Metaconta sábado, 29 de febrero de 2020 8:38
    viernes, 28 de febrero de 2020 19:01
  • No te guarda la última opción seleccionada en el Menú Opciones porque cada vez que invocas el método, creas dentro de él la variable opcion y le asignas 0. Una solución para eso es crear la variable opción como miembro de clase y asignarle 0 sólo alli, y no como variable local, que se hacen humo cuando salis del método. Así:

    private int opción = 0;

    O si haces todo el trabajo en Main(), como éste es static, también (creo que) debería serlo el miembro de clase:

    private static int opcion = 0;

    Sabes que no creía que se podía arreglar lo del retorno al Menú Principal desde el NO de Opción C-1 ? Pero me parece que pudiste porque agregaste los while (true) { ... } a algunas partes o eso ya estaba de antes ? Me parece que si, ja ja ja ... escrito de la forma anterior no había forma de solucionarlo ja ja!

    Ahora caigo. Lo que hiciste es hacer como métodos todos los submenús, así al llamar a Menú Principal (que si no me equivoco desde el NO debía volver a Menú Opciones, según el gráfico) luego éste llama a los mismos y no retorna con lo cual no vuelve a la Opción C-1 donde es llamado. Pero lo que estás haciendo al llamar por 2da (o 3ra, 4ta, etc.) vez a Menú Principal, es duplicar (o triplicar, etc.) el mismo y los submenús que sean llamados en la memoria (RAM). 

    Bueno, OK, espero tus comentarios, seguro te vas a poner "canchero" pronto con este asunto.

    Saludos

    • Marcado como respuesta Metaconta sábado, 29 de febrero de 2020 8:39
    viernes, 28 de febrero de 2020 23:12

Todas las respuestas

  • Hola Metaconta

    Ya caí en que es lo que ocurre. Cuando llamas a MenuPrincipal() en la opción NO del submenú OpciónC1, se ejecuta ese método. Al dar Enter en la opción Salir del mismo, este termina, y continúa la ejecución en el submenú OpciónC1, que es donde invocaste a MenuPrincipal(). Escrito de este modo, no hay forma de solucionarlo el problema.

    Por qué pasa esto? Porque estás programando mal los menús desde el vamos. 

    Te paso un método que ejecuta un menú y retorna el índice de la opción elegida, así podes reescribir todo tu programa, de forma más eficiente, que funcione, y en muchas menos lineas.

            // DoMenu: Ejecuta el menú y retorna: -1 -> Se pulsó Esc | De 0 a Nro de menús - 1 -> índice de opción elegida
            private static int DoMenu(string title, string[] options)
            {
                int a, index = 0;
                ConsoleKey key;
                Console.Clear();
                Console.SetCursorPosition(12, 2);
                Console.Write(title);
    
                do
                {
                    for (a = 0; a < options.Length; a++)
                    {
                        Console.BackgroundColor = ConsoleColor.Black;
                        if (a == index)
                            Console.BackgroundColor = ConsoleColor.Blue;
                        Console.SetCursorPosition(4, 4 + a);
                        Console.Write(options[a]);
                    }
    
                    key = Console.ReadKey(true).Key;
    
                    if (key == ConsoleKey.UpArrow || key == ConsoleKey.LeftArrow)
                    { 
                        index--;
                        if (index < 0) 
                            index = options.Length - 1;
                    }
                    else if (key == ConsoleKey.DownArrow || key == ConsoleKey.RightArrow)
                    { 
                        index++;
                        if (index == options.Length) 
                            index = 0;
                    }
                    else if (key == ConsoleKey.Enter)
                    {
                        return index;
                    }
    
                } while (key != ConsoleKey.Escape);
    
                return -1;
            }
    

    Espero que te sea útil, y cualquier duda que tengas, aquí estoy.

    Saludos

    Pablo


    • Propuesto como respuesta Pablo RubioModerator viernes, 28 de febrero de 2020 15:50
    • Marcado como respuesta Metaconta sábado, 29 de febrero de 2020 8:38
    viernes, 28 de febrero de 2020 13:32
  • Hola Metaconta

    Yo solia hacerlo de esta manera

    creaba una clase controladora del menu

    con 3 parametros en el constructor

    la lista de cadenas a mostrar

    la posicion en x

    la posicion en y

    public class MenuBarras
    {
        private int index = 0;
        private int x;
        private int y;
        private List<string> cadenas;
    
        public List<string> Cadenas
        {
            get { return cadenas; }
            set { cadenas = value; }
        }
    
        public MenuBarras(List<string> cadena, int x, int y)
        {
            this.x = x;
            this.y = y;
            cadenas = cadena;
            DrawMenu();
            DrawTextos();
        }
    
        public void gotoXY(int v1, int v2, string cadena)
        {
            Console.SetCursorPosition(v1, v2);
            Console.WriteLine(cadena);
        }
    
        private void DrawMarco(int v1, int v2, int v3, int v4)
        {
            gotoXY(v1, v2, "╔");
            gotoXY(v1, v4, "╚");
            gotoXY(v3, v2, "╗");
            gotoXY(v3, v4, "╝");
    
            for (int i = v1 + 1; i < v3; i++)
            {
                gotoXY(i, v2, "═");
                gotoXY(i, v4, "═");
            }
            for (int i = v2 + 1; i < v4; i++)
            {
                gotoXY(v1, i, "║");
                gotoXY(v3, i, "║");
            }
        }
    
        private void DrawTextos()
        {
            int x = this.x + 1;
            int y = this.y + 1;
            cadenas.Add("Salir");
            for (int i = 0; i < cadenas.Count; i++)
            {
                if (i == index)
                {
                    Console.BackgroundColor = ConsoleColor.Blue;
                    Console.ForegroundColor = ConsoleColor.Yellow;
                }
                else
                {
                    Console.BackgroundColor = ConsoleColor.Black;
                    Console.ForegroundColor = ConsoleColor.White;
                }
                gotoXY(x, y, cadenas[i]);
                y++;
            }
            cadenas.Remove("Salir");
        }
    
        private void DrawMenu()
        {
            int maxSizeCad = 5;
            foreach (var item in cadenas)
            {
                if (item.Length > maxSizeCad)
                    maxSizeCad = item.Length;
            }
            DrawMarco(x, y, x + maxSizeCad + 1, y + cadenas.Count + 2);
        }
    
        private void EraseMenu()
        {
            int maxSizeCad = 5;
            foreach (var item in cadenas)
            {
                if (item.Length > maxSizeCad)
                    maxSizeCad = item.Length;
            }
            Console.BackgroundColor = ConsoleColor.Black;
            Console.ForegroundColor = ConsoleColor.White;
            for (int i = x; i < x + maxSizeCad + 2; i++)
                for (int j = y; j <= y + cadenas.Count + 2; j++)
                {
                    gotoXY(i, j, "   ");
                }
    
        }
    
        public int Seleccion(ConsoleKey key)
        {
            int ret = -1;
            if (key == ConsoleKey.DownArrow)
            {
                if (index < cadenas.Count)
                    index++;
                else
                    index = 0;
            }
            if (key == ConsoleKey.UpArrow)
            {
                if (index > 0)
                    index--;
                else
                    index = cadenas.Count;
            }
            if (key == ConsoleKey.Enter)
            {               
                ret = index;
            }
            if (key == ConsoleKey.Escape)
                ret = cadenas.Count;
            DrawTextos();
            if (ret == cadenas.Count)
                EraseMenu();
            return ret;
        }
    }
    

    y para llamarlo

    private static void Main(string[] args)
    {
        List<string> Cadenas = new List<string>() { "Uno", "Dos", "Tres", "Cuatro" };
        List<string> Cad01 = new List<string> { "Uno Uno", "Uno Dos", "Uno Tres" };
        List<string> Cad02 = new List<string> { "Dos Uno", "Dos Dos", "Dos Tres" };
        List<string> Cad03 = new List<string> { "Tres Uno", "Tres Dos", "Tres Tres" };
        List<string> Cad04 = new List<string> { "Cuatro Uno", "Cuatro Dos", "Cuatro Tres" };
    
       
        Console.CursorVisible = false;
        MenuBarras mb = new MenuBarras(Cadenas, 1, 1);
    
        while (true)
        {
            ConsoleKey opc = Console.ReadKey(true).Key;
    
            int res = mb.Seleccion(opc);
            if (res != -1)
            {
                if (res == Cadenas.Count)
                    break;
                else
                {
                    MenuBarras m;
                    switch (res)
                    {
                        case 0:
                            m = new MenuBarras(Cad01, 15, 2);
                            while (true)
                            {
                                ConsoleKey op = Console.ReadKey(true).Key;
                                res = m.Seleccion(op);
                                if (res != -1)
                                {
                                    if (res == Cad01.Count)
                                        break;
                                    else
                                    {
                                        m.gotoXY(0, 24, $"has seleccionado [{Cad01[res]}]        ");
                                    }
                                }
                            }
                            break;
    
                        case 1:
                            m = new MenuBarras(Cad02, 15, 3);
                            while (true)
                            {
                                ConsoleKey op = Console.ReadKey(true).Key;
                                res = m.Seleccion(op);
                                if (res != -1)
                                {
                                    if (res == Cad02.Count)
                                        break;
                                    else
                                    {
                                        m.gotoXY(0, 24, $"has seleccionado [{Cad02[res]}]        ");
                                    }
                                }
                            }
                            break;
    
                        case 2:
                            m = new MenuBarras(Cad03, 15, 4);
                            while (true)
                            {
                                ConsoleKey op = Console.ReadKey(true).Key;
                                res = m.Seleccion(op);
                                if (res != -1)
                                {
                                    if (res == Cad03.Count)
                                        break;
                                    else
                                    {
                                        m.gotoXY(0, 24, $"has seleccionado [{Cad03[res]}]        ");
                                    }
                                }
                            }
                            break;
    
                        case 3:
                            m = new MenuBarras(Cad04, 15, 2);
                            while (true)
                            {
                                ConsoleKey op = Console.ReadKey(true).Key;
                                res = m.Seleccion(op);
                                if (res != -1)
                                {
                                    if (res == Cad04.Count)
                                        break;
                                    else
                                    {
                                        m.gotoXY(0, 24, $"has seleccionado [{Cad04[res]}]        ");
                                    }
                                }
                            }
                            break;
                    }
                }
            }
        }
        Console.CursorVisible = true;
    }
    

    Selccion me retorna el index del elmento seleccionado y usaria un case

    si es el ultimo elento que sera salir en este caso y siempre esta por defecto al final

    porque asi lo dispuse para no tener que escribir slir en cada menu o submenu

    se retorna al padre de ese menu y borra el menu de pantalla.

      Le puedes poner todos los submenus que decees.

    revisalo y si te funciona genial

    • Propuesto como respuesta Pablo RubioModerator viernes, 28 de febrero de 2020 15:50
    • Marcado como respuesta Metaconta sábado, 29 de febrero de 2020 8:38
    viernes, 28 de febrero de 2020 14:11
  • Cuando salga del trabajo. Prue o hasta el alma.

    A lo mejor en salir. Debo usar algo similar como entrar en otra opción. Para que no pase eso.

    La idea es crear, menús, sub menús y navegar por ello de forma fácil posible como indica en el esquema boceto del primer hilo.

    Gracias.


    http://electronica-pic.blogspot.com

    viernes, 28 de febrero de 2020 15:12
  • Hola Metaconta

    Acá está el programa escrito en muchas menos lineas, con la clase Menu. Fijate de leer y captar el método DoMenu(), así no seguis escribiendo los menús en muchas lineas y repitiendo los strings (ja ja) y todo, además es genérico como hice ese métdodo. Creo que se podría generalizar aún más, algo como una clase MenuTree, pero quizás con lo que tenemos por ahora vamos bien. 

    using System;
    
    namespace MyMenu
    {
        class Program
        {
            static void Main(string[] args)
            {            
                Menu Principal, OpcionA, OpcionB, OpcionC;
                Menu OpcionB1, OpcionB2, OpcionC1, OpcionSI;
                ConsoleKey tecla;
                int irAtras = 0;
                int opcion;
    
                Principal = new Menu("", 0, new string[] { "Opción A", "Opción B", "Opción C", "Salir" });
                OpcionA = new Menu("Estás en Opción A.", 0, new string[] { "Pulsa Enter para salir." });
                OpcionB = new Menu("Estás en Opción B.", 0, new string[] { "Subopción B-1.", "Subopción B-2.", "Salir." });
                OpcionC = new Menu("Estás en Opción C.", 0, new string[] { "Color 1.", "Color 2.", "Opción C-1." });
                OpcionB1 = new Menu("Estás en Opción B-1.", 0, new string[] { "Pulsa Enter para volver atrás." });
                OpcionB2 = new Menu("Estás en Opción B-2.", 0, new string[] { "Pulsa Enter para volver atrás." });
                OpcionC1 = new Menu("Estás en Opción C-1.", 1, new string[] { "SI", "NO" });
                OpcionSI = new Menu("Estás en Opción Sí.", 0, new string[] { "Pulsa Enter para volver atrás." });
    
                do 
                {
                    Console.BackgroundColor = ConsoleColor.Black;
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.Clear();
                    Console.SetCursorPosition(10, 1);
                    Console.Write("MENÚ PRINCIPAL");
                    Console.SetCursorPosition(10, 3);
                    Console.Write(DateTime.Now.ToString("ddd dd MMM"));
    
                    tecla = Console.ReadKey(true).Key;
    
                    if (tecla == ConsoleKey.Enter) 
                    {
                        while (true) 
                        {
                            opcion = Principal.DoMenu();
                            if (opcion == -1)
                                break;
                            else if (opcion == 0)
                            {
                                while (true)
                                {
                                    opcion = OpcionA.DoMenu();
                                    if (opcion == -1)
                                        break;
                                    else if (opcion == 0)
                                        break;
                                }
                            }
                            else if (opcion == 1)
                            {
                                while (true)
                                {
                                    opcion = OpcionB.DoMenu();
                                    if (opcion == -1)
                                        break;
                                    else if (opcion == 0)
                                    {
                                        while (true)
                                        {
                                            opcion = OpcionB1.DoMenu();
                                            if (opcion == -1)
                                                break;
                                            else if (opcion == 0)
                                                break;
                                        }
                                    }
                                    else if (opcion == 1)
                                    {
                                        while (true)
                                        {
                                            opcion = OpcionB2.DoMenu();
                                            if (opcion == -1)
                                                break;
                                            else if (opcion == 0)
                                                break;
                                        }
                                    }
                                    else if (opcion == 2)
                                        break;
                                }
                            }
                            else if (opcion == 2)
                            {
                                while (true)
                                {
                                    opcion = OpcionC.DoMenu();
                                    if (opcion == -1)
                                        break;
                                    else if (opcion == 2)  // opción 3, la Opción C-1 
                                    {                      // la 1 y la 2 no hacen nada, por eso ni pregunto por ellas
                                        while (true)
                                        {
                                            opcion = OpcionC1.DoMenu();
                                            if (opcion == -1)
                                                break;
                                            else if (opcion == 0)
                                            {
                                                while (true)
                                                {
                                                    opcion = OpcionSI.DoMenu();
                                                    if (opcion == -1)
                                                        break;
                                                    else if (opcion == 0)
                                                        break;
                                                }
                                            }
                                            else if (opcion == 1)
                                            {
                                                irAtras = 1;
                                                break;
                                            }
                                        }
                                        if (irAtras > 0)
                                        {
                                            irAtras--;
                                            break;
                                        }
                                    }
                                }
                            }
                            else if (opcion == 3) 
                                break;
                        }
                    }
    
                } while (tecla != ConsoleKey.Escape);
            }
        }
    
        class Menu
        {
            private string title;      // título
            private string[] options;  // cadenas de opciones
            private int layout;        // si es vertical 0, horizontal 1
            private int index = 0;     // índice de opción
    
            public Menu(string title, int layout, string[] options)
            {
                this.title = title;
                this.layout = layout;
                this.options = options;
            }
    
            // DoMenu: Ejecuta el menú y retorna: -1 -> Se pulsó Esc | De 0 a Nro de menús - 1 -> índice de opción elegida
            public int DoMenu()
            {
                int a;
                ConsoleKey key;
                Console.BackgroundColor = ConsoleColor.Black;
                Console.ForegroundColor = ConsoleColor.White;
                Console.CursorVisible = false;
                Console.Clear();
                Console.SetCursorPosition(12, 2);
                Console.Write(title);
    
                do
                {
                    for (a = 0; a < options.Length; a++)
                    {
                        Console.BackgroundColor = ConsoleColor.Black;
                        if (a == index)
                            Console.BackgroundColor = ConsoleColor.Blue;
                        if (layout == 0)
                            Console.SetCursorPosition(4, 4 + a);
                        else
                            Console.SetCursorPosition(4 + a * 12, 4);
                        Console.Write(options[a]);
                    }
    
                    key = Console.ReadKey(true).Key;
    
                    if (key == ConsoleKey.UpArrow || key == ConsoleKey.LeftArrow)
                    {
                        index--;
                        if (index < 0)
                            index = options.Length - 1;
                    }
                    else if (key == ConsoleKey.DownArrow || key == ConsoleKey.RightArrow)
                    {
                        index++;
                        if (index == options.Length)
                            index = 0;
                    }
                    else if (key == ConsoleKey.Enter)
                    {
                        return index;
                    }
    
                } while (key != ConsoleKey.Escape);
    
                return -1;
            }
        }
    }

    Saludos

    Pablo


    • Marcado como respuesta Metaconta sábado, 29 de febrero de 2020 8:38
    viernes, 28 de febrero de 2020 19:01
  •  Escrito de este modo, no hay forma de solucionarlo el problema.

    Pues si, he encontrado ya los resultados y si hay solución. Lo hice a mi manera, por fin me salió. Pongo mi código aquí abajo.

    Ahora voy a por tu código que hiciste, está mucho más simplificado y debo leerlo bien hasta las cejas para entenderlo. ;)Cuando lo pruebe, te digo.

    using System;
    
    namespace Menu_consola_18_cs
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.Title = "Menú de opciones";
    
                // Tamaño ventana consola.
                // X anchura.
                Console.WindowWidth = 20;
    
                // Y altura.
                Console.WindowHeight = 5;
    
                // Oculto el cursor.
                Console.CursorVisible = false;
    
                // Fondo verde.
                Console.BackgroundColor = ConsoleColor.Green;
    
                // Letras negras.
                Console.ForegroundColor = ConsoleColor.Black;
    
                MenuPrincipal();
            }
    
            #region Menú principal.
            public static void MenuPrincipal()
            {
                // Almacena la tecla pulsada en la variable.
                ConsoleKey teclaInicial;
    
                // Limpiar pantalla.
                Console.Clear();
    
                // Posición del cursor del título del MENÚ PRINCIPAL.
                Console.SetCursorPosition(0, 0);
    
                // Título.
                Console.Write("   MENÚ PRINCIPAL   ");
    
                // Pocisión de la hora.
                Console.SetCursorPosition(4, 2);
    
                // Formato numérico dd/MM/yyyy.
                Console.Write(DateTime.Now.ToString("ddd dd MMM"));
    
                // Almacena en la variable una tecla pulsada.
                teclaInicial = Console.ReadKey(true).Key;
    
                // ¿Haz pulsado la tecla Enter?
                if (teclaInicial == ConsoleKey.Enter)
                {
                    // Sí. Se ejecuta esta función.
                    MenuOpciones();
                }
            }
            #endregion
    
            #region Menú de opciones principales.
            public static void MenuOpciones()
            {
                // Contador de teclas y navegador.
                int opcion = 0;
    
                // Capturar tecla para luego validar.
                ConsoleKey tecla;
    
                while (true)
                {
                    //******************************************************************
                    // Dibujo el menú principal.
    
                    // Limpiar pantalla.
                    Console.Clear();
    
                    switch (opcion)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("> Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("  Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("  Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("  Salir.            ");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("  Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("> Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("  Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("  Salir.            ");
                            break;
                        case 2:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("  Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("  Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("> Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("  Salir.            ");
                            break;
                        case 3:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("  Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("  Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("  Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("> Salir.            ");
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
    
                    // Fin de pintar el menú principal.
                    //******************************************************************
    
                    // Leer tecla ingresada por el usuario.
                    tecla = Console.ReadKey(true).Key;
    
                    // Validar el tipo de tecla.
                    if (tecla == ConsoleKey.Enter)
                    {
                        switch (opcion)
                        {
                            case 0:
                                OpcionA();
                                break;
                            case 1:
                                OpcionB();
                                break;
                            case 2:
                                OpcionC();
                                break;
                            case 3:
                                MenuPrincipal();
                                break;
                            default:
                                break;
                        }
                    }
    
                    // Flecha abajo del teclado.
                    if (tecla == ConsoleKey.DownArrow)
                    {
                        opcion++;
                    }
    
                    // Flecha arriba del teclado.
                    if (tecla == ConsoleKey.UpArrow)
                    {
                        opcion--;
                    }
    
                    // Si está en la última opción del menú, salta a la primera.
                    if (opcion > 3)
                    {
                        opcion = 0;
                    }
    
                    // Si está en la primera posición del menú, salta a la última.
                    if (opcion < 0)
                    {
                        opcion = 3;
                    }
                }
            }
            #endregion
    
            #region Opción A (0).
            public static void OpcionA()
            {
                ConsoleKey teclaOpcionA;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción A.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("Salir.");
    
                    // Almacena el teclado pulsado en la variable teclaSubMenuA.
                    teclaOpcionA = Console.ReadKey(true).Key;
    
                } while (teclaOpcionA != ConsoleKey.Enter);
            }
            #endregion
    
            #region Opción B (1).
            public static void OpcionB()
            {
                // Contador de teclas y navegador.
                int opcionB = 0;
    
                // Capturar tecla para luego validar.
                ConsoleKey teclaOpcionB;
    
                while (true)
                {
                    switch (opcionB)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción B.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("> SubOpción B-1.    ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  SubOpción B-2     ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción B.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  SubOpción B-1.    ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> SubOpción B-2     ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 2:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción B.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  SubOpción B-1.    ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  SubOpción B-2     ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("> Salir.            ");
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
    
                    // Leer tecla ingresada por el usuario.
                    teclaOpcionB = Console.ReadKey(true).Key;
    
                    // Validar el tipo de tecla.
                    if (teclaOpcionB == ConsoleKey.Enter)
                    {
                        switch (opcionB)
                        {
                            case 0:
                                OpcionB1();
                                break;
                            case 1:
                                OpcionB2();
                                break;
                            case 2:
                                MenuOpciones();
                                break;
                            default:
                                Console.Write("Fuera de rango.     ");
                                break;
                        }
                    }
    
                    if (teclaOpcionB == ConsoleKey.DownArrow)
                    {
                        opcionB++;
                    }
    
                    if (teclaOpcionB == ConsoleKey.UpArrow)
                    {
                        opcionB--;
                    }
    
                    // Si está en la última opción, salta a la primera.
                    if (opcionB > 2)
                    {
                        opcionB = 0;
                    }
    
                    // Si está en la primera posición, salta a la última.
                    if (opcionB < 0)
                    {
                        opcionB = 2;
                    }
                }
            }
    
            #endregion
    
            #region Opcion B-1.
            public static void OpcionB1()
            {
                ConsoleKey teclaOpcionB1;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción B-1.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para    ");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("volver atrás.       ");
    
                    // Almacena el teclado pulsado en la variable teclaSubMenuA.
                    teclaOpcionB1 = Console.ReadKey(true).Key;
    
                } while (teclaOpcionB1 != ConsoleKey.Enter);
            }
            #endregion
    
            #region Opcion B-2.
            public static void OpcionB2()
            {
                ConsoleKey teclaOpcionB2;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción B-2.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para    ");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("volver atrás.       ");
    
                    // Almacena el teclado pulsado en la variable teclaSubMenuA.
                    teclaOpcionB2 = Console.ReadKey(true).Key;
    
                } while (teclaOpcionB2 != ConsoleKey.Enter);
            }
            #endregion
    
            #region Opción C (2).
            public static void OpcionC()
            {
                // Contador de teclas y navegador.
                int opcionC = 0;
    
                // Capturar tecla para luego validar.
                ConsoleKey teclaOpcionC;
                Console.Clear();
                
                while(true)
                {
                    switch (opcionC)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("> Color 1.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 2.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Opción C-1.       ");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 1.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> Color 2.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Opción C-1.       ");
                            break;
                        case 2:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 1.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 2.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("> Opción C-1.       ");
                            break;
                        case 3:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("> Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 4:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("  Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("> Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 5:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("  Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 6:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("  Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("> Salir.            ");
                            break;
    
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
    
                    // Leer tecla ingresada por el usuario.
                    teclaOpcionC = Console.ReadKey(true).Key;
    
                    // Validar el tipo de tecla.
                    if (teclaOpcionC == ConsoleKey.Enter)
                    {
                        switch (opcionC)
                        {
                            case 0:
                                // Fondo azul.
                                Console.BackgroundColor = ConsoleColor.Blue;
    
                                // Letras blancas.
                                Console.ForegroundColor = ConsoleColor.White;
                                break;
                            case 1:
                                // Fondo verde.
                                Console.BackgroundColor = ConsoleColor.Green;
    
                                // Letras negras.
                                Console.ForegroundColor = ConsoleColor.Black;
                                break;
                            case 2:
                                OpcionC1();
                                break;
                            case 3:
                                // Fondo negro.
                                Console.BackgroundColor = ConsoleColor.Black;
    
                                // Letras rojo.
                                Console.ForegroundColor = ConsoleColor.Red;
                                break;
                            case 4:
                                // Fondo negro.
                                Console.BackgroundColor = ConsoleColor.Black;
    
                                // Letras rojo.
                                Console.ForegroundColor = ConsoleColor.Yellow;
                                break;
                            case 5:
                                // Fondo negro.
                                Console.BackgroundColor = ConsoleColor.Red;
    
                                // Letras rojo.
                                Console.ForegroundColor = ConsoleColor.DarkRed;
                                break;
                            case 6:
                                MenuOpciones();
                                break;
                            default:
                                Console.Write("Fuera de rango.     ");
                                break;
                        }
                    }
    
                    if (teclaOpcionC == ConsoleKey.DownArrow)
                    {
                        opcionC++;
                    }
    
                    if (teclaOpcionC == ConsoleKey.UpArrow)
                    {
                        opcionC--;
                    }
    
                    // Si está en la última opción, salta a la primera.
                    if (opcionC > 6)
                    {
                        opcionC = 0;
                    }
    
                    // Si está en la primera posición, salta a la última.
                    if (opcionC < 0)
                    {
                        opcionC = 6;
                    }
                }
            }
            #endregion
    
            #region OpcionC-1.
            public static void OpcionC1()
            {
                // Contador de teclas y navegador.
                int opcionC1 = 0;
    
                // Capturar tecla para luego validar.
                ConsoleKey teclaOpcionC1;
                Console.Clear();
                
                while(true)
                {
                    Console.Clear();
    
                    switch (opcionC1)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C-1.");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  SI");
                            Console.SetCursorPosition(16, 2);
                            Console.WriteLine("> NO");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C-1.");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> SI");
                            Console.SetCursorPosition(16, 2);
                            Console.WriteLine("  NO");
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
    
                    // Leer tecla ingresada por el usuario.
                    teclaOpcionC1 = Console.ReadKey(true).Key;
    
                    // Validar el tipo de tecla.
                    if (teclaOpcionC1 == ConsoleKey.Enter)
                    {
                        switch (opcionC1)
                        {
                            case 0:
                                MenuPrincipal();
                                Console.Clear();
                                break;
                            case 1:
                                OpcionSI();
                                break;
                            default:
                                Console.Write("Fuera de rango.     ");
                                break;
                        }
                    }
    
                    // Flecha derecha.
                    if (teclaOpcionC1 == ConsoleKey.RightArrow)
                    {
                        opcionC1++;
                    }
    
                    // Flecha izquierda.
                    if (teclaOpcionC1 == ConsoleKey.LeftArrow)
                    {
                        opcionC1--;
                    }
    
                    // Si está en la última opción, salta a la primera.
                    if (opcionC1 > 1)
                    {
                        opcionC1 = 0;
                    }
    
                    // Si está en la primera posición, salta a la última.
                    if (opcionC1 < 0)
                    {
                        opcionC1 = 1;
                    }
                }
            }
            #endregion
    
            #region opcionSI del sub menú C-1.
            public static void OpcionSI()
            {
                ConsoleKey teclaOpcionB1;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción SÍ.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para    ");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("volver atrás.       ");
    
                    // Almacena el teclado pulsado en la variable teclaOpciónB1.
                    teclaOpcionB1 = Console.ReadKey(true).Key;
    
                } while (teclaOpcionB1 != ConsoleKey.Enter);
            }
            #endregion
        }
    }

    Mi código funciona tal como lo quiero, y si, es chapuza a domicilio, mucha memoria y mucho código que se puede reducir gracias al tuyo. Voy a probarlo y comento las impresiones.

    Muchas gracias campeón, nos vemos cuando lo haya provado que será estos días.

    PD: Lo único que me falla, si voy a la opción C-1, le doy salir, al llegar a la opción principal que pone:

       Opción A.   
       Opción B.
     > Opción C.

    Se me pone la flecha marcadore de opciónes siempre en Opción A, no se me guarda en la última opción seleccionada. Debo corregir esto, ya sería con una variable para memorizarlo.


    http://electronica-pic.blogspot.com


    • Editado Metaconta viernes, 28 de febrero de 2020 21:38
    viernes, 28 de febrero de 2020 21:33
  • No te guarda la última opción seleccionada en el Menú Opciones porque cada vez que invocas el método, creas dentro de él la variable opcion y le asignas 0. Una solución para eso es crear la variable opción como miembro de clase y asignarle 0 sólo alli, y no como variable local, que se hacen humo cuando salis del método. Así:

    private int opción = 0;

    O si haces todo el trabajo en Main(), como éste es static, también (creo que) debería serlo el miembro de clase:

    private static int opcion = 0;

    Sabes que no creía que se podía arreglar lo del retorno al Menú Principal desde el NO de Opción C-1 ? Pero me parece que pudiste porque agregaste los while (true) { ... } a algunas partes o eso ya estaba de antes ? Me parece que si, ja ja ja ... escrito de la forma anterior no había forma de solucionarlo ja ja!

    Ahora caigo. Lo que hiciste es hacer como métodos todos los submenús, así al llamar a Menú Principal (que si no me equivoco desde el NO debía volver a Menú Opciones, según el gráfico) luego éste llama a los mismos y no retorna con lo cual no vuelve a la Opción C-1 donde es llamado. Pero lo que estás haciendo al llamar por 2da (o 3ra, 4ta, etc.) vez a Menú Principal, es duplicar (o triplicar, etc.) el mismo y los submenús que sean llamados en la memoria (RAM). 

    Bueno, OK, espero tus comentarios, seguro te vas a poner "canchero" pronto con este asunto.

    Saludos

    • Marcado como respuesta Metaconta sábado, 29 de febrero de 2020 8:39
    viernes, 28 de febrero de 2020 23:12
  • Buenas:

    Eso de ponerme chanchero, ajjajajajajjaajajjaa. No conozco esa expresión. ;)

    En cuanto a la RAM, no me hizo gracia eso de duplicar, triplicar, etc...... Tenía 2.1 MB de RAM, me puse todo el rato tocando opciones y se me quedó en 2.2 MB.

    Quizás sea buena opción eso de liberar RAM, por si acaso.

    Cambié la flecha hacia el principal de este esquema.

    Código C#:

    using System;
    
    namespace Menu_consola_18_cs
    {
        class Program
        {
            // Variable general para guardar el > de la última opción que haz entrado
            // en la hora de volver atrás. Por ejemplo: 
            public static int guardarOpcion = 0;
            static void Main(string[] args)
            {
                Console.Title = "Menú de opciones";
    
                // Tamaño ventana consola.
                // X anchura.
                Console.WindowWidth = 20;
    
                // Y altura.
                Console.WindowHeight = 5;
    
                // Oculto el cursor.
                Console.CursorVisible = false;
    
                // Fondo verde.
                Console.BackgroundColor = ConsoleColor.Green;
    
                // Letras negras.
                Console.ForegroundColor = ConsoleColor.Black;
    
                MenuPrincipal();
            }
    
            #region Menú principal.
            public static void MenuPrincipal()
            {
                // Almacena la tecla pulsada en la variable.
                ConsoleKey teclaInicial;
    
                // Limpiar pantalla.
                Console.Clear();
    
                // Posición del cursor del título del MENÚ PRINCIPAL.
                Console.SetCursorPosition(0, 0);
    
                // Título.
                Console.Write("   MENÚ PRINCIPAL   ");
    
                // Pocisión de la hora.
                Console.SetCursorPosition(4, 2);
    
                // Formato numérico dd/MM/yyyy.
                Console.Write(DateTime.Now.ToString("ddd dd MMM"));
    
                // Almacena en la variable una tecla pulsada.
                teclaInicial = Console.ReadKey(true).Key;
    
                // ¿Haz pulsado la tecla Enter?
                if (teclaInicial == ConsoleKey.Enter)
                {
                    // Sí. Se ejecuta esta función.
                    MenuOpciones();
                }
            }
            #endregion
    
            #region Menú de opciones principales.
            public static void MenuOpciones()
            {
                // Contador de teclas y navegador.
                int opcion = 0;
                opcion = guardarOpcion;
    
                // Capturar tecla para luego validar.
                ConsoleKey tecla;
    
                while (true)
                {
                    //******************************************************************
                    // Dibujo el menú principal.
    
                    // Limpiar pantalla.
                    Console.Clear();
    
                    switch (opcion)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("> Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("  Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("  Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("  Salir.            ");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("  Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("> Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("  Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("  Salir.            ");
                            break;
                        case 2:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("  Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("  Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("> Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("  Salir.            ");
                            break;
                        case 3:
                            Console.SetCursorPosition(0, 0);
                            Console.Write("  Opción A.         ");
                            Console.SetCursorPosition(0, 1);
                            Console.Write("  Opción B.         ");
                            Console.SetCursorPosition(0, 2);
                            Console.Write("  Opción C.         ");
                            Console.SetCursorPosition(0, 3);
                            Console.Write("> Salir.            ");
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
    
                    // Fin de pintar el menú principal.
                    //******************************************************************
    
                    // Leer tecla ingresada por el usuario.
                    tecla = Console.ReadKey(true).Key;
    
                    // Validar el tipo de tecla.
                    if (tecla == ConsoleKey.Enter)
                    {
                        switch (opcion)
                        {
                            case 0:
                                OpcionA();
                                break;
                            case 1:
                                OpcionB();
                                break;
                            case 2:
                                OpcionC();
                                break;
                            case 3:
                                guardarOpcion = 0;
                                MenuPrincipal();
                                break;
                            default:
                                break;
                        }
                    }
    
                    // Flecha abajo del teclado.
                    if (tecla == ConsoleKey.DownArrow)
                    {
                        opcion++;
                    }
    
                    // Flecha arriba del teclado.
                    if (tecla == ConsoleKey.UpArrow)
                    {
                        opcion--;
                    }
    
                    // Si está en la última opción del menú, salta a la primera.
                    if (opcion > 3)
                    {
                        opcion = 0;
                    }
    
                    // Si está en la primera posición del menú, salta a la última.
                    if (opcion < 0)
                    {
                        opcion = 3;
                    }
                }
            }
            #endregion
    
            #region Opción A (0).
            public static void OpcionA()
            {
                ConsoleKey teclaOpcionA;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción A.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("Salir.");
    
                    // Almacena el teclado pulsado en la variable teclaSubMenuA.
                    teclaOpcionA = Console.ReadKey(true).Key;
    
                } while (teclaOpcionA != ConsoleKey.Enter);
            }
            #endregion
    
            #region Opción B (1).
            public static void OpcionB()
            {
                // Contador de teclas y navegador.
                int opcionB = 0;
    
                // Capturar tecla para luego validar.
                ConsoleKey teclaOpcionB;
    
                while (true)
                {
                    switch (opcionB)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción B.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("> SubOpción B-1.    ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  SubOpción B-2     ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción B.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  SubOpción B-1.    ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> SubOpción B-2     ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 2:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción B.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  SubOpción B-1.    ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  SubOpción B-2     ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("> Salir.            ");
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
    
                    // Leer tecla ingresada por el usuario.
                    teclaOpcionB = Console.ReadKey(true).Key;
    
                    // Validar el tipo de tecla.
                    if (teclaOpcionB == ConsoleKey.Enter)
                    {
                        switch (opcionB)
                        {
                            case 0:
                                OpcionB1();
                                break;
                            case 1:
                                OpcionB2();
                                break;
                            case 2:
                                guardarOpcion = 1;
                                MenuOpciones();
                                break;
                            default:
                                Console.Write("Fuera de rango.     ");
                                break;
                        }
                    }
    
                    if (teclaOpcionB == ConsoleKey.DownArrow)
                    {
                        opcionB++;
                    }
    
                    if (teclaOpcionB == ConsoleKey.UpArrow)
                    {
                        opcionB--;
                    }
    
                    // Si está en la última opción, salta a la primera.
                    if (opcionB > 2)
                    {
                        opcionB = 0;
                    }
    
                    // Si está en la primera posición, salta a la última.
                    if (opcionB < 0)
                    {
                        opcionB = 2;
                    }
                }
            }
    
            #endregion
    
            #region Opcion B-1.
            public static void OpcionB1()
            {
                ConsoleKey teclaOpcionB1;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción B-1.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para    ");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("volver atrás.       ");
    
                    // Almacena el teclado pulsado en la variable teclaSubMenuA.
                    teclaOpcionB1 = Console.ReadKey(true).Key;
    
                } while (teclaOpcionB1 != ConsoleKey.Enter);
            }
            #endregion
    
            #region Opcion B-2.
            public static void OpcionB2()
            {
                ConsoleKey teclaOpcionB2;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción B-2.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para    ");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("volver atrás.       ");
    
                    // Almacena el teclado pulsado en la variable teclaSubMenuA.
                    teclaOpcionB2 = Console.ReadKey(true).Key;
    
                } while (teclaOpcionB2 != ConsoleKey.Enter);
            }
            #endregion
    
            #region Opción C (2).
            public static void OpcionC()
            {
                // Contador de teclas y navegador.
                int opcionC = 0;
    
                // Capturar tecla para luego validar.
                ConsoleKey teclaOpcionC;
                Console.Clear();
                
                while(true)
                {
                    switch (opcionC)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("> Color 1.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 2.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Opción C-1.       ");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 1.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> Color 2.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Opción C-1.       ");
                            break;
                        case 2:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C.  ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 1.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 2.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("> Opción C-1.       ");
                            break;
                        case 3:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("> Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 4:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("  Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("> Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 5:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("  Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("  Salir.            ");
                            break;
                        case 6:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("  Color 3.          ");
                            Console.SetCursorPosition(0, 1);
                            Console.WriteLine("  Color 4.          ");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  Color 5.          ");
                            Console.SetCursorPosition(0, 3);
                            Console.WriteLine("> Salir.            ");
                            break;
    
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
    
                    // Leer tecla ingresada por el usuario.
                    teclaOpcionC = Console.ReadKey(true).Key;
    
                    // Validar el tipo de tecla.
                    if (teclaOpcionC == ConsoleKey.Enter)
                    {
                        switch (opcionC)
                        {
                            case 0:
                                // Fondo azul.
                                Console.BackgroundColor = ConsoleColor.Blue;
    
                                // Letras blancas.
                                Console.ForegroundColor = ConsoleColor.White;
                                break;
                            case 1:
                                // Fondo verde.
                                Console.BackgroundColor = ConsoleColor.Green;
    
                                // Letras negras.
                                Console.ForegroundColor = ConsoleColor.Black;
                                break;
                            case 2:
                                OpcionC1();
                                break;
                            case 3:
                                // Fondo negro.
                                Console.BackgroundColor = ConsoleColor.Black;
    
                                // Letras rojo.
                                Console.ForegroundColor = ConsoleColor.Red;
                                break;
                            case 4:
                                // Fondo negro.
                                Console.BackgroundColor = ConsoleColor.Black;
    
                                // Letras rojo.
                                Console.ForegroundColor = ConsoleColor.Yellow;
                                break;
                            case 5:
                                // Fondo negro.
                                Console.BackgroundColor = ConsoleColor.Red;
    
                                // Letras rojo.
                                Console.ForegroundColor = ConsoleColor.DarkRed;
                                break;
                            case 6:
                                guardarOpcion = 2;
                                MenuOpciones();
                                break;
                            default:
                                Console.Write("Fuera de rango.     ");
                                break;
                        }
                    }
    
                    if (teclaOpcionC == ConsoleKey.DownArrow)
                    {
                        opcionC++;
                    }
    
                    if (teclaOpcionC == ConsoleKey.UpArrow)
                    {
                        opcionC--;
                    }
    
                    // Si está en la última opción, salta a la primera.
                    if (opcionC > 6)
                    {
                        opcionC = 0;
                    }
    
                    // Si está en la primera posición, salta a la última.
                    if (opcionC < 0)
                    {
                        opcionC = 6;
                    }
                }
            }
            #endregion
    
            #region OpcionC-1.
            public static void OpcionC1()
            {
                // Contador de teclas y navegador.
                int opcionC1 = 0;
    
                // Capturar tecla para luego validar.
                ConsoleKey teclaOpcionC1;
                Console.Clear();
                
                while(true)
                {
                    Console.Clear();
    
                    switch (opcionC1)
                    {
                        case 0:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C-1.");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("  SI");
                            Console.SetCursorPosition(16, 2);
                            Console.WriteLine("> NO");
                            break;
                        case 1:
                            Console.SetCursorPosition(0, 0);
                            Console.WriteLine("Estás en Opción C-1.");
                            Console.SetCursorPosition(0, 2);
                            Console.WriteLine("> SI");
                            Console.SetCursorPosition(16, 2);
                            Console.WriteLine("  NO");
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
    
                    // Leer tecla ingresada por el usuario.
                    teclaOpcionC1 = Console.ReadKey(true).Key;
    
                    // Validar el tipo de tecla.
                    if (teclaOpcionC1 == ConsoleKey.Enter)
                    {
                        switch (opcionC1)
                        {
                            case 0:
                                guardarOpcion = 2;
                                MenuPrincipal();
                                //Console.Clear();
                                break;
                            case 1:
                                OpcionSI();
                                break;
                            default:
                                Console.Write("Fuera de rango.     ");
                                break;
                        }
                    }
    
                    // Flecha derecha.
                    if (teclaOpcionC1 == ConsoleKey.RightArrow)
                    {
                        opcionC1++;
                    }
    
                    // Flecha izquierda.
                    if (teclaOpcionC1 == ConsoleKey.LeftArrow)
                    {
                        opcionC1--;
                    }
    
                    // Si está en la última opción, salta a la primera.
                    if (opcionC1 > 1)
                    {
                        opcionC1 = 0;
                    }
    
                    // Si está en la primera posición, salta a la última.
                    if (opcionC1 < 0)
                    {
                        opcionC1 = 1;
                    }
                }
            }
            #endregion
    
            #region opcionSI del sub menú C-1.
            public static void OpcionSI()
            {
                ConsoleKey teclaOpcionB1;
                Console.Clear();
                do
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("Estás en Opción SÍ.");
                    Console.SetCursorPosition(0, 2);
                    Console.WriteLine("Pulse Enter para    ");
                    Console.SetCursorPosition(0, 3);
                    Console.WriteLine("volver atrás.       ");
    
                    // Almacena el teclado pulsado en la variable teclaOpciónB1.
                    teclaOpcionB1 = Console.ReadKey(true).Key;
    
                } while (teclaOpcionB1 != ConsoleKey.Enter);
            }
            #endregion
        }
    }

    Ya me dirás la RAM.

    Tu código funciona bien. Debo estudiarlo muy bien.

    Gracias.


    http://electronica-pic.blogspot.com


    • Editado Metaconta sábado, 29 de febrero de 2020 6:33
    sábado, 29 de febrero de 2020 6:17
  • Solo me hace falta eso de que si gasto mucha RAM abriento todo el rato métodos uno tras otro, no me hace gracia.

    Debe haber alguna manera de liberar memoria para que esto no ocurra.


    http://electronica-pic.blogspot.com

    sábado, 29 de febrero de 2020 9:02