private void BuildTree() { _index.Clear(); try { tvRooms.AfterSelect -= tvRooms_AfterSelect; tvRooms.BeginUpdate(); tvRooms.Nodes.Clear(); // добавим корневой узел var hotelNode = new FloorTreeNode("Гостиница"); tvRooms.Nodes.Add(hotelNode); // сформируем группы номеров по этажам foreach (var floors in _hotel.Rooms.OrderBy(f => f.Floor).GroupBy(f => f.Floor)) { // добавляем узлы этажей var floorNode = new TreeNode(string.Format($"{floors.Key} этаж")); hotelNode.Nodes.Add(floorNode); foreach (var categories in floors.GroupBy(c => c.IdCategory).OrderBy(c => _hotel.Categories[c.Key].NameCategory)) { // добавляем узлы категорий var categoryNode = new TreeNode(_hotel.Categories[categories.Key].NameCategory); floorNode.Nodes.Add(categoryNode); foreach (var room in categories.OrderBy(r => r.RoomNumber)) { // количество занятых мест в номере var count = _hotel.RoomUsed(room, dtpArrivalDate.Value, dtpDepartureDate.Value); var status = room.NumberSeat == count ? "(занят)" : count != 0 ? string.Format($"(ещё: {room.NumberSeat - count})") : ""; // добавляем узлы номеров var roomNode = new TreeNode(string.Format($"{room.RoomNumber} {status}")) { Tag = room }; _index.Add(room, roomNode); categoryNode.Nodes.Add(roomNode); } } } } finally { tvRooms.EndUpdate(); tvRooms.AfterSelect += tvRooms_AfterSelect; } // раскрываем все узлы этажей tvRooms.ExpandAll(); }
/// <summary> /// Заполнение "дерева" номеров по этажам /// </summary> private void BuildTreeAndFillTable() { _floor = 0; // сбрасываем номер выбранного этажа // запрет кнопок на изменение и удаление номера tsbChangeRoom.Enabled = tsbDeleteRoom.Enabled = false; // обработчик выбора узла отключим на время заполнения дерева tvFloors.AfterSelect -= tvFloors_AfterSelect; try { tvFloors.Nodes.Clear(); // добавим корневой узел var hotelNode = new FloorTreeNode("Гостиница"); tvFloors.Nodes.Add(hotelNode); // сформируем группы номеров по этажам foreach (var floor in Rooms.OrderBy(f => f.Floor).GroupBy(f => f.Floor)) { // добавляем узы этажей var floorNode = new FloorTreeNode(string.Format($"{floor.Key} этаж")) { Floor = floor.Key }; hotelNode.Nodes.Add(floorNode); } // раскрываем все узлы этажей tvFloors.ExpandAll(); // устанавливаем размер виртуальной таблицы dgvRooms.RowCount = Rooms.Count; // просим перерисовать таблицу dgvRooms.Invalidate(); } finally { // подключаем обработчик выбора узла tvFloors.AfterSelect += tvFloors_AfterSelect; } }