Проблемы с отображением часов объектаC#

Место общения программистов C#
Ответить
Anonymous
 Проблемы с отображением часов объекта

Сообщение Anonymous »

Я изучал, как использовать LINQ, и я использовал его, чтобы показать графики установки в зависимости от того, какую установку выбирает пользователь. < /p>
На данный момент она работает хорошо, Пользователь выбирает первую установку и показывает им свое время начала и окончания, которое он должен иметь в базе данных. Но когда пользователь выбирает еще одну установку и еще одно доступное время, когда он пытается выбрать время окончания, и если он попытается выбрать другие установки с первым, кто выбран то же самое. Как будто установка больше не имеет времени. Услуги от horarioshasinstalaciones
internal class HorariosHasInstalacioneServicios : ServicioGenerico
{
private IDContexto contexto;
public HorariosHasInstalacioneServicios(IDContexto context) : base(context)
{
contexto = context;
}

// Metodo LINQ para sacar los horarios de las instalaciones segun su id
public IEnumerable ObtenerHorariosPorInstalacionConInclude(int idInstalacion)
{
var horariosUnicos = contexto.HorariosHasInstalaciones
.Include(hhi => hhi.IdHorariosNavigation)
.Where(hhi => hhi.IdInstalaciones == idInstalacion)
.Select(hhi => new Horario
{
Inicio = hhi.IdHorariosNavigation.Inicio,
Fin = hhi.IdHorariosNavigation.Fin
})
.GroupBy(h => h.Inicio)
.Select(grp => grp.First())
.ToList();

return horariosUnicos;
}
}

mvm из резервов
public class MVMReservar : MVBaseCRUD
{

private IDContexto idContexto;
private InstalacionesServicio instalacionesServicio;
private ReservaServicio reservaServicio;
private ListCollectionView listaAux;
private List listaHorariosInicio;
private List listaHorariosFin;
private HorariosHasInstalacioneServicios horariosInstaServicio;
private HorariosServicio horariosServicio;
private Horario horarioSeleccionadoInicio;
private Horario horarioSeleccionadoFin;
private Reserva _reserva;

public MVMReservar(IDContexto ent)
{
this.idContexto = ent;
inicializa();
}

public MVMReservar(IDContexto ent, int usuario)
{
this.idContexto = ent;
var reservas = GetReservasPorUsuario(usuario);
listaReservasUsuarios = new ListCollectionView(reservas);
inicializa();
}

private void inicializa()
{
reservaServicio = new ReservaServicio(idContexto);
servicio = reservaServicio;
instalacionesServicio = new InstalacionesServicio(idContexto);
horariosInstaServicio = new HorariosHasInstalacioneServicios(idContexto);
horariosServicio = new HorariosServicio(idContexto);
horarioSeleccionadoInicio = new Horario();
horarioSeleccionadoFin = new Horario();
_reserva = new Reserva();
listaAux = new ListCollectionView(reservaServicio.GetAll);
}

public Horario HorarioSeleccionadoInicio
{
get => horarioSeleccionadoInicio;
set
{
horarioSeleccionadoInicio = value;
NotifyPropertyChanged(nameof(HorarioSeleccionadoInicio));
}
}
public Horario HorarioSeleccionadoFin
{
get => horarioSeleccionadoFin;
set
{
horarioSeleccionadoFin = value;
NotifyPropertyChanged(nameof(HorarioSeleccionadoFin));
}
}

public Reserva reserva
{
get { return _reserva; }
set
{
_reserva = value;
NotifyPropertyChanged(nameof(reserva));
}
}

// listas
public ListCollectionView listaReserva { get { return listaAux; } }
public List lstInstalaciones { get { return instalacionesServicio.GetAll; } }
public List ListaHorariosInicio
{
get => listaHorariosInicio;
set
{
listaHorariosInicio = value;
NotifyPropertyChanged(nameof(ListaHorariosInicio));
}
}
public List ListaHorariosFin
{
get => listaHorariosFin;
set
{
listaHorariosFin = value;
NotifyPropertyChanged(nameof(ListaHorariosFin));
}
}
public ListCollectionView listaReservasUsuarios { get; set; }

// Cargar los horarios de las instalaciones segun su id
public void CargarHorariosInstalacion(int idInstalacion)
{
var horarios = horariosInstaServicio.ObtenerHorariosPorInstalacionConInclude(idInstalacion);

ListaHorariosInicio = horarios.OrderBy(h => h.Inicio).ToList();
ListaHorariosFin = horarios.OrderBy(h => h.Fin).ToList();
}

public List GetReservasPorUsuario(int idUsuario)
{
if (idUsuario == 0)
return new List();
return idContexto.Reservas.Where(r => r.IdUsuarios == idUsuario).ToList();
}

public void RefreshReservas()
{
listaAux = new ListCollectionView(reservaServicio.GetAll);
NotifyPropertyChanged(nameof(listaReserva));
}

public List getListaReservas()
{
RefreshReservas();
return idContexto.Reservas.Include(r => r.IdUsuariosNavigation).Include(r => r.IdInstalacionesNavigation).ToList();
}

}

класс, ucreservar
public partial class UCReservar : UserControl
{
private Usuario usuarioActual;
private IDContexto idContexto;
private MVMInstalaciones InstMVM;
private MVMReservar ReMVM;
private ReservaServicio reservaServ;
private List listaInstal;
private ListCollectionView lista;
private List listaTipos;
private int idInstalacionEscogida;

public UCReservar(IDContexto idCont, Usuario usuActual)
{
InitializeComponent();
usuarioActual = usuActual;
idContexto = idCont;
inicializa();
}

private void inicializa()
{
ReMVM = new MVMReservar(idContexto);
InstMVM = new MVMInstalaciones(idContexto);
reservaServ = new ReservaServicio(idContexto);
this.DataContext = ReMVM;
}

private void ComboBoxInstalaciones_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (comboInstalaciones.SelectedItem is Instalacione idInst)
{
idInstalacionEscogida = idInst.IdInstalaciones;

ReMVM.CargarHorariosInstalacion(idInstalacionEscogida);
string nombreInsta = idInst.Nombre;

listaTipos = new List(ReMVM.getListaTiposPorNombre(nombreInsta));
comboDeportesInstalacion.ItemsSource = listaTipos;

gridDeportes.IsEnabled = true;
gridDeportes.Opacity = 1;
gridDeportes.Background = Brushes.White;

txtHorarioInstalacion.Text = idInst.Horario;
}
else
{
gridDeportes.IsEnabled = false;
gridDeportes.Opacity = 0.3;
}
}

private void comboDeportesInstalacion_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (comboDeportesInstalacion.SelectedItem is string deporteSeleccionado)
{
gridHorarios.IsEnabled = true;
gridHorarios.Opacity = 1;
gridHorarios.Background = Brushes.White;
}
else
{
gridHorarios.IsEnabled = false;
gridHorarios.Opacity = 0.3;

idInstalacionEscogida = -1;
}
}

private Reserva recogerDatos()
{
Reserva reserva = new Reserva();

if (dateFechaReserva.SelectedDate == null || comboHorarioInicioInstalacion.SelectedItem == null || comboHorarioFinInstalacion.SelectedItem == null)
{
MostrarConfirmacion("Por favor, rellene todos los campos.");
}
else
{
reserva.IdUsuarios = usuarioActual.IdUsuarios;
reserva.IdInstalaciones = idInstalacionEscogida;
reserva.FechaReserva = DateOnly.FromDateTime(dateFechaReserva.SelectedDate.Value);
reserva.HoraInicio = ReMVM.HorarioSeleccionadoInicio?.Inicio?.ToString("HH:mm");
reserva.HoraFin = ReMVM.HorarioSeleccionadoFin?.Fin?.ToString();
reserva.Anulado = "No";
reserva.Acudido = "No";
reserva.Pagado = "No";
}

return reserva;
}

private async void GuardarReserva_Click(object sender, RoutedEventArgs e)
{
Reserva nuevaReserva = recogerDatos();

if (!nuevaReserva.FechaReserva.HasValue)
{
MostrarConfirmacion("Por favor, selecciona una fecha válida.");
return;
}

string horareserva = nuevaReserva.HoraInicio;
string horareservaFin = nuevaReserva.HoraFin;
TimeOnly horaActual = TimeOnly.FromDateTime(DateTime.Now);

if (TimeOnly.TryParse(horareserva, out TimeOnly horaConvertida))
{
if (horaConvertida < horaActual)
{
MostrarConfirmacion("No se pueden escoger horas pasadas.");
return;
}
} else if (TimeOnly.TryParse(horareservaFin, out TimeOnly horaConvertidaFin))
{
if (horaConvertidaFin < horaActual)
{
MostrarConfirmacion("No se pueden escoger horas pasadas.");
return;
}
}

if (dateFechaReserva.SelectedDate == null || comboHorarioInicioInstalacion.SelectedItem == null || comboHorarioFinInstalacion.SelectedItem == null)
{
MostrarConfirmacion("Por favor, rellene todos los campos.");
return;
}

bool puedeReservar = reservaServ.PuedeReservar(nuevaReserva.IdUsuarios, nuevaReserva.IdInstalaciones, nuevaReserva.FechaReserva.Value);

if (!puedeReservar)
{
MostrarConfirmacion("Ya tienes una reserva para esta instalación antes de la fecha seleccionada.");
return;
}

bool horarioOcupado = reservaServ.EstaHorarioOcupado(nuevaReserva.IdInstalaciones, nuevaReserva.FechaReserva.Value, nuevaReserva.HoraInicio, nuevaReserva.HoraFin);

if (horarioOcupado)
{
MostrarConfirmacion("El horario seleccionado ya está ocupado. Por favor, elija otro.");
return;
}

try
{
reservaServ.Add(nuevaReserva);

gridDeportes.IsEnabled = false;
gridDeportes.Opacity = 0.3;
gridHorarios.IsEnabled = false;
gridHorarios.Opacity = 0.3;
idInstalacionEscogida = -1;
comboInstalaciones.SelectedItem = null;
comboDeportesInstalacion.SelectedItem = null;
dateFechaReserva.SelectedDate = null;
comboHorarioInicioInstalacion.SelectedItem = null;
comboHorarioFinInstalacion.SelectedItem = null;
comboDeportesInstalacion.SelectedItem = null;
MostrarConfirmacion("Se ha insertado la reserva correctamente");
}
catch (DbUpdateException dbex)
{
System.Console.WriteLine(dbex.Message);
System.Console.WriteLine(dbex.StackTrace);
}
}

private void DateFechaReserva_Loaded(object sender, RoutedEventArgs e)
{
DateTime today = DateTime.Today;
DateTime limitDate = today.AddDays(15);

// Los blackoutdates son los dias que no puedes coger
// dia anterior today.AddDays(-1)
// dia despues limitDate.AddDays(1)
dateFechaReserva.BlackoutDates.Add(new CalendarDateRange(DateTime.MinValue, today.AddDays(-1)));
dateFechaReserva.BlackoutDates.Add(new CalendarDateRange(limitDate.AddDays(1), DateTime.MaxValue));

for (DateTime date = today; date hhi.IdHorariosNavigation)
.Where(hhi => hhi.IdInstalaciones == idInstalacionEscogida && hhi.IdHorariosNavigation.Inicio == horarioSeleccionado.Inicio)
.Select(hhi => new Horario
{
IdHorarios = hhi.IdHorariosNavigation.IdHorarios,
Inicio = hhi.IdHorariosNavigation.Inicio,
Fin = hhi.IdHorariosNavigation.Fin
})
.Distinct()
.OrderBy(h => h.Fin)
.ToList();

comboHorarioFinInstalacion.ItemsSource = horasFin;
comboHorarioFinInstalacion.DisplayMemberPath = "Fin";
comboHorarioFinInstalacion.SelectedValuePath = "IdHorarios";
}
else
{
comboHorarioFinInstalacion.IsEnabled = false;
comboHorarioFinInstalacion.ItemsSource = null;
}
}

private void MostrarConfirmacion(string mensaje)
{
DialogoConfirmar confirmDialog = new DialogoConfirmar(mensaje)
{
Owner = Window.GetWindow(this)
};
confirmDialog.ShowDialog();
}

}

xaml of ucreservar


























Instalaciones disponibles



















Deportes de la instalacion

































Fecha









Hora disponible









Hora disponible













Подробнее здесь: https://stackoverflow.com/questions/794 ... lity-hours
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»