Я изучал, как использовать 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
Проблемы с отображением часов объекта ⇐ C#
Место общения программистов C#
1739185994
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;
}
}
[b] mvm из резервов [/b]
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();
}
}
[b] класс, ucreservar [/b]
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();
}
}
[b] xaml of ucreservar [/b]
Instalaciones disponibles
Deportes de la instalacion
Fecha
Hora disponible
Hora disponible
Подробнее здесь: [url]https://stackoverflow.com/questions/79426856/problems-displaying-facility-hours[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия