using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; using MetroFramework; using MetroFramework.Forms; namespace Учет_вещей { public partial class Form1 : MetroForm { private User _currentUser; private Device _selectedDevice; public Form1() { InitializeComponent(); this.Theme = MetroFramework.MetroThemeStyle.Light; this.Style = MetroFramework.MetroColorStyle.Blue; this.BorderStyle = MetroFormBorderStyle.FixedSingle; this.ShadowType = MetroFormShadowType.AeroShadow; this.Text = "Учет оборудования"; } private void Form1_Load(object sender, EventArgs e) { // Показываем форму логина using (var loginForm = new LoginForm()) { if (loginForm.ShowDialog() == DialogResult.OK) { _currentUser = loginForm.CurrentUser; ConfigureFormForUser(); RefreshDevicesGrid(); } else { Close(); // Выход, если пользователь отменил вход } } // Настройка ComboBox для типов устройств и состояний cmbFilterType.Items.Add("Все типы"); foreach (DeviceType type in Enum.GetValues(typeof(DeviceType))) { cmbFilterType.Items.Add(type.ToString()); cmbDeviceType.Items.Add(type.ToString()); } cmbFilterType.SelectedIndex = 0; cmbFilterState.Items.Add("Все состояния"); foreach (DeviceState state in Enum.GetValues(typeof(DeviceState))) { cmbFilterState.Items.Add(state.ToString()); cmbDeviceState.Items.Add(state.ToString()); } cmbFilterState.SelectedIndex = 0; // Текущая дата для нового устройства dtpRegistrationDate.Value = DateTime.Today; // Обработчик выбора строки в DataGridView dgvDevices.SelectionChanged += DgvDevices_SelectionChanged; } private void ConfigureFormForUser() { Text = $"Учёт техники в организации - {_currentUser.Username} ({_currentUser.Role})"; bool isAdmin = _currentUser.Role == UserRole.Admin; btnAdd.Enabled = isAdmin; btnEdit.Enabled = isAdmin; btnDelete.Enabled = isAdmin; btnSave.Enabled = isAdmin; panelDeviceDetails.Enabled = isAdmin; } private void RefreshDevicesGrid(List devices = null) { devices = devices ?? DbManager.GetAllDevices(); dgvDevices.DataSource = null; dgvDevices.DataSource = devices; // Настройка столбцов if (dgvDevices.Columns.Count > 0) { dgvDevices.Columns["Id"].HeaderText = "ID"; dgvDevices.Columns["Id"].Width = 40; dgvDevices.Columns["Name"].HeaderText = "Наименование"; dgvDevices.Columns["Name"].Width = 150; dgvDevices.Columns["InventoryNumber"].HeaderText = "Инв. номер"; dgvDevices.Columns["InventoryNumber"].Width = 80; dgvDevices.Columns["TypeString"].HeaderText = "Тип"; dgvDevices.Columns["Type"].Visible = false; dgvDevices.Columns["Location"].HeaderText = "Местоположение"; dgvDevices.Columns["ResponsiblePerson"].HeaderText = "Отв. лицо"; dgvDevices.Columns["StateString"].HeaderText = "Состояние"; dgvDevices.Columns["State"].Visible = false; dgvDevices.Columns["RegistrationDate"].HeaderText = "Дата регистрации"; dgvDevices.Columns["RegistrationDate"].DefaultCellStyle.Format = "dd.MM.yyyy"; } // Обновляем статистику UpdateStatistics(); } private void UpdateStatistics() { Dictionary stats = DbManager.GetDeviceTypeStats(); lvStatistics.Items.Clear(); foreach (var item in stats) { ListViewItem lvi = new ListViewItem(item.Key.ToString()); lvi.SubItems.Add(item.Value.ToString()); lvStatistics.Items.Add(lvi); } // Общее количество устройств int totalDevices = stats.Values.Sum(); ListViewItem totalItem = new ListViewItem("ВСЕГО"); totalItem.SubItems.Add(totalDevices.ToString()); totalItem.Font = new Font(lvStatistics.Font, FontStyle.Bold); lvStatistics.Items.Add(totalItem); } private void ClearDeviceForm() { txtDeviceName.Text = ""; txtInventoryNumber.Text = ""; txtLocation.Text = ""; txtResponsiblePerson.Text = ""; cmbDeviceType.SelectedIndex = -1; cmbDeviceState.SelectedIndex = -1; dtpRegistrationDate.Value = DateTime.Today; _selectedDevice = null; } private void FillDeviceForm(Device device) { if (device == null) return; txtDeviceName.Text = device.Name; txtInventoryNumber.Text = device.InventoryNumber; txtLocation.Text = device.Location; txtResponsiblePerson.Text = device.ResponsiblePerson; cmbDeviceType.SelectedItem = device.Type.ToString(); cmbDeviceState.SelectedItem = device.State.ToString(); dtpRegistrationDate.Value = device.RegistrationDate; _selectedDevice = device; } private Device GetDeviceFromForm() { if (string.IsNullOrEmpty(txtDeviceName.Text) || string.IsNullOrEmpty(txtInventoryNumber.Text) || cmbDeviceType.SelectedIndex == -1 || cmbDeviceState.SelectedIndex == -1) { MetroMessageBox.Show(this, "Пожалуйста, заполните все обязательные поля", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning); return null; } Device device = new Device { Name = txtDeviceName.Text, InventoryNumber = txtInventoryNumber.Text, Type = (DeviceType)Enum.Parse(typeof(DeviceType), cmbDeviceType.SelectedItem.ToString()), Location = txtLocation.Text, ResponsiblePerson = txtResponsiblePerson.Text, State = (DeviceState)Enum.Parse(typeof(DeviceState), cmbDeviceState.SelectedItem.ToString()), RegistrationDate = dtpRegistrationDate.Value }; if (_selectedDevice != null) device.Id = _selectedDevice.Id; return device; } private void DgvDevices_SelectionChanged(object sender, EventArgs e) { if (dgvDevices.SelectedRows.Count > 0 && dgvDevices.SelectedRows[0].DataBoundItem is Device selectedDevice) { FillDeviceForm(selectedDevice); } } private void btnAdd_Click(object sender, EventArgs e) { ClearDeviceForm(); } private void btnEdit_Click(object sender, EventArgs e) { if (dgvDevices.SelectedRows.Count == 0) { MetroMessageBox.Show(this, "Выберите устройство для редактирования", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (dgvDevices.SelectedRows[0].DataBoundItem is Device selectedDevice) { FillDeviceForm(selectedDevice); } } private void btnDelete_Click(object sender, EventArgs e) { if (dgvDevices.SelectedRows.Count == 0) { MetroMessageBox.Show(this, "Выберите устройство для удаления", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (dgvDevices.SelectedRows[0].DataBoundItem is Device selectedDevice) { if (MetroMessageBox.Show(this, $"Вы действительно хотите удалить устройство \"{selectedDevice.Name}\"?", "Подтверждение удаления", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { DbManager.DeleteDevice(selectedDevice.Id); RefreshDevicesGrid(); ClearDeviceForm(); } } } private void btnSave_Click(object sender, EventArgs e) { Device device = GetDeviceFromForm(); if (device == null) return; if (_selectedDevice == null) { // Добавление нового устройства DbManager.AddDevice(device); } else { // Обновление существующего устройства DbManager.UpdateDevice(device); } RefreshDevicesGrid(); ClearDeviceForm(); } private void btnFilter_Click(object sender, EventArgs e) { DeviceType? filterType = null; if (cmbFilterType.SelectedIndex > 0) { filterType = (DeviceType)Enum.Parse(typeof(DeviceType), cmbFilterType.SelectedItem.ToString()); } DeviceState? filterState = null; if (cmbFilterState.SelectedIndex > 0) { filterState = (DeviceState)Enum.Parse(typeof(DeviceState), cmbFilterState.SelectedItem.ToString()); } string location = txtFilterLocation.Text; string searchText = txtSearch.Text; var filteredDevices = DbManager.FilterDevices(filterType, filterState, location, searchText); RefreshDevicesGrid(filteredDevices); } private void btnResetFilter_Click(object sender, EventArgs e) { cmbFilterType.SelectedIndex = 0; cmbFilterState.SelectedIndex = 0; txtFilterLocation.Text = ""; txtSearch.Text = ""; RefreshDevicesGrid(); } private void btnExport_Click(object sender, EventArgs e) { try { SaveFileDialog saveDialog = new SaveFileDialog { Filter = "CSV файлы (*.csv)|*.csv|Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*", Title = "Экспорт данных", FileName = "Учет_техники_" + DateTime.Now.ToString("dd_MM_yyyy") }; if (saveDialog.ShowDialog() == DialogResult.OK) { DbManager.ExportToCsv(saveDialog.FileName); MetroMessageBox.Show(this, "Данные успешно экспортированы", "Экспорт", MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch (Exception ex) { MetroMessageBox.Show(this, "Ошибка при экспорте данных: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } }