Лаба 4

This commit is contained in:
Kirill 2024-05-29 14:28:53 +04:00
parent 600333fc6d
commit 9a391bf270
48 changed files with 4406 additions and 0 deletions

37
Hotel/Hotel.sln Normal file
View File

@ -0,0 +1,37 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34728.123
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HotelAbstractions", "HotelAbstractions\HotelAbstractions.csproj", "{AD9AAD7D-EC52-40B5-A34A-8B80AD8618C8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HotelDatabase", "HotelDatabase\HotelDatabase.csproj", "{AB783669-67D3-48DC-9930-D4A59F923E26}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HotelView", "HotelView\HotelView.csproj", "{890038F3-3A65-4292-A852-E8536002E78E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AD9AAD7D-EC52-40B5-A34A-8B80AD8618C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AD9AAD7D-EC52-40B5-A34A-8B80AD8618C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AD9AAD7D-EC52-40B5-A34A-8B80AD8618C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AD9AAD7D-EC52-40B5-A34A-8B80AD8618C8}.Release|Any CPU.Build.0 = Release|Any CPU
{AB783669-67D3-48DC-9930-D4A59F923E26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AB783669-67D3-48DC-9930-D4A59F923E26}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AB783669-67D3-48DC-9930-D4A59F923E26}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AB783669-67D3-48DC-9930-D4A59F923E26}.Release|Any CPU.Build.0 = Release|Any CPU
{890038F3-3A65-4292-A852-E8536002E78E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{890038F3-3A65-4292-A852-E8536002E78E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{890038F3-3A65-4292-A852-E8536002E78E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{890038F3-3A65-4292-A852-E8536002E78E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B24EC819-5956-474C-AF03-0172E3CA0554}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,22 @@
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Logic
{
public interface IGuestLogic
{
List<Guest> GetAll();
Guest? Get(int id);
Guest? Create(Guest guest);
Guest? Update(Guest guest);
Guest? Delete(int id);
}
}

View File

@ -0,0 +1,24 @@
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Logic
{
public interface IHotelLogic
{
List<Hotel> GetAll();
Hotel? Get(int id);
Hotel? Create(Hotel hotel);
Hotel? CreateId(Hotel hotel);
Hotel? Update(Hotel hotel);
Hotel? Delete(int id);
}
}

View File

@ -0,0 +1,22 @@
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Logic
{
public interface IReservationLogic
{
List<Reservation> GetAll();
Reservation? Get(int id);
Reservation? Create(Reservation reservation);
Reservation? Update(Reservation reservation);
Reservation? Delete(int id);
}
}

View File

@ -0,0 +1,22 @@
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Logic
{
public interface IRoomLogic
{
List<Room> GetAll();
Room? Get(int id);
Room? Create(Room room);
Room? Update(Room room);
Room? Delete(int id);
}
}

View File

@ -0,0 +1,22 @@
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Logic
{
public interface IServiceCheckLogic
{
List<ServiceCheck> GetAll();
ServiceCheck? Get(int id);
ServiceCheck? Create(ServiceCheck serviceCheck);
ServiceCheck? Update(ServiceCheck serviceCheck);
ServiceCheck? Delete(int id);
}
}

View File

@ -0,0 +1,22 @@
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Logic
{
public interface IServiceLogic
{
List<Service> GetAll();
Service? Get(int id);
Service? Create(Service service);
Service? Update(Service service);
Service? Delete(int id);
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Models
{
public enum GenderEnum
{
Мужской,
Женский,
Другое
}
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Models
{
public class Guest
{
public int Id { get; set; }
public string FIO { get; set; } = string.Empty;
public string PhoneNumber { get; set; } = string.Empty;
public DateOnly BirthDate { get; set; }
public string PassportId { get; set; } = string.Empty;
public GenderEnum Gender { get; set; }
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Models
{
public class Hotel
{
public int Id { get; set; }
public string HotelName { get; set; } = string.Empty;
public string Address { get; set; } = string.Empty;
public int CountStar { get; set; }
public int CountRoom { get; set; }
}
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Models
{
public class Reservation
{
public int Id { get; set; }
public int GuestId { get; set; }
public int RoomId { get; set; }
public DateOnly ArrivalDate { get; set; }
public DateOnly DepartureDate { get; set; }
public double Price { get; set; }
}
}

View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Models
{
public class Room
{
public int Id { get; set; }
public int HotelId { get; set; }
public string Category { get; set; } = string.Empty;
public int CountPlace { get; set; }
public int Flor { get; set; }
public string Number { get; set; } = string.Empty;
public double Price { get; set; }
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Models
{
public class Service
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public double Price { get; set; }
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelAbstractions.Models
{
public class ServiceCheck
{
public int Id { get; set; }
public int ReservationId { get; set; }
public int ServiceId { get; set; }
public int Count { get; set; }
public DateTime DateTime { get; set; }
}
}

View File

@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Npgsql" Version="8.0.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\HotelAbstractions\HotelAbstractions.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,98 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelDatabase.Implement
{
public class GuestImplement : IGuestLogic
{
public Guest? Create(Guest guest)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("INSERT INTO guest (full_name, phone_number, birth_date, passport_id, gender) VALUES (@Full_name, @Phone_number, @Birth_date, @Passport_id, @Gender)", con);
cmd.Parameters.AddWithValue("@Full_name", guest.FIO);
cmd.Parameters.AddWithValue("@Phone_number", guest.PhoneNumber);
cmd.Parameters.AddWithValue("@Birth_date", guest.BirthDate);
cmd.Parameters.AddWithValue("@Passport_id", guest.PassportId);
cmd.Parameters.AddWithValue("@Gender", guest.Gender.ToString());
cmd.ExecuteNonQuery();
return guest;
}
public Guest? Delete(int id)
{
var element = Get(id);
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"DELETE FROM guest WHERE guest_id = {id}", con);
cmd.ExecuteNonQuery();
return element;
}
public Guest? Get(int id)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"SELECT * FROM guest WHERE guest_id = {id}", con);
using var reader = cmd.ExecuteReader();
if (reader.Read())
{
return new Guest
{
Id = reader.GetInt32(0),
FIO = reader.GetString(1),
PhoneNumber = reader.GetString(2),
BirthDate = ToDateOnly(reader.GetDateTime(3)),
PassportId = reader.GetString(4),
Gender = (GenderEnum)Enum.Parse(typeof(GenderEnum), reader.GetString(5)),
};
}
return null;
}
public List<Guest> GetAll()
{
var guests = new List<Guest>();
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("SELECT * FROM guest order by guest_id", con);
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
guests.Add(new Guest
{
Id = reader.GetInt32(0),
FIO = reader.GetString(1),
PhoneNumber = reader.GetString(2),
BirthDate = ToDateOnly(reader.GetDateTime(3)),
PassportId = reader.GetString(4),
Gender = (GenderEnum)Enum.Parse(typeof(GenderEnum), reader.GetString(5)),
});
}
return guests;
}
public Guest? Update(Guest guest)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"UPDATE guest SET full_name = '{guest.FIO}', phone_number = '{guest.PhoneNumber}', birth_date = '{guest.BirthDate}', passport_id = '{guest.PassportId}', gender = '{guest.Gender}' WHERE guest_id = '{guest.Id}'", con);
cmd.ExecuteNonQuery();
var element = Get(guest.Id);
return element;
}
public DateOnly ToDateOnly (DateTime dateTime)
{
var DateTime = dateTime;
var Date = new DateOnly(DateTime.Year, DateTime.Month, DateTime.Day);
return Date;
}
}
}

View File

@ -0,0 +1,102 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelDatabase.Implement
{
public class HotelImplement : IHotelLogic
{
public Hotel? Create(Hotel hotel)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("INSERT INTO hotel (name, address, count_star, count_room) VALUES (@Name, @Address, @Count_star, @Count_room)", con);
cmd.Parameters.AddWithValue("@Name", hotel.HotelName);
cmd.Parameters.AddWithValue("@Address", hotel.Address);
cmd.Parameters.AddWithValue("@Count_star", hotel.CountStar);
cmd.Parameters.AddWithValue("@Count_room", hotel.CountRoom);
cmd.ExecuteNonQuery();
return hotel;
}
public Hotel? CreateId(Hotel hotel)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("INSERT INTO hotel (hotel_id, name, address, count_star, count_room) VALUES (@Hotel_id, @Name, @Address, @Count_star, @Count_room)", con);
cmd.Parameters.AddWithValue("@Hotel_id", hotel.Id);
cmd.Parameters.AddWithValue("@Name", hotel.HotelName);
cmd.Parameters.AddWithValue("@Address", hotel.Address);
cmd.Parameters.AddWithValue("@Count_star", hotel.CountStar);
cmd.Parameters.AddWithValue("@Count_room", hotel.CountRoom);
cmd.ExecuteNonQuery();
return hotel;
}
public Hotel? Delete(int id)
{
var element = Get(id);
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"DELETE FROM hotel WHERE hotel_id = {id}", con);
cmd.ExecuteNonQuery();
return element;
}
public Hotel? Get(int id)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"SELECT * FROM hotel WHERE hotel_id = {id}", con);
using var reader = cmd.ExecuteReader();
if (reader.Read())
{
return new Hotel
{
Id = reader.GetInt32(0),
HotelName = reader.GetString(1),
Address = reader.GetString(2),
CountStar = reader.GetInt32(3),
CountRoom = reader.GetInt32(4),
};
}
return null;
}
public List<Hotel> GetAll()
{
var hotels = new List<Hotel>();
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("SELECT * FROM hotel order by hotel_id", con);
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
hotels.Add(new Hotel
{
Id = reader.GetInt32(0),
HotelName = reader.GetString(1),
Address = reader.GetString(2),
CountStar = reader.GetInt32(3),
CountRoom = reader.GetInt32(4),
});
}
return hotels;
}
public Hotel? Update(Hotel hotel)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"UPDATE hotel SET name = '{hotel.HotelName}', address = '{hotel.Address}', count_star = '{hotel.CountStar}', count_room = '{hotel.CountRoom}' WHERE hotel_id = '{hotel.Id}'", con);
cmd.ExecuteNonQuery();
var element = Get(hotel.Id);
return element;
}
}
}

View File

@ -0,0 +1,110 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelDatabase.Implement
{
public class ReservationImplement : IReservationLogic
{
public Reservation? Create(Reservation reservation)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand(
"INSERT INTO reservation (fk_room_id, fk_guest_id, arrival_date, departure_date, price)" +
" VALUES (@FKRoom_id, @FKGuest_id, @Arrival_date, @Departure_date, @Price)",
con
);
cmd.Parameters.AddWithValue("@FKRoom_id", reservation.RoomId == 0 ? DBNull.Value : reservation.RoomId);
cmd.Parameters.AddWithValue("@FKGuest_id", reservation.GuestId == 0 ? DBNull.Value : reservation.GuestId);
cmd.Parameters.AddWithValue("@Arrival_date", reservation.ArrivalDate);
cmd.Parameters.AddWithValue("@Departure_date", reservation.DepartureDate);
cmd.Parameters.AddWithValue("@Price", reservation.Price);
cmd.ExecuteNonQuery();
return reservation;
}
public Reservation? Delete(int id)
{
var element = Get(id);
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"DELETE FROM reservation WHERE reservation_id = {id}", con);
cmd.ExecuteNonQuery();
return element;
}
public Reservation? Get(int id)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"SELECT * FROM reservation WHERE reservation_id = {id}", con);
using var reader = cmd.ExecuteReader();
if (reader.Read())
{
return new Reservation
{
Id = reader.GetInt32(0),
RoomId = !reader.IsDBNull(1) ? reader.GetInt32(1) : 0,
GuestId = !reader.IsDBNull(2) ? reader.GetInt32(2) : 0,
ArrivalDate = ToDateOnly(reader.GetDateTime(3)),
DepartureDate = ToDateOnly(reader.GetDateTime(4)),
Price = reader.GetDouble(5),
};
}
return null;
}
public List<Reservation> GetAll()
{
var reservations = new List<Reservation>();
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("SELECT * FROM reservation order by reservation_id", con);
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
reservations.Add(new Reservation
{
Id = reader.GetInt32(0),
RoomId = !reader.IsDBNull(1) ? reader.GetInt32(1) : 0,
GuestId = !reader.IsDBNull(2) ? reader.GetInt32(2) : 0,
ArrivalDate = ToDateOnly(reader.GetDateTime(3)),
DepartureDate = ToDateOnly(reader.GetDateTime(4)),
Price = reader.GetDouble(5),
});
}
return reservations;
}
public Reservation? Update(Reservation reservation)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"UPDATE reservation SET " +
$"fk_room_id = @FKHotel_Id, " +
$"fk_guest_id = @FKGuest_Id, " +
$"arrival_date = '{reservation.ArrivalDate}', " +
$"departure_date = '{reservation.DepartureDate}', " +
$"price = '{reservation.Price}' " +
$"WHERE reservation_id = {reservation.Id}", con);
cmd.Parameters.AddWithValue("@FKRoom_Id", reservation.RoomId == 0 ? DBNull.Value : reservation.RoomId);
cmd.Parameters.AddWithValue("@FKGuest_Id", reservation.GuestId == 0 ? DBNull.Value : reservation.GuestId);
cmd.ExecuteNonQuery();
var element = Get(reservation.Id);
return element;
}
public DateOnly ToDateOnly(DateTime dateTime)
{
var DateTime = dateTime;
var Date = new DateOnly(DateTime.Year, DateTime.Month, DateTime.Day);
return Date;
}
}
}

View File

@ -0,0 +1,106 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelDatabase.Implement
{
public class RoomImplement : IRoomLogic
{
public Room? Create(Room room)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand(
"INSERT INTO room (fk_hotel_id, category, count_place, flor, room_number, price)" +
" VALUES (@FKHotel_id, @Category, @Count_place, @Flor, @Room_number, @Price)",
con
);
cmd.Parameters.AddWithValue("@FKHotel_id", room.HotelId == 0 ? DBNull.Value : room.HotelId);
cmd.Parameters.AddWithValue("@Category", room.Category);
cmd.Parameters.AddWithValue("@Count_place", room.CountPlace);
cmd.Parameters.AddWithValue("@Flor", room.Flor);
cmd.Parameters.AddWithValue("@Room_number", room.Number);
cmd.Parameters.AddWithValue("@Price", room.Price);
cmd.ExecuteNonQuery();
return room;
}
public Room? Delete(int id)
{
var element = Get(id);
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"DELETE FROM room WHERE room_id = {id}", con);
cmd.ExecuteNonQuery();
return element;
}
public Room? Get(int id)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"SELECT * FROM room WHERE room_id = {id}", con);
using var reader = cmd.ExecuteReader();
if (reader.Read())
{
return new Room
{
Id = reader.GetInt32(0),
HotelId = !reader.IsDBNull(1) ? reader.GetInt32(1) : 0,
Category = reader.GetString(2),
CountPlace = reader.GetInt32(3),
Flor = reader.GetInt32(4),
Number = reader.GetString(5),
Price = reader.GetDouble(6),
};
}
return null;
}
public List<Room> GetAll()
{
var rooms = new List<Room>();
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("SELECT * FROM room order by room_id", con);
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
rooms.Add(new Room
{
Id = reader.GetInt32(0),
HotelId = !reader.IsDBNull(1) ? reader.GetInt32(1) : 0,
Category = reader.GetString(2),
CountPlace = reader.GetInt32(3),
Flor = reader.GetInt32(4),
Number = reader.GetString(5),
Price = reader.GetDouble(6),
});
}
return rooms;
}
public Room? Update(Room room)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"UPDATE room SET " +
$"fk_hotel_id = @FKHotel_Id, " +
$"category = '{room.Category}', " +
$"count_place = '{room.CountPlace}', " +
$"flor = '{room.Flor}', " +
$"room_number = '{room.Number}', " +
$"price = '{room.Price}' " +
$"WHERE room_id = {room.Id}", con);
cmd.Parameters.AddWithValue("@FKHotel_Id", room.HotelId == 0 ? DBNull.Value : room.HotelId);
cmd.ExecuteNonQuery();
var element = Get(room.Id);
return element;
}
}
}

View File

@ -0,0 +1,99 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelDatabase.Implement
{
public class ServiceCheckImplement : IServiceCheckLogic
{
public ServiceCheck? Create(ServiceCheck serviceCheck)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand(
"INSERT INTO service_check (fk_reservation_id, fk_service_id, count, service_date)" +
" VALUES (@FKReservation_id, @FKService_id, @Count, @Service_date)",
con
);
cmd.Parameters.AddWithValue("@FKReservation_id", serviceCheck.ReservationId == 0 ? DBNull.Value : serviceCheck.ReservationId);
cmd.Parameters.AddWithValue("@FKService_id", serviceCheck.ServiceId == 0 ? DBNull.Value : serviceCheck.ServiceId);
cmd.Parameters.AddWithValue("@Count", serviceCheck.Count);
cmd.Parameters.AddWithValue("@Service_date", serviceCheck.DateTime);
cmd.ExecuteNonQuery();
return serviceCheck;
}
public ServiceCheck? Delete(int id)
{
var element = Get(id);
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"DELETE FROM service_check WHERE service_check_id = {id}", con);
cmd.ExecuteNonQuery();
return element;
}
public ServiceCheck? Get(int id)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"SELECT * FROM service_check WHERE service_check_id = {id}", con);
using var reader = cmd.ExecuteReader();
if (reader.Read())
{
return new ServiceCheck
{
Id = reader.GetInt32(0),
ReservationId = !reader.IsDBNull(1) ? reader.GetInt32(1) : 0,
ServiceId = !reader.IsDBNull(2) ? reader.GetInt32(2) : 0,
Count = reader.GetInt32(3),
DateTime = reader.GetDateTime(4),
};
}
return null;
}
public List<ServiceCheck> GetAll()
{
var serviceChecks = new List<ServiceCheck>();
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("SELECT * FROM service_check order by service_check_id", con);
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
serviceChecks.Add(new ServiceCheck
{
Id = reader.GetInt32(0),
ReservationId = !reader.IsDBNull(1) ? reader.GetInt32(1) : 0,
ServiceId = !reader.IsDBNull(2) ? reader.GetInt32(2) : 0,
Count = reader.GetInt32(3),
DateTime = reader.GetDateTime(4),
});
}
return serviceChecks;
}
public ServiceCheck? Update(ServiceCheck serviceCheck)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"UPDATE service_check SET " +
$"fk_reservation_id = @FKReservation_Id, " +
$"fk_service_id = @FKService_Id, " +
$"count = '{serviceCheck.Count}', " +
$"service_date = '{serviceCheck.DateTime}', " +
$"WHERE service_check_id = '{serviceCheck.Id}' ", con);
cmd.Parameters.AddWithValue("@FKReservation_Id", serviceCheck.ReservationId == 0 ? DBNull.Value : serviceCheck.ReservationId);
cmd.Parameters.AddWithValue("@FKService_Id", serviceCheck.ServiceId == 0 ? DBNull.Value : serviceCheck.ServiceId);
cmd.ExecuteNonQuery();
var element = Get(serviceCheck.Id);
return element;
}
}
}

View File

@ -0,0 +1,82 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HotelDatabase.Implement
{
public class ServiceImplement : IServiceLogic
{
public Service? Create(Service service)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("INSERT INTO service (name, price) VALUES (@Name, @Price)", con);
cmd.Parameters.AddWithValue("@Name", service.Name);
cmd.Parameters.AddWithValue("@Price", service.Price);
cmd.ExecuteNonQuery();
return service;
}
public Service? Delete(int id)
{
var element = Get(id);
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"DELETE FROM service WHERE service_id = {id}", con);
cmd.ExecuteNonQuery();
return element;
}
public Service? Get(int id)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"SELECT * FROM service WHERE service_id = {id}", con);
using var reader = cmd.ExecuteReader();
if (reader.Read())
{
return new Service
{
Id = reader.GetInt32(0),
Name = reader.GetString(1),
Price = reader.GetDouble(2),
};
}
return null;
}
public List<Service> GetAll()
{
var services = new List<Service>();
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("SELECT * FROM service order by service_id", con);
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
services.Add(new Service
{
Id = reader.GetInt32(0),
Name = reader.GetString(1),
Price = reader.GetDouble(2),
});
}
return services;
}
public Service? Update(Service service)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"UPDATE service SET name = '{service.Name}', price = '{service.Price}' WHERE service_id = {service.Id}", con);
cmd.ExecuteNonQuery();
var element = Get(service.Id);
return element;
}
}
}

View File

@ -0,0 +1,12 @@
using Npgsql;
namespace HotelDatabase
{
public class SqlConnection
{
public static NpgsqlConnection GetConnection()
{
return new NpgsqlConnection("Host=192.168.56.105;Port=5432;Username=postgres;Database=Hotel;Password=postgres");
}
}
}

213
Hotel/HotelView/FormGuest.Designer.cs generated Normal file
View File

@ -0,0 +1,213 @@
namespace HotelView
{
partial class FormGuest
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
label4 = new Label();
label3 = new Label();
label2 = new Label();
label1 = new Label();
textBoxPhone = new TextBox();
textBoxName = new TextBox();
button3 = new Button();
button2 = new Button();
button1 = new Button();
dataGridView = new DataGridView();
comboBox1 = new ComboBox();
label5 = new Label();
dateTimePicker1 = new DateTimePicker();
textBoxPassport = new TextBox();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// label4
//
label4.AutoSize = true;
label4.Location = new Point(529, 238);
label4.Name = "label4";
label4.Size = new Size(173, 20);
label4.TabIndex = 23;
label4.Text = "Серия номер Паспорта";
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(529, 161);
label3.Name = "label3";
label3.Size = new Size(116, 20);
label3.TabIndex = 22;
label3.Text = "Дата рождения";
label3.Click += label3_Click;
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(529, 91);
label2.Name = "label2";
label2.Size = new Size(127, 20);
label2.TabIndex = 21;
label2.Text = "Номер телефона";
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(529, 21);
label1.Name = "label1";
label1.Size = new Size(174, 20);
label1.TabIndex = 20;
label1.Text = "Фамилия Имя Отчество";
//
// textBoxPhone
//
textBoxPhone.Location = new Point(514, 114);
textBoxPhone.Name = "textBoxPhone";
textBoxPhone.Size = new Size(280, 27);
textBoxPhone.TabIndex = 19;
//
// textBoxName
//
textBoxName.Location = new Point(514, 44);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(280, 27);
textBoxName.TabIndex = 18;
//
// button3
//
button3.Location = new Point(700, 410);
button3.Name = "button3";
button3.Size = new Size(94, 29);
button3.TabIndex = 17;
button3.Text = "Удалить";
button3.UseVisualStyleBackColor = true;
button3.Click += ButtonDelete_Click;
//
// button2
//
button2.Location = new Point(600, 410);
button2.Name = "button2";
button2.Size = new Size(94, 29);
button2.TabIndex = 16;
button2.Text = "Изменить";
button2.UseVisualStyleBackColor = true;
button2.Click += ButtonUpdate_Click;
//
// button1
//
button1.Location = new Point(500, 410);
button1.Name = "button1";
button1.Size = new Size(94, 29);
button1.TabIndex = 15;
button1.Text = "Добавить";
button1.UseVisualStyleBackColor = true;
button1.Click += ButtonCreate_Click;
//
// dataGridView
//
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Location = new Point(6, 1);
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.RowTemplate.Height = 29;
dataGridView.Size = new Size(478, 448);
dataGridView.TabIndex = 14;
//
// comboBox1
//
comboBox1.FormattingEnabled = true;
comboBox1.Location = new Point(514, 339);
comboBox1.Name = "comboBox1";
comboBox1.Size = new Size(280, 28);
comboBox1.TabIndex = 26;
//
// label5
//
label5.AutoSize = true;
label5.Location = new Point(529, 316);
label5.Name = "label5";
label5.Size = new Size(108, 20);
label5.TabIndex = 27;
label5.Text = "Выберите пол";
//
// dateTimePicker1
//
dateTimePicker1.Location = new Point(514, 184);
dateTimePicker1.Name = "dateTimePicker1";
dateTimePicker1.Size = new Size(280, 27);
dateTimePicker1.TabIndex = 28;
//
// textBoxPassport
//
textBoxPassport.Location = new Point(514, 261);
textBoxPassport.Name = "textBoxPassport";
textBoxPassport.Size = new Size(280, 27);
textBoxPassport.TabIndex = 29;
//
// FormGuest
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(textBoxPassport);
Controls.Add(dateTimePicker1);
Controls.Add(label5);
Controls.Add(comboBox1);
Controls.Add(label4);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(textBoxPhone);
Controls.Add(textBoxName);
Controls.Add(button3);
Controls.Add(button2);
Controls.Add(button1);
Controls.Add(dataGridView);
Name = "FormGuest";
Text = "FormGuest";
Load += FormGuest_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label4;
private Label label3;
private Label label2;
private Label label1;
private TextBox textBoxPhone;
private TextBox textBoxName;
private Button button3;
private Button button2;
private Button button1;
private DataGridView dataGridView;
private ComboBox comboBox1;
private Label label5;
private DateTimePicker dateTimePicker1;
private TextBox textBoxPassport;
}
}

View File

@ -0,0 +1,144 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace HotelView
{
public partial class FormGuest : Form
{
private readonly IGuestLogic _guestLogic;
public FormGuest(IGuestLogic guestLogic)
{
InitializeComponent();
_guestLogic = guestLogic;
}
private void FormGuest_Load(object sender, EventArgs e)
{
LoadData();
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
Guest newGuest = new()
{
FIO = textBoxName.Text,
PhoneNumber = textBoxPhone.Text,
BirthDate = ToDateOnly(dateTimePicker1.Value),
PassportId = textBoxPassport.Text,
Gender = (GenderEnum)Enum.Parse(typeof(GenderEnum), comboBox1.SelectedItem.ToString())
};
_guestLogic.Create(newGuest);
LoadData();
}
private void LoadData()
{
comboBox1.DataSource = Enum.GetValues(typeof(GenderEnum));
var guests = _guestLogic.GetAll();
dataGridView.Rows.Clear();
if (dataGridView.ColumnCount == 0)
{
dataGridView.Columns.Add("Id", "ID");
dataGridView.Columns.Add("FIO", "ФИО");
dataGridView.Columns.Add("PhoneNumber", "Номер телефона");
dataGridView.Columns.Add("BirthDate", "Дата рождения");
dataGridView.Columns.Add("PassportId", "Паспорт");
dataGridView.Columns.Add("Gender", "Пол");
}
dataGridView.Columns["Id"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["FIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["PhoneNumber"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["BirthDate"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["PassportId"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Gender"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
foreach (var guest in guests)
{
dataGridView.Rows.Add(guest.Id, guest.FIO, guest.PhoneNumber, guest.BirthDate, guest.PassportId, guest.Gender);
}
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int guestId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
Guest updatedGuest = new()
{
Id = guestId,
FIO = textBoxName.Text,
PhoneNumber = textBoxPhone.Text,
BirthDate = ToDateOnly(dateTimePicker1.Value),
PassportId = textBoxPassport.Text,
Gender = (GenderEnum)Enum.Parse(typeof(GenderEnum), comboBox1.SelectedItem.ToString())
};
_guestLogic.Update(updatedGuest);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите гостинницу, информацию о которой необходимо обновить");
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int guestId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
_guestLogic.Delete(guestId);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите гостинницу, информацию о которой необходимо удалить");
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dataGridView.Rows[e.RowIndex];
textBoxName.Text = row.Cells["FIO"].Value.ToString();
textBoxPhone.Text = row.Cells["PhoneNumber"].Value.ToString();
dateTimePicker1.Text = row.Cells["BirthDate"].Value.ToString();
textBoxPassport.Text = row.Cells["PassportId"].Value.ToString();
comboBox1.Text = row.Cells["Gender"].ToString();
}
}
public DateOnly ToDateOnly(DateTime dateTime)
{
var DateTime = dateTime;
var Date = new DateOnly(DateTime.Year, DateTime.Month, DateTime.Day);
return Date;
}
private void label3_Click(object sender, EventArgs e)
{
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

194
Hotel/HotelView/FormHotel.Designer.cs generated Normal file
View File

@ -0,0 +1,194 @@
namespace HotelView
{
partial class FormHotel
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
dataGridView = new DataGridView();
button1 = new Button();
button2 = new Button();
button3 = new Button();
textBoxName = new TextBox();
textBoxAddress = new TextBox();
label1 = new Label();
label2 = new Label();
label3 = new Label();
label4 = new Label();
numericUpDownCountStar = new NumericUpDown();
numericUpDownCountRoom = new NumericUpDown();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownCountStar).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownCountRoom).BeginInit();
SuspendLayout();
//
// dataGridView
//
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Location = new Point(0, 0);
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.RowTemplate.Height = 29;
dataGridView.Size = new Size(478, 448);
dataGridView.TabIndex = 0;
//
// button1
//
button1.Location = new Point(494, 409);
button1.Name = "button1";
button1.Size = new Size(94, 29);
button1.TabIndex = 1;
button1.Text = "Добавить";
button1.UseVisualStyleBackColor = true;
button1.Click += ButtonCreate_Click;
//
// button2
//
button2.Location = new Point(594, 409);
button2.Name = "button2";
button2.Size = new Size(94, 29);
button2.TabIndex = 2;
button2.Text = "Изменить";
button2.UseVisualStyleBackColor = true;
button2.Click += ButtonUpdate_Click;
//
// button3
//
button3.Location = new Point(694, 409);
button3.Name = "button3";
button3.Size = new Size(94, 29);
button3.TabIndex = 3;
button3.Text = "Удалить";
button3.UseVisualStyleBackColor = true;
button3.Click += ButtonDelete_Click;
//
// textBoxName
//
textBoxName.Location = new Point(508, 71);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(280, 27);
textBoxName.TabIndex = 4;
//
// textBoxAddress
//
textBoxAddress.Location = new Point(508, 158);
textBoxAddress.Name = "textBoxAddress";
textBoxAddress.Size = new Size(280, 27);
textBoxAddress.TabIndex = 5;
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(523, 48);
label1.Name = "label1";
label1.Size = new Size(156, 20);
label1.TabIndex = 8;
label1.Text = "Название гостиницы";
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(523, 135);
label2.Name = "label2";
label2.Size = new Size(130, 20);
label2.TabIndex = 9;
label2.Text = "Адрес гостиницы";
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(523, 226);
label3.Name = "label3";
label3.Size = new Size(132, 20);
label3.TabIndex = 10;
label3.Text = "Количество звезд";
//
// label4
//
label4.AutoSize = true;
label4.Location = new Point(523, 310);
label4.Name = "label4";
label4.Size = new Size(144, 20);
label4.TabIndex = 11;
label4.Text = "Количество комнат";
//
// numericUpDownCountStar
//
numericUpDownCountStar.Location = new Point(508, 249);
numericUpDownCountStar.Name = "numericUpDownCountStar";
numericUpDownCountStar.Size = new Size(280, 27);
numericUpDownCountStar.TabIndex = 12;
//
// numericUpDownCountRoom
//
numericUpDownCountRoom.Location = new Point(508, 333);
numericUpDownCountRoom.Name = "numericUpDownCountRoom";
numericUpDownCountRoom.Size = new Size(280, 27);
numericUpDownCountRoom.TabIndex = 13;
//
// FormHotel
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(numericUpDownCountRoom);
Controls.Add(numericUpDownCountStar);
Controls.Add(label4);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(textBoxAddress);
Controls.Add(textBoxName);
Controls.Add(button3);
Controls.Add(button2);
Controls.Add(button1);
Controls.Add(dataGridView);
Name = "FormHotel";
Text = "FormHotel";
Load += FormHotel_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownCountStar).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownCountRoom).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private DataGridView dataGridView;
private Button button1;
private Button button2;
private Button button3;
private TextBox textBoxName;
private TextBox textBoxAddress;
private Label label1;
private Label label2;
private Label label3;
private Label label4;
private NumericUpDown numericUpDownCountStar;
private NumericUpDown numericUpDownCountRoom;
}
}

View File

@ -0,0 +1,126 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HotelView
{
public partial class FormHotel : Form
{
private readonly IHotelLogic _guestLogic;
public FormHotel(IHotelLogic guestLogic)
{
InitializeComponent();
_guestLogic = guestLogic;
}
private void FormHotel_Load(object sender, EventArgs e)
{
LoadData();
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
Hotel newHotel = new()
{
HotelName = textBoxName.Text,
Address = textBoxAddress.Text,
CountStar = (int)numericUpDownCountStar.Value,
CountRoom = (int)numericUpDownCountRoom.Value,
};
_guestLogic.Create(newHotel);
LoadData();
}
private void LoadData()
{
var guests = _guestLogic.GetAll();
dataGridView.Rows.Clear();
if (dataGridView.ColumnCount == 0)
{
dataGridView.Columns.Add("Id", "ID");
dataGridView.Columns.Add("HotelName", "Название");
dataGridView.Columns.Add("Address", "Адрес");
dataGridView.Columns.Add("CountStar", "Количество звезд");
dataGridView.Columns.Add("CountRoom", "Количество комнат");
}
dataGridView.Columns["Id"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["HotelName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Address"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["CountStar"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["CountRoom"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
foreach (var guest in guests)
{
dataGridView.Rows.Add(guest.Id, guest.HotelName, guest.Address, guest.CountStar, guest.CountRoom);
}
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int guestId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
Hotel updatedHotel = new()
{
Id = guestId,
HotelName = textBoxName.Text,
Address = textBoxAddress.Text,
CountStar = (int)numericUpDownCountStar.Value,
CountRoom = (int)numericUpDownCountRoom.Value,
};
_guestLogic.Update(updatedHotel);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите гостинницу, информацию о которой необходимо обновить");
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int guestId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
_guestLogic.Delete(guestId);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите гостинницу, информацию о которой необходимо удалить");
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dataGridView.Rows[e.RowIndex];
textBoxName.Text = row.Cells["HotelName"].Value.ToString();
textBoxAddress.Text = row.Cells["Address"].Value.ToString();
numericUpDownCountStar.Text = row.Cells["CountStar"].Value.ToString();
numericUpDownCountRoom.Text = row.Cells["CountRoom"].Value.ToString();
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

183
Hotel/HotelView/FormMain.Designer.cs generated Normal file
View File

@ -0,0 +1,183 @@
namespace HotelView
{
partial class FormMain
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
labelTest = new Label();
menuStrip3 = new MenuStrip();
справочникиToolStripMenuItem = new ToolStripMenuItem();
toolStripMenuItem1 = new ToolStripMenuItem();
guestToolStripMenuItem = new ToolStripMenuItem();
serviceToolStripMenuItem = new ToolStripMenuItem();
roomToolStripMenuItem = new ToolStripMenuItem();
reservationToolStripMenuItem = new ToolStripMenuItem();
serviceCheckToolStripMenuItem = new ToolStripMenuItem();
замерыВремениToolStripMenuItem = new ToolStripMenuItem();
get1000ToolStripMenuItem = new ToolStripMenuItem();
create1000ToolStripMenuItem = new ToolStripMenuItem();
update1000ToolStripMenuItem = new ToolStripMenuItem();
delete1000ToolStripMenuItem = new ToolStripMenuItem();
menuStrip3.SuspendLayout();
SuspendLayout();
//
// labelTest
//
labelTest.BorderStyle = BorderStyle.FixedSingle;
labelTest.Font = new Font("Segoe UI", 30F, FontStyle.Regular, GraphicsUnit.Point);
labelTest.Location = new Point(12, 40);
labelTest.Name = "labelTest";
labelTest.Size = new Size(776, 401);
labelTest.TabIndex = 4;
labelTest.TextAlign = ContentAlignment.MiddleCenter;
//
// menuStrip3
//
menuStrip3.ImageScalingSize = new Size(20, 20);
menuStrip3.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, замерыВремениToolStripMenuItem });
menuStrip3.Location = new Point(0, 0);
menuStrip3.Name = "menuStrip3";
menuStrip3.Size = new Size(800, 28);
menuStrip3.TabIndex = 7;
menuStrip3.Text = "menuStrip3";
//
// справочникиToolStripMenuItem
//
справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuItem1, guestToolStripMenuItem, serviceToolStripMenuItem, roomToolStripMenuItem, reservationToolStripMenuItem, serviceCheckToolStripMenuItem });
справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem";
справочникиToolStripMenuItem.Size = new Size(117, 24);
справочникиToolStripMenuItem.Text = "Справочники";
//
// toolStripMenuItem1
//
toolStripMenuItem1.Name = "toolStripMenuItem1";
toolStripMenuItem1.Size = new Size(178, 26);
toolStripMenuItem1.Text = "Hotel";
toolStripMenuItem1.Click += HotelToolStrip_Click;
//
// guestToolStripMenuItem
//
guestToolStripMenuItem.Name = "guestToolStripMenuItem";
guestToolStripMenuItem.Size = new Size(178, 26);
guestToolStripMenuItem.Text = "Guest";
guestToolStripMenuItem.Click += GuestToolStrip_Click;
//
// serviceToolStripMenuItem
//
serviceToolStripMenuItem.Name = "serviceToolStripMenuItem";
serviceToolStripMenuItem.Size = new Size(178, 26);
serviceToolStripMenuItem.Text = "Service";
serviceToolStripMenuItem.Click += ServiceToolStrip_Click;
//
// roomToolStripMenuItem
//
roomToolStripMenuItem.Name = "roomToolStripMenuItem";
roomToolStripMenuItem.Size = new Size(178, 26);
roomToolStripMenuItem.Text = "Room";
roomToolStripMenuItem.Click += RoomToolStrip_Click;
//
// reservationToolStripMenuItem
//
reservationToolStripMenuItem.Name = "reservationToolStripMenuItem";
reservationToolStripMenuItem.Size = new Size(178, 26);
reservationToolStripMenuItem.Text = "Reservation";
reservationToolStripMenuItem.Click += ReservationToolStrip_Click;
//
// serviceCheckToolStripMenuItem
//
serviceCheckToolStripMenuItem.Name = "serviceCheckToolStripMenuItem";
serviceCheckToolStripMenuItem.Size = new Size(178, 26);
serviceCheckToolStripMenuItem.Text = "ServiceCheck";
serviceCheckToolStripMenuItem.Click += ServiceCheckToolStrip_Click;
//
// замерыВремениToolStripMenuItem
//
замерыВремениToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { get1000ToolStripMenuItem, create1000ToolStripMenuItem, update1000ToolStripMenuItem, delete1000ToolStripMenuItem });
замерыВремениToolStripMenuItem.Name = амерыВремениToolStripMenuItem";
замерыВремениToolStripMenuItem.Size = new Size(144, 24);
замерыВремениToolStripMenuItem.Text = "Замеры времени";
//
// get1000ToolStripMenuItem
//
get1000ToolStripMenuItem.Name = "get1000ToolStripMenuItem";
get1000ToolStripMenuItem.Size = new Size(177, 26);
get1000ToolStripMenuItem.Text = "Get 1000";
get1000ToolStripMenuItem.Click += get1000ToolStripMenuItem_Click;
//
// create1000ToolStripMenuItem
//
create1000ToolStripMenuItem.Name = "create1000ToolStripMenuItem";
create1000ToolStripMenuItem.Size = new Size(177, 26);
create1000ToolStripMenuItem.Text = "Create 1000";
create1000ToolStripMenuItem.Click += add1000ToolStripMenuItem_Click;
//
// update1000ToolStripMenuItem
//
update1000ToolStripMenuItem.Name = "update1000ToolStripMenuItem";
update1000ToolStripMenuItem.Size = new Size(177, 26);
update1000ToolStripMenuItem.Text = "Update 1000";
update1000ToolStripMenuItem.Click += update1000ToolStripMenuItem_Click;
//
// delete1000ToolStripMenuItem
//
delete1000ToolStripMenuItem.Name = "delete1000ToolStripMenuItem";
delete1000ToolStripMenuItem.Size = new Size(177, 26);
delete1000ToolStripMenuItem.Text = "Delete 1000";
delete1000ToolStripMenuItem.Click += delete1000ToolStripMenuItem_Click;
//
// FormMain
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(labelTest);
Controls.Add(menuStrip3);
Name = "FormMain";
Text = "Form1";
menuStrip3.ResumeLayout(false);
menuStrip3.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label labelTest;
private MenuStrip menuStrip3;
private ToolStripMenuItem справочникиToolStripMenuItem;
private ToolStripMenuItem toolStripMenuItem1;
private ToolStripMenuItem замерыВремениToolStripMenuItem;
private ToolStripMenuItem get1000ToolStripMenuItem;
private ToolStripMenuItem create1000ToolStripMenuItem;
private ToolStripMenuItem update1000ToolStripMenuItem;
private ToolStripMenuItem delete1000ToolStripMenuItem;
private ToolStripMenuItem guestToolStripMenuItem;
private ToolStripMenuItem serviceToolStripMenuItem;
private ToolStripMenuItem roomToolStripMenuItem;
private ToolStripMenuItem reservationToolStripMenuItem;
private ToolStripMenuItem serviceCheckToolStripMenuItem;
}
}

146
Hotel/HotelView/FormMain.cs Normal file
View File

@ -0,0 +1,146 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
namespace HotelView
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void HotelToolStrip_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormHotel));
if (service is FormHotel form)
{
form.ShowDialog();
}
}
private void RoomToolStrip_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormRoom));
if (service is FormRoom form)
{
form.ShowDialog();
}
}
private void ReservationToolStrip_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormReservation));
if (service is FormReservation form)
{
form.ShowDialog();
}
}
private void GuestToolStrip_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormGuest));
if (service is FormGuest form)
{
form.ShowDialog();
}
}
private void ServiceToolStrip_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormService));
if (service is FormService form)
{
form.ShowDialog();
}
}
private void ServiceCheckToolStrip_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormServiceCheck));
if (service is FormServiceCheck form)
{
form.ShowDialog();
}
}
private void add1000ToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(IHotelLogic));
if (service is IHotelLogic hotelLogic)
{
DateTime startTime = DateTime.Now;
for (int i = 0; i < 1000; i++)
{
Hotel hotel = new()
{
Id = i + 1000,
HotelName = "Íàçâàíèå ãîñòèíèöû " + i,
Address = "Àäðåñ " + i,
CountStar = i,
CountRoom = i
};
hotelLogic.CreateId(hotel);
}
DateTime endTime = DateTime.Now;
labelTest.Text = $"Äîáàâëåíèå 1000 ñòðîê âûïîëíåíî çà {(endTime - startTime).TotalMilliseconds} ìèëëèñåêóíä";
}
}
private void get1000ToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(IHotelLogic));
if (service is IHotelLogic hotelLogic)
{
DateTime startTime = DateTime.Now;
for (int i =0; i < 1000; i++)
hotelLogic.Get(i + 1000);
DateTime endTime = DateTime.Now;
labelTest.Text = $"Ïîëó÷åíèå 1000 ñòðîê âûïîëíåíî çà {(endTime - startTime).TotalMilliseconds} ìèëëèñåêóíä";
}
}
private void update1000ToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(IHotelLogic));
if (service is IHotelLogic hoteLogic)
{
DateTime startTime = DateTime.Now;
for (int i = 0; i < 1000; i++)
{
Hotel hotel = new()
{
Id = i + 1000,
HotelName = "Íàçâàíèå ãîñòèíèöû " + i + 2000,
Address = "Àäðåñ " + i + 2000,
CountStar = i + 2000,
CountRoom = i + 2000
};
hoteLogic.Update(hotel);
}
DateTime endTime = DateTime.Now;
labelTest.Text = $"Îáíîâëåíèå 1000 ñòðîê âûïîëíåíî çà {(endTime - startTime).TotalMilliseconds} ìèëëèñåêóíä";
}
}
private void delete1000ToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(IHotelLogic));
if (service is IHotelLogic hoteLogic)
{
DateTime startTime = DateTime.Now;
for (int i = 0; i < 1000; i++)
{
hoteLogic.Delete(i + 1000);
}
DateTime endTime = DateTime.Now;
labelTest.Text = $"Óäàëåíèå 1000 ñòðîê âûïîëíåíî çà {(endTime - startTime).TotalMilliseconds} ìèëëèñåêóíä";
}
}
}
}

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip3.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>407, 27</value>
</metadata>
</root>

View File

@ -0,0 +1,218 @@
namespace HotelView
{
partial class FormReservation
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
numericUpDownPrice = new NumericUpDown();
label5 = new Label();
labelAuth = new Label();
comboBoxGuest = new ComboBox();
button3 = new Button();
button2 = new Button();
button1 = new Button();
dataGridView = new DataGridView();
label1 = new Label();
comboBoxRoom = new ComboBox();
dateTimePickerDeparture = new DateTimePicker();
label3 = new Label();
dateTimePickerArrival = new DateTimePicker();
label2 = new Label();
((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// numericUpDownPrice
//
numericUpDownPrice.Location = new Point(737, 332);
numericUpDownPrice.Name = "numericUpDownPrice";
numericUpDownPrice.Size = new Size(274, 27);
numericUpDownPrice.TabIndex = 56;
//
// label5
//
label5.AutoSize = true;
label5.Location = new Point(752, 309);
label5.Name = "label5";
label5.Size = new Size(45, 20);
label5.TabIndex = 55;
label5.Text = "Цена";
//
// labelAuth
//
labelAuth.AutoSize = true;
labelAuth.Location = new Point(752, 14);
labelAuth.Name = "labelAuth";
labelAuth.Size = new Size(46, 20);
labelAuth.TabIndex = 54;
labelAuth.Text = "Гость";
//
// comboBoxGuest
//
comboBoxGuest.FormattingEnabled = true;
comboBoxGuest.Location = new Point(737, 39);
comboBoxGuest.Margin = new Padding(3, 5, 3, 5);
comboBoxGuest.Name = "comboBoxGuest";
comboBoxGuest.Size = new Size(274, 28);
comboBoxGuest.TabIndex = 53;
//
// button3
//
button3.Location = new Point(923, 408);
button3.Name = "button3";
button3.Size = new Size(94, 29);
button3.TabIndex = 52;
button3.Text = "Удалить";
button3.UseVisualStyleBackColor = true;
button3.Click += ButtonDelete_Click;
//
// button2
//
button2.Location = new Point(823, 408);
button2.Name = "button2";
button2.Size = new Size(94, 29);
button2.TabIndex = 51;
button2.Text = "Изменить";
button2.UseVisualStyleBackColor = true;
button2.Click += ButtonUpdate_Click;
//
// button1
//
button1.Location = new Point(723, 408);
button1.Name = "button1";
button1.Size = new Size(94, 29);
button1.TabIndex = 50;
button1.Text = "Добавить";
button1.UseVisualStyleBackColor = true;
button1.Click += ButtonCreate_Click;
//
// dataGridView
//
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Location = new Point(1, -1);
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.RowTemplate.Height = 29;
dataGridView.Size = new Size(696, 451);
dataGridView.TabIndex = 49;
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(752, 89);
label1.Name = "label1";
label1.Size = new Size(69, 20);
label1.TabIndex = 58;
label1.Text = "Комната";
//
// comboBoxRoom
//
comboBoxRoom.FormattingEnabled = true;
comboBoxRoom.Location = new Point(737, 114);
comboBoxRoom.Margin = new Padding(3, 5, 3, 5);
comboBoxRoom.Name = "comboBoxRoom";
comboBoxRoom.Size = new Size(274, 28);
comboBoxRoom.TabIndex = 57;
//
// dateTimePickerDeparture
//
dateTimePickerDeparture.Location = new Point(737, 267);
dateTimePickerDeparture.Name = "dateTimePickerDeparture";
dateTimePickerDeparture.Size = new Size(280, 27);
dateTimePickerDeparture.TabIndex = 60;
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(752, 244);
label3.Name = "label3";
label3.Size = new Size(95, 20);
label3.TabIndex = 59;
label3.Text = "Дата выезда";
//
// dateTimePickerArrival
//
dateTimePickerArrival.Location = new Point(737, 188);
dateTimePickerArrival.Name = "dateTimePickerArrival";
dateTimePickerArrival.Size = new Size(274, 27);
dateTimePickerArrival.TabIndex = 62;
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(752, 165);
label2.Name = "label2";
label2.Size = new Size(91, 20);
label2.TabIndex = 61;
label2.Text = "Дата заезда";
//
// FormReservation
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1030, 450);
Controls.Add(dateTimePickerArrival);
Controls.Add(label2);
Controls.Add(dateTimePickerDeparture);
Controls.Add(label3);
Controls.Add(label1);
Controls.Add(comboBoxRoom);
Controls.Add(numericUpDownPrice);
Controls.Add(label5);
Controls.Add(labelAuth);
Controls.Add(comboBoxGuest);
Controls.Add(button3);
Controls.Add(button2);
Controls.Add(button1);
Controls.Add(dataGridView);
Name = "FormReservation";
Text = "FormReservation";
Load += FormReservation_Load;
((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit();
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private NumericUpDown numericUpDownPrice;
private Label label5;
private Label labelAuth;
private ComboBox comboBoxGuest;
private Button button3;
private Button button2;
private Button button1;
private DataGridView dataGridView;
private Label label1;
private ComboBox comboBoxRoom;
private DateTimePicker dateTimePickerDeparture;
private Label label3;
private DateTimePicker dateTimePickerArrival;
private Label label2;
}
}

View File

@ -0,0 +1,156 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HotelView
{
public partial class FormReservation : Form
{
private readonly IReservationLogic _reservationLogic;
private readonly IGuestLogic _guestLogic;
private readonly IRoomLogic _roomLogic;
public FormReservation(IReservationLogic reservationLogic, IGuestLogic guestLogic, IRoomLogic roomLogic)
{
InitializeComponent();
_reservationLogic = reservationLogic;
_guestLogic = guestLogic;
_roomLogic = roomLogic;
}
private void FormReservation_Load(object sender, EventArgs e)
{
LoadData();
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
Reservation newReservation = new()
{
GuestId = ((Guest?)comboBoxGuest.SelectedItem)?.Id ?? 0,
RoomId = ((Room?)comboBoxRoom.SelectedItem)?.Id ?? 0,
ArrivalDate = ToDateOnly(dateTimePickerArrival.Value),
DepartureDate = ToDateOnly(dateTimePickerDeparture.Value),
Price = (int)numericUpDownPrice.Value,
};
_reservationLogic.Create(newReservation);
LoadData();
}
private void LoadData()
{
var reservations = _reservationLogic.GetAll();
dataGridView.Rows.Clear();
if (dataGridView.ColumnCount == 0)
{
dataGridView.Columns.Add("Id", "ID");
dataGridView.Columns.Add("GuestId", "GuestId");
dataGridView.Columns["GuestId"].Visible = false;
dataGridView.Columns.Add("Guest", "Гость");
dataGridView.Columns.Add("RoomId", "RoomId");
dataGridView.Columns["RoomId"].Visible = false;
dataGridView.Columns.Add("Room", "Комната");
dataGridView.Columns.Add("ArrivalDate", "Дата заезда");
dataGridView.Columns.Add("DepartureDate", "Дата выезда");
dataGridView.Columns.Add("Price", "Цена");
}
dataGridView.Columns["Id"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView.Columns["Guest"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Room"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView.Columns["ArrivalDate"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView.Columns["DepartureDate"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView.Columns["Price"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
comboBoxGuest.DataSource = _guestLogic.GetAll();
comboBoxGuest.DisplayMember = "Guest";
comboBoxGuest.ValueMember = "FIO";
comboBoxRoom.DataSource = _roomLogic.GetAll();
comboBoxRoom.DisplayMember = "Room";
comboBoxRoom.ValueMember = "Id";
foreach (var reservation in reservations)
{
dataGridView.Rows.Add(reservation.Id, reservation.GuestId, _guestLogic.Get(reservation.GuestId)?.FIO, reservation.RoomId, reservation.ArrivalDate,
reservation.DepartureDate, reservation.Price);
}
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int reservationId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
Reservation updatedReservation = new()
{
Id = reservationId,
GuestId = ((Guest?)comboBoxGuest.SelectedItem)?.Id ?? 0,
RoomId = ((Room?)comboBoxRoom.SelectedItem)?.Id ?? 0,
ArrivalDate = ToDateOnly(dateTimePickerArrival.Value),
DepartureDate = ToDateOnly(dateTimePickerDeparture.Value),
Price = (int)numericUpDownPrice.Value,
};
_reservationLogic.Update(updatedReservation);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите статью, информацию о которой необходимо обновить");
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int reservationId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
_reservationLogic.Delete(reservationId);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите статью, информацию о которой необходимо удалить");
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dataGridView.Rows[e.RowIndex];
comboBoxGuest.SelectedValue = row.Cells["Guest"].Value ?? new Guest { FIO = "Неизвестнo" };
comboBoxRoom.SelectedValue = row.Cells["Room"].Value ?? new Room { Id = 0 };
dateTimePickerArrival.Text = row.Cells["ArrivalDate"].Value.ToString();
dateTimePickerDeparture.Text = row.Cells["DepartureDate"].Value.ToString();
numericUpDownPrice.Text = row.Cells["Price"].Value.ToString();
}
}
public DateOnly ToDateOnly(DateTime dateTime)
{
var DateTime = dateTime;
var Date = new DateOnly(DateTime.Year, DateTime.Month, DateTime.Day);
return Date;
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

243
Hotel/HotelView/FormRoom.Designer.cs generated Normal file
View File

@ -0,0 +1,243 @@
namespace HotelView
{
partial class FormRoom
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
numericUpFlor = new NumericUpDown();
numericUpDownCountPlace = new NumericUpDown();
label4 = new Label();
label3 = new Label();
label2 = new Label();
label1 = new Label();
textBoxNumber = new TextBox();
textBoxCategory = new TextBox();
button3 = new Button();
button2 = new Button();
button1 = new Button();
dataGridView = new DataGridView();
labelAuthor = new Label();
comboBoxHotel = new ComboBox();
numericUpDownPrice = new NumericUpDown();
label5 = new Label();
((System.ComponentModel.ISupportInitialize)numericUpFlor).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownCountPlace).BeginInit();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit();
SuspendLayout();
//
// numericUpFlor
//
numericUpFlor.Location = new Point(954, 229);
numericUpFlor.Minimum = new decimal(new int[] { 5, 0, 0, int.MinValue });
numericUpFlor.Name = "numericUpFlor";
numericUpFlor.Size = new Size(274, 27);
numericUpFlor.TabIndex = 25;
//
// numericUpDownCountPlace
//
numericUpDownCountPlace.Location = new Point(954, 160);
numericUpDownCountPlace.Name = "numericUpDownCountPlace";
numericUpDownCountPlace.Size = new Size(274, 27);
numericUpDownCountPlace.TabIndex = 24;
//
// label4
//
label4.AutoSize = true;
label4.Location = new Point(969, 206);
label4.Name = "label4";
label4.Size = new Size(43, 20);
label4.TabIndex = 23;
label4.Text = "Этаж";
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(967, 137);
label3.Name = "label3";
label3.Size = new Size(126, 20);
label3.TabIndex = 22;
label3.Text = "Количество мест";
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(967, 273);
label2.Name = "label2";
label2.Size = new Size(122, 20);
label2.TabIndex = 21;
label2.Text = "Номер комнаты";
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(969, 72);
label1.Name = "label1";
label1.Size = new Size(81, 20);
label1.TabIndex = 20;
label1.Text = "Категория";
//
// textBoxNumber
//
textBoxNumber.Location = new Point(954, 296);
textBoxNumber.Name = "textBoxNumber";
textBoxNumber.Size = new Size(274, 27);
textBoxNumber.TabIndex = 19;
//
// textBoxCategory
//
textBoxCategory.Location = new Point(954, 95);
textBoxCategory.Name = "textBoxCategory";
textBoxCategory.Size = new Size(274, 27);
textBoxCategory.TabIndex = 18;
//
// button3
//
button3.Location = new Point(1140, 408);
button3.Name = "button3";
button3.Size = new Size(94, 29);
button3.TabIndex = 17;
button3.Text = "Удалить";
button3.UseVisualStyleBackColor = true;
button3.Click += ButtonDelete_Click;
//
// button2
//
button2.Location = new Point(1040, 408);
button2.Name = "button2";
button2.Size = new Size(94, 29);
button2.TabIndex = 16;
button2.Text = "Изменить";
button2.UseVisualStyleBackColor = true;
button2.Click += ButtonUpdate_Click;
//
// button1
//
button1.Location = new Point(940, 408);
button1.Name = "button1";
button1.Size = new Size(94, 29);
button1.TabIndex = 15;
button1.Text = "Добавить";
button1.UseVisualStyleBackColor = true;
button1.Click += ButtonCreate_Click;
//
// dataGridView
//
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Location = new Point(1, 0);
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.RowTemplate.Height = 29;
dataGridView.Size = new Size(910, 451);
dataGridView.TabIndex = 14;
//
// labelAuthor
//
labelAuthor.AutoSize = true;
labelAuthor.Location = new Point(969, 14);
labelAuthor.Name = "labelAuthor";
labelAuthor.Size = new Size(82, 20);
labelAuthor.TabIndex = 46;
labelAuthor.Text = "Гостиница";
//
// comboBoxHotel
//
comboBoxHotel.FormattingEnabled = true;
comboBoxHotel.Location = new Point(954, 39);
comboBoxHotel.Margin = new Padding(3, 5, 3, 5);
comboBoxHotel.Name = "comboBoxHotel";
comboBoxHotel.Size = new Size(274, 28);
comboBoxHotel.TabIndex = 45;
//
// numericUpDownPrice
//
numericUpDownPrice.Location = new Point(954, 359);
numericUpDownPrice.Name = "numericUpDownPrice";
numericUpDownPrice.Size = new Size(274, 27);
numericUpDownPrice.TabIndex = 48;
//
// label5
//
label5.AutoSize = true;
label5.Location = new Point(969, 336);
label5.Name = "label5";
label5.Size = new Size(45, 20);
label5.TabIndex = 47;
label5.Text = "Цена";
//
// FormRoom
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1249, 450);
Controls.Add(numericUpDownPrice);
Controls.Add(label5);
Controls.Add(labelAuthor);
Controls.Add(comboBoxHotel);
Controls.Add(numericUpFlor);
Controls.Add(numericUpDownCountPlace);
Controls.Add(label4);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(textBoxNumber);
Controls.Add(textBoxCategory);
Controls.Add(button3);
Controls.Add(button2);
Controls.Add(button1);
Controls.Add(dataGridView);
Name = "FormRoom";
Text = "FormRoom";
Load += FormRoom_Load;
((System.ComponentModel.ISupportInitialize)numericUpFlor).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownCountPlace).EndInit();
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private NumericUpDown numericUpFlor;
private NumericUpDown numericUpDownCountPlace;
private Label label4;
private Label label3;
private Label label2;
private Label label1;
private TextBox textBoxNumber;
private TextBox textBoxCategory;
private Button button3;
private Button button2;
private Button button1;
private DataGridView dataGridView;
private Label labelAuthor;
private ComboBox comboBoxHotel;
private NumericUpDown numericUpDownPrice;
private Label label5;
}
}

146
Hotel/HotelView/FormRoom.cs Normal file
View File

@ -0,0 +1,146 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HotelView
{
public partial class FormRoom : Form
{
private readonly IRoomLogic _roomLogic;
private readonly IHotelLogic _hotelLogic;
public FormRoom(IRoomLogic roomLogic, IHotelLogic hotelLogic)
{
InitializeComponent();
_roomLogic = roomLogic;
_hotelLogic = hotelLogic;
}
private void FormRoom_Load(object sender, EventArgs e)
{
LoadData();
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
Room newRoom = new()
{
HotelId = ((Hotel?)comboBoxHotel.SelectedItem)?.Id ?? 0,
Category = textBoxCategory.Text,
CountPlace = (int)numericUpDownCountPlace.Value,
Flor = (int)numericUpFlor.Value,
Number = textBoxNumber.Text,
Price = (int)numericUpDownPrice.Value,
};
_roomLogic.Create(newRoom);
LoadData();
}
private void LoadData()
{
var rooms = _roomLogic.GetAll();
dataGridView.Rows.Clear();
if (dataGridView.ColumnCount == 0)
{
dataGridView.Columns.Add("Id", "ID");
dataGridView.Columns.Add("HotelId", "HotelId");
dataGridView.Columns["HotelId"].Visible = false;
dataGridView.Columns.Add("Hotel", "Гостиница");
dataGridView.Columns.Add("Category", "Категория");
dataGridView.Columns.Add("CountPlace", "Количество мест");
dataGridView.Columns.Add("Flor", "Этаж");
dataGridView.Columns.Add("Number", "Номер");
dataGridView.Columns.Add("Price", "Цена");
}
dataGridView.Columns["Id"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView.Columns["Hotel"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Category"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView.Columns["CountPlace"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView.Columns["Flor"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView.Columns["Number"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView.Columns["Price"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
comboBoxHotel.DataSource = _hotelLogic.GetAll();
comboBoxHotel.DisplayMember = "Hotel";
comboBoxHotel.ValueMember = "HotelName";
foreach (var room in rooms)
{
dataGridView.Rows.Add(room.Id, room.HotelId, _hotelLogic.Get(room.HotelId)?.HotelName, room.Category, room.CountPlace,
room.Flor, room.Number, room.Price);
}
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int roomId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
Room updatedRoom = new()
{
Id = roomId,
HotelId = ((Hotel?)comboBoxHotel.SelectedItem)?.Id ?? 0,
Category = textBoxCategory.Text,
CountPlace = (int)numericUpDownCountPlace.Value,
Flor = (int)numericUpFlor.Value,
Number = textBoxNumber.Text,
Price = (int)numericUpDownPrice.Value,
};
_roomLogic.Update(updatedRoom);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите статью, информацию о которой необходимо обновить");
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int roomId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
_roomLogic.Delete(roomId);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите статью, информацию о которой необходимо удалить");
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dataGridView.Rows[e.RowIndex];
comboBoxHotel.SelectedValue = row.Cells["Hotel"].Value ?? new Hotel { HotelName = "Неизвестнo" };
textBoxCategory.Text = row.Cells["Category"].Value.ToString();
numericUpDownCountPlace.Text = row.Cells["CountPlace"].Value.ToString();
numericUpFlor.Text = row.Cells["Flor"].Value.ToString();
textBoxNumber.Text = row.Cells["Number"].Value.ToString();
numericUpDownPrice.Text = row.Cells["Price"].Value.ToString();
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

149
Hotel/HotelView/FormService.Designer.cs generated Normal file
View File

@ -0,0 +1,149 @@
namespace HotelView
{
partial class FormService
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
numericUpDownPrice = new NumericUpDown();
label4 = new Label();
label1 = new Label();
textBoxName = new TextBox();
button3 = new Button();
button2 = new Button();
button1 = new Button();
dataGridView = new DataGridView();
((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// numericUpDownPrice
//
numericUpDownPrice.Location = new Point(508, 242);
numericUpDownPrice.Maximum = new decimal(new int[] { 100000, 0, 0, 0 });
numericUpDownPrice.Name = "numericUpDownPrice";
numericUpDownPrice.Size = new Size(280, 27);
numericUpDownPrice.TabIndex = 25;
//
// label4
//
label4.AutoSize = true;
label4.Location = new Point(529, 219);
label4.Name = "label4";
label4.Size = new Size(45, 20);
label4.TabIndex = 23;
label4.Text = "Цена";
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(529, 104);
label1.Name = "label1";
label1.Size = new Size(125, 20);
label1.TabIndex = 20;
label1.Text = "Название услуги";
//
// textBoxName
//
textBoxName.Location = new Point(508, 127);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(280, 27);
textBoxName.TabIndex = 18;
//
// button3
//
button3.Location = new Point(700, 410);
button3.Name = "button3";
button3.Size = new Size(94, 29);
button3.TabIndex = 17;
button3.Text = "Удалить";
button3.UseVisualStyleBackColor = true;
button3.Click += ButtonDelete_Click;
//
// button2
//
button2.Location = new Point(600, 410);
button2.Name = "button2";
button2.Size = new Size(94, 29);
button2.TabIndex = 16;
button2.Text = "Изменить";
button2.UseVisualStyleBackColor = true;
button2.Click += ButtonUpdate_Click;
//
// button1
//
button1.Location = new Point(500, 410);
button1.Name = "button1";
button1.Size = new Size(94, 29);
button1.TabIndex = 15;
button1.Text = "Добавить";
button1.UseVisualStyleBackColor = true;
button1.Click += ButtonCreate_Click;
//
// dataGridView
//
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Location = new Point(6, 1);
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.RowTemplate.Height = 29;
dataGridView.Size = new Size(478, 448);
dataGridView.TabIndex = 14;
//
// FormService
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(numericUpDownPrice);
Controls.Add(label4);
Controls.Add(label1);
Controls.Add(textBoxName);
Controls.Add(button3);
Controls.Add(button2);
Controls.Add(button1);
Controls.Add(dataGridView);
Name = "FormService";
Text = "FormService";
Load += FormService_Load;
((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit();
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private NumericUpDown numericUpDownPrice;
private Label label4;
private Label label1;
private TextBox textBoxName;
private Button button3;
private Button button2;
private Button button1;
private DataGridView dataGridView;
}
}

View File

@ -0,0 +1,116 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HotelView
{
public partial class FormService : Form
{
private readonly IServiceLogic _serviceLogic;
public FormService(IServiceLogic serviceLogic)
{
InitializeComponent();
_serviceLogic = serviceLogic;
}
private void FormService_Load(object sender, EventArgs e)
{
LoadData();
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
Service newService = new()
{
Name = textBoxName.Text,
Price = (double)numericUpDownPrice.Value,
};
_serviceLogic.Create(newService);
LoadData();
}
private void LoadData()
{
var services = _serviceLogic.GetAll();
dataGridView.Rows.Clear();
if (dataGridView.ColumnCount == 0)
{
dataGridView.Columns.Add("Id", "ID");
dataGridView.Columns.Add("Name", "Название");
dataGridView.Columns.Add("Price", "Цена");
}
dataGridView.Columns["Id"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Price"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
foreach (var service in services)
{
dataGridView.Rows.Add(service.Id, service.Name, service.Price);
}
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int serviceId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
Service updatedService = new()
{
Id = serviceId,
Name = textBoxName.Text,
Price = (double)numericUpDownPrice.Value
};
_serviceLogic.Update(updatedService);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите гостинницу, информацию о которой необходимо обновить");
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int serviceId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
_serviceLogic.Delete(serviceId);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите гостинницу, информацию о которой необходимо удалить");
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dataGridView.Rows[e.RowIndex];
textBoxName.Text = row.Cells["Name"].Value.ToString();
numericUpDownPrice.Text = row.Cells["Price"].Value.ToString();
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,196 @@
namespace HotelView
{
partial class FormServiceCheck
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
dateTimePicker = new DateTimePicker();
label2 = new Label();
label1 = new Label();
comboBoxService = new ComboBox();
numericUpDownCount = new NumericUpDown();
label5 = new Label();
labelAuth = new Label();
comboBoxReservation = new ComboBox();
button3 = new Button();
button2 = new Button();
button1 = new Button();
dataGridView = new DataGridView();
((System.ComponentModel.ISupportInitialize)numericUpDownCount).BeginInit();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// dateTimePicker
//
dateTimePicker.Location = new Point(628, 305);
dateTimePicker.Name = "dateTimePicker";
dateTimePicker.Size = new Size(274, 27);
dateTimePicker.TabIndex = 74;
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(643, 282);
label2.Name = "label2";
label2.Size = new Size(89, 20);
label2.TabIndex = 73;
label2.Text = "Дата услуги";
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(643, 90);
label1.Name = "label1";
label1.Size = new Size(54, 20);
label1.TabIndex = 72;
label1.Text = "Услуга";
//
// comboBoxService
//
comboBoxService.FormattingEnabled = true;
comboBoxService.Location = new Point(628, 115);
comboBoxService.Margin = new Padding(3, 5, 3, 5);
comboBoxService.Name = "comboBoxService";
comboBoxService.Size = new Size(274, 28);
comboBoxService.TabIndex = 71;
//
// numericUpDownCount
//
numericUpDownCount.Location = new Point(628, 207);
numericUpDownCount.Name = "numericUpDownCount";
numericUpDownCount.Size = new Size(274, 27);
numericUpDownCount.TabIndex = 70;
//
// label5
//
label5.AutoSize = true;
label5.Location = new Point(643, 184);
label5.Name = "label5";
label5.Size = new Size(90, 20);
label5.TabIndex = 69;
label5.Text = "Количество";
//
// labelAuth
//
labelAuth.AutoSize = true;
labelAuth.Location = new Point(643, 15);
labelAuth.Name = "labelAuth";
labelAuth.Size = new Size(114, 20);
labelAuth.TabIndex = 68;
labelAuth.Text = "Бронирование";
//
// comboBoxReservation
//
comboBoxReservation.FormattingEnabled = true;
comboBoxReservation.Location = new Point(628, 40);
comboBoxReservation.Margin = new Padding(3, 5, 3, 5);
comboBoxReservation.Name = "comboBoxReservation";
comboBoxReservation.Size = new Size(274, 28);
comboBoxReservation.TabIndex = 67;
//
// button3
//
button3.Location = new Point(814, 409);
button3.Name = "button3";
button3.Size = new Size(94, 29);
button3.TabIndex = 66;
button3.Text = "Удалить";
button3.UseVisualStyleBackColor = true;
button3.Click += ButtonDelete_Click;
//
// button2
//
button2.Location = new Point(714, 409);
button2.Name = "button2";
button2.Size = new Size(94, 29);
button2.TabIndex = 65;
button2.Text = "Изменить";
button2.UseVisualStyleBackColor = true;
button2.Click += ButtonUpdate_Click;
//
// button1
//
button1.Location = new Point(614, 409);
button1.Name = "button1";
button1.Size = new Size(94, 29);
button1.TabIndex = 64;
button1.Text = "Добавить";
button1.UseVisualStyleBackColor = true;
button1.Click += ButtonCreate_Click;
//
// dataGridView
//
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Location = new Point(-1, 2);
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.RowTemplate.Height = 29;
dataGridView.Size = new Size(609, 446);
dataGridView.TabIndex = 63;
//
// FormServiceCheck
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(916, 450);
Controls.Add(dateTimePicker);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(comboBoxService);
Controls.Add(numericUpDownCount);
Controls.Add(label5);
Controls.Add(labelAuth);
Controls.Add(comboBoxReservation);
Controls.Add(button3);
Controls.Add(button2);
Controls.Add(button1);
Controls.Add(dataGridView);
Name = "FormServiceCheck";
Text = "FormServiceCheck";
Load += FormServiceCheck_Load;
((System.ComponentModel.ISupportInitialize)numericUpDownCount).EndInit();
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private DateTimePicker dateTimePicker;
private Label label2;
private Label label1;
private ComboBox comboBoxService;
private NumericUpDown numericUpDownCount;
private Label label5;
private Label labelAuth;
private ComboBox comboBoxReservation;
private Button button3;
private Button button2;
private Button button1;
private DataGridView dataGridView;
}
}

View File

@ -0,0 +1,151 @@
using HotelAbstractions.Logic;
using HotelAbstractions.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HotelView
{
public partial class FormServiceCheck : Form
{
private readonly IServiceCheckLogic _serviceCheckLogic;
private readonly IReservationLogic _reservationLogic;
private readonly IServiceLogic _serviceLogic;
public FormServiceCheck(IServiceCheckLogic serviceCheckLogic, IReservationLogic reservationLogic, IServiceLogic serviceLogic)
{
InitializeComponent();
_serviceCheckLogic = serviceCheckLogic;
_reservationLogic = reservationLogic;
_serviceLogic = serviceLogic;
}
private void FormServiceCheck_Load(object sender, EventArgs e)
{
LoadData();
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
ServiceCheck newServiceCheck = new()
{
ReservationId = ((Reservation?)comboBoxReservation.SelectedItem)?.Id ?? 0,
ServiceId = ((Service?)comboBoxService.SelectedItem)?.Id ?? 0,
Count = (int)numericUpDownCount.Value,
DateTime = dateTimePicker.Value,
};
_serviceCheckLogic.Create(newServiceCheck);
LoadData();
}
private void LoadData()
{
var serviceChecks = _serviceCheckLogic.GetAll();
dataGridView.Rows.Clear();
if (dataGridView.ColumnCount == 0)
{
dataGridView.Columns.Add("Id", "ID");
dataGridView.Columns.Add("ReservationId", "ReservationId");
dataGridView.Columns["ReservationId"].Visible = false;
dataGridView.Columns.Add("Reservation", "Бронирование");
dataGridView.Columns.Add("ServiceId", "ServiceId");
dataGridView.Columns["ServiceId"].Visible = false;
dataGridView.Columns.Add("Service", "Услуга");
dataGridView.Columns.Add("Count", "Количество");
dataGridView.Columns.Add("DateTime", "Дата время");
}
dataGridView.Columns["Id"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Reservation"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Service"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Count"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["DateTime"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
comboBoxReservation.DataSource = _reservationLogic.GetAll();
comboBoxReservation.DisplayMember = "Reservation";
comboBoxReservation.ValueMember = "Id";
comboBoxService.DataSource = _serviceLogic.GetAll();
comboBoxService.DisplayMember = "Service";
comboBoxService.ValueMember = "Name";
foreach (var serviceCheck in serviceChecks)
{
dataGridView.Rows.Add(serviceCheck.Id,
serviceCheck.ReservationId, _reservationLogic.Get(serviceCheck.ReservationId)?.Id,
serviceCheck.ServiceId, _serviceLogic.Get(serviceCheck.ServiceId)?.Name,
serviceCheck.Count,
serviceCheck.DateTime);
}
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int serviceCheckId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
ServiceCheck updatedServiceCheck = new()
{
Id = serviceCheckId,
ReservationId = ((Reservation?)comboBoxReservation.SelectedItem)?.Id ?? 0,
ServiceId = ((Service?)comboBoxService.SelectedItem)?.Id ?? 0,
Count = (int)numericUpDownCount.Value,
DateTime = dateTimePicker.Value,
};
_serviceCheckLogic.Update(updatedServiceCheck);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите статью, информацию о которой необходимо обновить");
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
int serviceCheckId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
_serviceCheckLogic.Delete(serviceCheckId);
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите статью, информацию о которой необходимо удалить");
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dataGridView.Rows[e.RowIndex];
comboBoxReservation.SelectedValue = row.Cells["Reservation"].Value ?? new Reservation { Id = 0 };
comboBoxService.SelectedValue = row.Cells["Service"].Value ?? new Service { Name = "Неизвестно" };
numericUpDownCount.Text = row.Cells["Count"].Value.ToString();
dateTimePicker.Text = row.Cells["DateTime"].Value.ToString();
}
}
public FormServiceCheck()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\HotelAbstractions\HotelAbstractions.csproj" />
<ProjectReference Include="..\HotelDatabase\HotelDatabase.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,47 @@
using static System.Windows.Forms.DataFormats;
using System;
using Microsoft.Extensions.DependencyInjection;
using HotelAbstractions.Logic;
using HotelDatabase.Implement;
namespace HotelView
{
internal static class Program
{
private static ServiceProvider? _serviceProvider;
public static ServiceProvider? ServiceProvider => _serviceProvider;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
var services = new ServiceCollection();
ConfigureServices(services);
_serviceProvider = services.BuildServiceProvider();
Application.Run(_serviceProvider.GetRequiredService<FormMain>());
}
private static void ConfigureServices(ServiceCollection services)
{
services.AddTransient<IHotelLogic, HotelImplement>();
services.AddTransient<IRoomLogic, RoomImplement>();
services.AddTransient<IReservationLogic, ReservationImplement>();
services.AddTransient<IGuestLogic, GuestImplement>();
services.AddTransient<IServiceCheckLogic, ServiceCheckImplement>();
services.AddTransient<IServiceLogic, ServiceImplement>();
services.AddTransient<FormMain>();
services.AddTransient<FormHotel>();
services.AddTransient<FormGuest>();
services.AddTransient<FormService>();
services.AddTransient<FormReservation>();
services.AddTransient<FormServiceCheck>();
services.AddTransient<FormRoom>();
}
}
}

View File

@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace HotelView.Properties {
using System;
/// <summary>
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс создан автоматически классом StronglyTypedResourceBuilder
// с помощью такого средства, как ResGen или Visual Studio.
// Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
// с параметром /str или перестройте свой проект VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HotelView.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>