Llenar comboBox con Rangos Horarios (C#)

Iniciado por Solid Water, Mayo 23, 2019, 11:35:58 AM

Tema anterior - Siguiente tema

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

Mayo 23, 2019, 11:35:58 AM Ultima modificación: Mayo 23, 2019, 07:27:40 PM por Solid Water
Este es un código que acabo de "improvisar" para llenar un combo box con rangos entre horas.
Algo que se pidió es se le pase una hora inicial, minuto inicial, hora hasta, minuto hasta y el rango o intervalo en minutos entre los valores del medio.
Todo esto debería ser modificable desde el app.config a si pudiese cambiarse sin recompilar el programa.

Acá los valores en el app.config:
Código: csharp

  <appSettings>
    <add key="HoraDesde" value="20" />
    <add key="MinutoDesde" value="10" />
   
    <add key="HoraHasta" value="3" />
    <add key="MinutoHasta" value="25" />

    <add key="IntervaloDeMinutos" value="30" />
  </appSettings>



Acá el form1 de prueba el cual tiene el combo box a cargar.
Creo que también se podría haber hecho con No tienes permitido ver los links. Registrarse o Entrar a mi cuenta o algo similar.

Código: csharp

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;

namespace LlenandoCombo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            int HoraDesde = Convert.ToInt32(ConfigurationManager.AppSettings["HoraDesde"].ToString());
            int MinutoDesde = Convert.ToInt32(ConfigurationManager.AppSettings["MinutoDesde"].ToString());

            int HoraHasta = Convert.ToInt32(ConfigurationManager.AppSettings["HoraHasta"].ToString());
            int MinutoHasta = Convert.ToInt32(ConfigurationManager.AppSettings["MinutoHasta"].ToString());

            int IntervaloDeMinutos = Convert.ToInt32(ConfigurationManager.AppSettings["IntervaloDeMinutos"].ToString());
           

            LlenarCombo(HoraDesde, MinutoDesde, HoraHasta, MinutoHasta, IntervaloDeMinutos);
        }

        private void LlenarCombo(int _HoraDesde, int _MinutoDesde, int _HoraHasta, int _MinutoHasta, int MinutesRange)
        {
            try
            {

                DateTime HorasYMinutosDesde = new DateTime();

                //setea primera hora
                TimeSpan ts = new TimeSpan(_HoraDesde, _MinutoDesde, 0);
                HorasYMinutosDesde = HorasYMinutosDesde.Date + ts;
                comboBox1.Items.Add(HorasYMinutosDesde.ToString("HH:mm"));
               
                //Si hora 'desde' es mayor a la 'hasta' o es la misma hora pero mayores minutos
                //Agrega 24 hs para calcular que es en un día distinto
                if (_HoraDesde > _HoraHasta || (_HoraDesde == _HoraHasta && _MinutoDesde > _MinutoHasta))
                {
                    _HoraHasta += 24;

                }

                DateTime HorasYMinutosHasta = new DateTime();
                ts = new TimeSpan(_HoraHasta, _MinutoHasta, 0);
                HorasYMinutosHasta = HorasYMinutosHasta.Date + ts;

                DateTime HorasYMinutosIntervalo = new DateTime();

                HorasYMinutosIntervalo = HorasYMinutosDesde;

                //Acá se podría usar DateTime.Compare pero me parecio más simple así
                while (HorasYMinutosIntervalo.Hour <= HorasYMinutosHasta.Hour ||
                        HorasYMinutosIntervalo.Date <= HorasYMinutosHasta.Date)
                {
                    HorasYMinutosIntervalo = HorasYMinutosIntervalo.AddMinutes(MinutesRange);

                    //Acá chequea que la nueva hora agregar no haya igualado o superado a la máxima
                    if (HorasYMinutosIntervalo.Hour == HorasYMinutosHasta.Hour &&
                        HorasYMinutosIntervalo.Minute >= HorasYMinutosHasta.Minute
                        && HorasYMinutosIntervalo.Date == HorasYMinutosHasta.Date)
                    {

                        break;
                    }
                    comboBox1.Items.Add(HorasYMinutosIntervalo.ToString("HH:mm"));
                }

                //Setea hora hasta   
                comboBox1.Items.Add(HorasYMinutosHasta.ToString("HH:mm"));
                comboBox1.SelectedIndex = 0;
            }
            catch (Exception e)
            {

                MessageBox.Show("Se ha producido un error, contacte al administrador del sistema \n" + e.Message.ToString());
            }
        }
    }
}



Algo interesante que surgió fue que ademas de hacerlo con horas ascendentes como de 12:00 a 16:00 e intervalo de 30 min, se pueda hacer con horarios por ejemplo de 22:00 a 3:00 (AM) (donde va de mayor a menor).
Les dejo una imagen:


Otra con rango de 5 minutos:


Después veré de hacer un código más limpio.

Saludos

Muy bueno!

Gracias por compartir tu código!

Podrías editar el título y agregar el lenguaje que utilizaste (C#) para que sea fácil de identificar para otros usuarios.

Un saludo!
Nivel 77 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Bueno resulta que hubo un mal entendido y las horas a cargar no eran horas diarias.
En su lugar las horas podian ir por ejemplo de 3 a 29, etc siempre dando la hora desde, minuto desde, hora hasta, minuto hasta, intervalo en minutos.
Acabo de cocinar este code.


App.config:
Código: Csharp

<?xml version="1.0" encoding="utf-8" ?>
<configuration>


  <appSettings>
    <!-- Los valores si no son de 2 cifras deben tener ceros como 01, 02 ,03, etc-->
    <add key="HoraDesde" value="00" />
    <add key="MinutoDesde" value="00" />
   
    <add key="HoraHasta" value="28" />
    <add key="MinutoHasta" value="00" />

    <add key="IntervaloDeMinutos" value="180" />
  </appSettings>
 
</configuration>


Form1.cs
Código: Csharp

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;

namespace LlenandoCombo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            string HoraDesde = ConfigurationManager.AppSettings["HoraDesde"].ToString();
            string MinutoDesde = ConfigurationManager.AppSettings["MinutoDesde"].ToString();

            string HoraHasta =ConfigurationManager.AppSettings["HoraHasta"].ToString();
            string MinutoHasta = ConfigurationManager.AppSettings["MinutoHasta"].ToString();

            int IntervaloDeMinutos = Convert.ToInt32(ConfigurationManager.AppSettings["IntervaloDeMinutos"].ToString());
           

            LlenarCombo(HoraDesde, MinutoDesde, HoraHasta, MinutoHasta, IntervaloDeMinutos);
        }

        private void LlenarCombo(string _HoraDesde, string _MinutoDesde, string _HoraHasta, string _MinutoHasta, int MinutesRange)
        {
            try
            {
                comboBox1.Items.Add(_HoraDesde + ":" + _MinutoDesde);
                int horadesde = Convert.ToInt32(_HoraDesde);
                int horahasta = Convert.ToInt32(_HoraHasta);
                int minutodesde = Convert.ToInt32(_MinutoDesde);
                int minutohasta = Convert.ToInt32(_MinutoHasta);
                int multiplicador;
           
                int horaintervalo = horadesde;
                int minutointervalo = minutodesde;

                string strHoraIntervalo, strMinutoIntervalo;
               

                while(horaintervalo < horahasta &&
                     (horaintervalo != horahasta || minutointervalo < minutohasta))
                {
                    minutointervalo += MinutesRange;

                    if (minutointervalo >= 60)
                    {
                        multiplicador = (minutointervalo / 60);
                        minutointervalo -= 60 * multiplicador;
                        horaintervalo += 1 * multiplicador;
                    }

                    if (horaintervalo > horahasta ||
                       (horaintervalo == horahasta && minutointervalo >= minutohasta))
                    {
                        break;
                    }
                   
                    strHoraIntervalo = horaintervalo.ToString();
                    strMinutoIntervalo = minutointervalo.ToString();

                    if (strHoraIntervalo.Length == 1)
                    {
                        strHoraIntervalo = "0" + strHoraIntervalo;
                    }

                    if (strMinutoIntervalo.Length == 1)
                    {
                        strMinutoIntervalo = "0" + strMinutoIntervalo;
                    }

                    comboBox1.Items.Add(strHoraIntervalo + ":" + strMinutoIntervalo);

                }

                comboBox1.Items.Add(_HoraHasta + ":" + _MinutoHasta);
                comboBox1.SelectedIndex = 0;
             

            }
            catch (Exception e)
            {

                MessageBox.Show("Se ha producido un error, contacte al administrador del sistema \n" + e.Message.ToString());
            }
        }
    }
}


Una imagen:



Saludos,