Llenar comboBox con Rangos Horarios (C#)

  • 2 Respuestas
  • 2026 Vistas

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

Desconectado Solid Water

  • *
  • Underc0der
  • Mensajes: 145
  • Actividad:
    0%
  • Reputación 6
  • (:{
    • Ver Perfil

Llenar comboBox con Rangos Horarios (C#)

  • en: Mayo 23, 2019, 11:35:58 am
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: C#
  1.   <appSettings>
  2.     <add key="HoraDesde" value="20" />
  3.     <add key="MinutoDesde" value="10" />
  4.    
  5.     <add key="HoraHasta" value="3" />
  6.     <add key="MinutoHasta" value="25" />
  7.  
  8.     <add key="IntervaloDeMinutos" value="30" />
  9.   </appSettings>


Acá el form1 de prueba el cual tiene el combo box a cargar.
Creo que también se podría haber hecho con DateTime.Compare o algo similar.

Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Configuration;
  10.  
  11. namespace LlenandoCombo
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         public Form1()
  16.         {
  17.             InitializeComponent();
  18.         }
  19.  
  20.         private void Form1_Load(object sender, EventArgs e)
  21.         {
  22.  
  23.             int HoraDesde = Convert.ToInt32(ConfigurationManager.AppSettings["HoraDesde"].ToString());
  24.             int MinutoDesde = Convert.ToInt32(ConfigurationManager.AppSettings["MinutoDesde"].ToString());
  25.  
  26.             int HoraHasta = Convert.ToInt32(ConfigurationManager.AppSettings["HoraHasta"].ToString());
  27.             int MinutoHasta = Convert.ToInt32(ConfigurationManager.AppSettings["MinutoHasta"].ToString());
  28.  
  29.             int IntervaloDeMinutos = Convert.ToInt32(ConfigurationManager.AppSettings["IntervaloDeMinutos"].ToString());
  30.            
  31.  
  32.             LlenarCombo(HoraDesde, MinutoDesde, HoraHasta, MinutoHasta, IntervaloDeMinutos);
  33.         }
  34.  
  35.         private void LlenarCombo(int _HoraDesde, int _MinutoDesde, int _HoraHasta, int _MinutoHasta, int MinutesRange)
  36.         {
  37.             try
  38.             {
  39.  
  40.                 DateTime HorasYMinutosDesde = new DateTime();
  41.  
  42.                 //setea primera hora
  43.                 TimeSpan ts = new TimeSpan(_HoraDesde, _MinutoDesde, 0);
  44.                 HorasYMinutosDesde = HorasYMinutosDesde.Date + ts;
  45.                 comboBox1.Items.Add(HorasYMinutosDesde.ToString("HH:mm"));
  46.                
  47.                 //Si hora 'desde' es mayor a la 'hasta' o es la misma hora pero mayores minutos
  48.                 //Agrega 24 hs para calcular que es en un día distinto
  49.                 if (_HoraDesde > _HoraHasta || (_HoraDesde == _HoraHasta && _MinutoDesde > _MinutoHasta))
  50.                 {
  51.                     _HoraHasta += 24;
  52.  
  53.                 }
  54.  
  55.                 DateTime HorasYMinutosHasta = new DateTime();
  56.                 ts = new TimeSpan(_HoraHasta, _MinutoHasta, 0);
  57.                 HorasYMinutosHasta = HorasYMinutosHasta.Date + ts;
  58.  
  59.                 DateTime HorasYMinutosIntervalo = new DateTime();
  60.  
  61.                 HorasYMinutosIntervalo = HorasYMinutosDesde;
  62.  
  63.                 //Acá se podría usar DateTime.Compare pero me parecio más simple así
  64.                 while (HorasYMinutosIntervalo.Hour <= HorasYMinutosHasta.Hour ||
  65.                         HorasYMinutosIntervalo.Date <= HorasYMinutosHasta.Date)
  66.                 {
  67.                     HorasYMinutosIntervalo = HorasYMinutosIntervalo.AddMinutes(MinutesRange);
  68.  
  69.                     //Acá chequea que la nueva hora agregar no haya igualado o superado a la máxima
  70.                     if (HorasYMinutosIntervalo.Hour == HorasYMinutosHasta.Hour &&
  71.                         HorasYMinutosIntervalo.Minute >= HorasYMinutosHasta.Minute
  72.                         && HorasYMinutosIntervalo.Date == HorasYMinutosHasta.Date)
  73.                     {
  74.  
  75.                         break;
  76.                     }
  77.                     comboBox1.Items.Add(HorasYMinutosIntervalo.ToString("HH:mm"));
  78.                 }
  79.  
  80.                 //Setea hora hasta  
  81.                 comboBox1.Items.Add(HorasYMinutosHasta.ToString("HH:mm"));
  82.                 comboBox1.SelectedIndex = 0;
  83.             }
  84.             catch (Exception e)
  85.             {
  86.  
  87.                 MessageBox.Show("Se ha producido un error, contacte al administrador del sistema \n" + e.Message.ToString());
  88.             }
  89.         }
  90.     }
  91. }


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
« Última modificación: Mayo 23, 2019, 07:27:40 pm por Solid Water »



Desconectado DeBobiPro

  • *
  • Ex-Staff
  • *****
  • Mensajes: 328
  • Actividad:
    0%
  • Reputación 6
  • Como no sabía que era imposible, lo hice.
    • Ver Perfil

Re:Llenar comboBox con Rangos Horarios

  • en: Mayo 23, 2019, 11:42:45 am
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 TERCER OJO

Desconectado Solid Water

  • *
  • Underc0der
  • Mensajes: 145
  • Actividad:
    0%
  • Reputación 6
  • (:{
    • Ver Perfil

Re:Llenar comboBox con Rangos Horarios (C#)

  • en: Mayo 24, 2019, 02:25:48 pm
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: C#
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.  
  4.  
  5.   <appSettings>
  6.     <!-- Los valores si no son de 2 cifras deben tener ceros como 01, 02 ,03, etc-->
  7.     <add key="HoraDesde" value="00" />
  8.     <add key="MinutoDesde" value="00" />
  9.    
  10.     <add key="HoraHasta" value="28" />
  11.     <add key="MinutoHasta" value="00" />
  12.  
  13.     <add key="IntervaloDeMinutos" value="180" />
  14.   </appSettings>
  15.  
  16. </configuration>
  17.  

Form1.cs
Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Configuration;
  10.  
  11. namespace LlenandoCombo
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         public Form1()
  16.         {
  17.             InitializeComponent();
  18.         }
  19.  
  20.         private void Form1_Load(object sender, EventArgs e)
  21.         {
  22.  
  23.             string HoraDesde = ConfigurationManager.AppSettings["HoraDesde"].ToString();
  24.             string MinutoDesde = ConfigurationManager.AppSettings["MinutoDesde"].ToString();
  25.  
  26.             string HoraHasta =ConfigurationManager.AppSettings["HoraHasta"].ToString();
  27.             string MinutoHasta = ConfigurationManager.AppSettings["MinutoHasta"].ToString();
  28.  
  29.             int IntervaloDeMinutos = Convert.ToInt32(ConfigurationManager.AppSettings["IntervaloDeMinutos"].ToString());
  30.            
  31.  
  32.             LlenarCombo(HoraDesde, MinutoDesde, HoraHasta, MinutoHasta, IntervaloDeMinutos);
  33.         }
  34.  
  35.         private void LlenarCombo(string _HoraDesde, string _MinutoDesde, string _HoraHasta, string _MinutoHasta, int MinutesRange)
  36.         {
  37.             try
  38.             {
  39.                 comboBox1.Items.Add(_HoraDesde + ":" + _MinutoDesde);
  40.                 int horadesde = Convert.ToInt32(_HoraDesde);
  41.                 int horahasta = Convert.ToInt32(_HoraHasta);
  42.                 int minutodesde = Convert.ToInt32(_MinutoDesde);
  43.                 int minutohasta = Convert.ToInt32(_MinutoHasta);
  44.                 int multiplicador;
  45.            
  46.                 int horaintervalo = horadesde;
  47.                 int minutointervalo = minutodesde;
  48.  
  49.                 string strHoraIntervalo, strMinutoIntervalo;
  50.                
  51.  
  52.                 while(horaintervalo < horahasta &&
  53.                      (horaintervalo != horahasta || minutointervalo < minutohasta))
  54.                 {
  55.                     minutointervalo += MinutesRange;
  56.  
  57.                     if (minutointervalo >= 60)
  58.                     {
  59.                         multiplicador = (minutointervalo / 60);
  60.                         minutointervalo -= 60 * multiplicador;
  61.                         horaintervalo += 1 * multiplicador;
  62.                     }
  63.  
  64.                     if (horaintervalo > horahasta ||
  65.                        (horaintervalo == horahasta && minutointervalo >= minutohasta))
  66.                     {
  67.                         break;
  68.                     }
  69.                    
  70.                     strHoraIntervalo = horaintervalo.ToString();
  71.                     strMinutoIntervalo = minutointervalo.ToString();
  72.  
  73.                     if (strHoraIntervalo.Length == 1)
  74.                     {
  75.                         strHoraIntervalo = "0" + strHoraIntervalo;
  76.                     }
  77.  
  78.                     if (strMinutoIntervalo.Length == 1)
  79.                     {
  80.                         strMinutoIntervalo = "0" + strMinutoIntervalo;
  81.                     }
  82.  
  83.                     comboBox1.Items.Add(strHoraIntervalo + ":" + strMinutoIntervalo);
  84.  
  85.                 }
  86.  
  87.                 comboBox1.Items.Add(_HoraHasta + ":" + _MinutoHasta);
  88.                 comboBox1.SelectedIndex = 0;
  89.              
  90.  
  91.             }
  92.             catch (Exception e)
  93.             {
  94.  
  95.                 MessageBox.Show("Se ha producido un error, contacte al administrador del sistema \n" + e.Message.ToString());
  96.             }
  97.         }
  98.     }
  99. }

Una imagen:



Saludos,