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:
<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 DateTime.Compare o algo similar.
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