Program.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. using AlfaToad.CustomControls.Theme; // AppearancePalette — цвета и шрифты
  5. using AlfaToad.DataSetCRUDS.Configuration; // DetailRecordFieldMap, OrderRecordFieldMap
  6. using AlfaToad.DefaultScreens.Configuration; // ApplicationScreenSettings, WithViewDataPersistence
  7. using AlfaToad.DefaultScreens.Navigation; // ApplicationDataContext, ApplicationNavigator
  8. using qwe; // ваш Typed DataSet (MirIgryshkiDataSet)
  9. using qwe.qweDataSetTableAdapters;
  10. namespace YourApp
  11. {
  12. internal static class Program
  13. {
  14. [STAThread]
  15. static void Main()
  16. {
  17. Application.EnableVisualStyles();
  18. Application.SetCompatibleTextRenderingDefault(false);
  19. // ═══════════════════════════════════════════════════════════════
  20. // ШАГ 1. DataSet и TableAdapter-ы
  21. // Для view достаточно Fill() — Insert/Update/Delete делает пакет
  22. // ═══════════════════════════════════════════════════════════════
  23. var dataSet = new qweDataSet(); // замените на ваш Typed DataSet
  24. var tovarTableAdapter = new vCatalogTableAdapter();
  25. var ordersTableAdapter = new vOrdersTableAdapter();
  26. var usersTableAdapter = new vw_UsersLoginTableAdapter();
  27. // Строка подключения — задайте свои значения или используйте User Secrets / App.config
  28. var connectionString = "Server=DESKTOP-VQT3IJP;Database=qwe;Trusted_Connection=True;";
  29. /*
  30. Server=YOUR_SERVER;Database=YOUR_DATABASE;User Id=YOUR_USER;Password=YOUR_PASSWORD;
  31. Server=YOUR_SERVER;Database=YOUR_DATABASE;Trusted_Connection=True;
  32. */
  33. // ═══════════════════════════════════════════════════════════════
  34. // ШАГ 2. ApplicationScreenSettings — все настройки приложения
  35. // ═══════════════════════════════════════════════════════════════
  36. var settings = ApplicationScreenSettings.CreateDefault();
  37. // ── Заголовки окон ──────────────────────────────────────────
  38. settings.LoginWindowTitle = "Вход в систему"; // Заголовок формы входа
  39. settings.MainWindowTitle = "Информационная система"; // Заголовок главной формы (оболочка)
  40. settings.CatalogWindowTitle = "Каталог товаров"; // Заголовок экрана каталога
  41. settings.OrdersWindowTitle = "Список заказов"; // Заголовок экрана заказов
  42. // ── Тексты кнопок и пунктов меню ────────────────────────────
  43. settings.LoginButtonText = "Войти"; // Кнопка «Войти» на форме входа
  44. settings.GuestButtonText = "Войти как гость"; // Кнопка гостевого входа
  45. settings.CatalogMenuText = "Каталог"; // Пункт меню «Каталог» на главной форме
  46. settings.OrdersMenuText = "Заказы"; // Пункт меню «Заказы»
  47. settings.LogoutMenuText = "Выход"; // Пункт меню «Выход» (повторный вход)
  48. settings.BackMenuText = "Назад"; // Кнопка возврата на главную форму
  49. // ── Экран входа: подписи и размеры ──────────────────────────
  50. settings.LoginCaptionLogin = "Логин:"; // Подпись слева от поля логина
  51. settings.LoginCaptionPassword = "Пароль:"; // Подпись слева от поля пароля
  52. settings.LoginFormWidth = 480; // Ширина формы входа (px)
  53. settings.LoginFormHeight = 420; // Высота формы входа (px) — чтобы кнопки не обрезались
  54. settings.LoginLogoHeight = 110; // Высота области логотипа на форме входа (px)
  55. // ── Пути к ресурсам (загружаются через ApplyResourcePaths) ──
  56. settings.LogoImagePath = @"C:\Users\kirie\Documents\1. Шарага\Дэмо\ЗАДАНИЕ ДЭ\Модуль 1\import\icon.png"; // Логотип → settings.LogoImage
  57. settings.ApplicationIconPath = @"C:\Users\kirie\Documents\1. Шарага\Дэмо\ЗАДАНИЕ ДЭ\Модуль 1\import\icon.ico"; // Иконка приложения → settings.ApplicationIcon
  58. settings.NoImagePath = @"C:\Users\kirie\Documents\1. Шарага\Дэмо\ЗАДАНИЕ ДЭ\Модуль 1\import\picture.png"; // Заглушка «нет фото» → settings.NoImage
  59. // Либо задайте Image/Icon напрямую (без путей):
  60. // settings.LogoImage = Image.FromFile(@"C:\Path\To\Your\Resources\logo.png");
  61. // settings.ApplicationIcon = new Icon(@"C:\Path\To\Your\Resources\app.ico");
  62. //settings.ApplicationIcon = Icon.FromHandle(new Bitmap(@"C:\Path\To\Your\Resources\icon.png").GetHicon()); // Иконка из PNG
  63. // settings.NoImage = Image.FromFile(@"C:\Path\To\Your\Resources\picture.png");
  64. settings.ApplyResourcePaths(); // Подставляет LogoImage, NoImage, ApplicationIcon из путей выше
  65. // ── Папка изображений товаров ───────────────────────────────
  66. settings.ImagesFolder = @"C:\Users\kirie\Documents\1. Шарага\Дэмо\ЗАДАНИЕ ДЭ\Модуль 1\import"; // Папка с файлами фото (1.jpg, 2.jpg…)
  67. // Если пусто — используется подпапка Images рядом с exe
  68. // ── Ресайз фото при добавлении/редактировании товара ──────
  69. settings.ImageResizeWidth = 300; // Ширина сохраняемого изображения (px)
  70. settings.ImageResizeHeight = 200; // Высота сохраняемого изображения (px)
  71. // ── Заголовки CRUD-форм ─────────────────────────────────────
  72. settings.CatalogAddFormTitle = "Добавление товара";
  73. settings.CatalogEditFormTitle = "Редактирование товара";
  74. settings.OrderAddFormTitle = "Добавление заказа";
  75. settings.OrderEditFormTitle = "Редактирование заказа";
  76. // ═══════════════════════════════════════════════════════════════
  77. // ШАГ 3. AppearancePalette — цвета, шрифты, пороги (стиль экзамена)
  78. // Применяется ко всем экранам: вход, главная, каталог, заказы, CRUD-формы
  79. // ═══════════════════════════════════════════════════════════════
  80. settings.Appearance = new AppearancePalette
  81. {
  82. // ── Цвета ───────────────────────────────────────────────
  83. MainBackground = ColorTranslator.FromHtml("#FFFFFF"), // Основной фон форм и строк списка
  84. SectionBackground = ColorTranslator.FromHtml("#F5DEB3"), // Фон заголовков, панели кнопок, меню
  85. AccentBackground = ColorTranslator.FromHtml("#DEB887"), // Кнопки, акцентные элементы
  86. HighlightBackground = ColorTranslator.FromHtml("#FFDEAD"), // Подсветка товара со скидкой > порога
  87. SelectedRowBackground = ColorTranslator.FromHtml("#E8EEF8"), // Фон выбранной строки в списке
  88. PrimaryText = Color.Black, // Основной цвет текста
  89. SeparatorText = Color.Gray, // Текст разделителей
  90. BorderColor = Color.Black, // Рамка карточек/строк
  91. RowSeparatorColor = Color.Silver, // Линия между строками
  92. OutOfStockBackground = ColorTranslator.FromHtml("#ADD8E6"), // Фон строки при кол-ве ≤ 0
  93. StrikethroughPriceColor = Color.Red, // Зачёркнутая цена (при скидке)
  94. FinalPriceColor = Color.Black, // Итоговая цена со скидкой
  95. // ── Шрифты ──────────────────────────────────────────────
  96. FontFamily = "Arial", // Семейство шрифта (по заданию экзамена)
  97. BaseFontSize = 9f, // Базовый размер текста в списках и формах
  98. TitleFontSize = 10f, // Размер заголовков и имён товаров
  99. // ── Пороги ──────────────────────────────────────────────
  100. HighlightThresholdPercent = 17m // Скидка > 17% → подсветка HighlightBackground
  101. };
  102. // ═══════════════════════════════════════════════════════════════
  103. // ШАГ 4. Имена столбцов БД — сопоставление с формами редактирования
  104. // ═══════════════════════════════════════════════════════════════
  105. settings.DetailFields = new DetailRecordFieldMap
  106. {
  107. PrimaryKeyField = "Article", // Ключ товара (readonly при редактировании)
  108. NameField = "Наименование товара", // Название
  109. CategoryField = "Категория товара", // Выпадающий список
  110. DescriptionField = "Описание товара", // Многострочное описание
  111. ManufacturerField = "Производитель", // Выпадающий список
  112. SupplierField = "Поставщик", // Выпадающий список
  113. PriceField = "Цена", // ≥ 0, не более 2 знаков после запятой
  114. UnitField = "Единица измерения", // шт., упак. и т.д.
  115. StockField = "Кол-во на складе", // Целое ≥ 0
  116. DiscountField = "Действующая скидка", // 0–100 %
  117. ImageField = "Фото" // Имя файла изображения в БД
  118. };
  119. settings.OrderFields = new OrderRecordFieldMap
  120. {
  121. OrderNumberField = "OrderId", // MAX+1 при добавлении, readonly при ред.
  122. ArticleField = "Артикул заказа", // Состав заказа (только просмотр/текст)
  123. StatusField = "Статус заказа", // Выпадающий список
  124. AddressField = "Адрес пункта выдачи", // ID пункта выдачи (int)
  125. OrderDateField = "Дата заказа", // DateTimePicker
  126. DeliveryDateField = "Дата доставки", // Опционально (чекбокс)
  127. ClientNameField = "ФИО авторизированного клиента", // Клиент заказа (ComboBox)
  128. PickupCodeField = "Код для получения" // Код выдачи
  129. };
  130. // ═══════════════════════════════════════════════════════════════
  131. // ШАГ 5. Авторизация — имена столбцов и ролей из vw_UsersLogin
  132. // ═══════════════════════════════════════════════════════════════
  133. settings.LoginFieldName = "Логин"; // Столбец логина в DataTable
  134. settings.PasswordFieldName = "Пароль"; // Столбец пароля
  135. settings.RoleFieldName = "Роль"; // Столбец роли
  136. settings.FullNameFieldName = "ФИО"; // Отображаемое имя пользователя
  137. // Строковые значения ролей в БД → уровень доступа:
  138. settings.AdministratorRoleName = "Администратор"; // Полный CRUD каталог + заказы
  139. settings.ManagerRoleName = "Менеджер"; // Каталог с фильтром + просмотр заказов
  140. settings.ClientRoleName = "Авторизированный клиент"; // Только просмотр каталога
  141. // ═══════════════════════════════════════════════════════════════
  142. // ШАГ 6. ApplicationDataContext — DataSet, загрузка, сохранение
  143. // ═══════════════════════════════════════════════════════════════
  144. var data = new ApplicationDataContext
  145. {
  146. // ── DataSet и имена таблиц ──────────────────────────────
  147. CatalogDataSet = dataSet,
  148. CatalogTableName = "vCatalog", // Таблица каталога в DataSet
  149. OrdersDataSet = dataSet, // Можно один DataSet на всё приложение
  150. OrdersTableName = "vOrders",
  151. UsersDataSet = dataSet,
  152. UsersTableName = "vw_UsersLogin",
  153. // ── Загрузка данных (только Fill — Update в TableAdapter не нужен) ──
  154. LoadUsers = () => usersTableAdapter.Fill(dataSet.vw_UsersLogin),
  155. LoadCatalog = () => tovarTableAdapter.Fill(dataSet.vCatalog),
  156. LoadOrders = () => ordersTableAdapter.Fill(dataSet.vOrders),
  157. // PersistCatalogChanges / PersistOrderChanges можно не задавать —
  158. // подключатся автоматически через WithViewDataPersistence ниже
  159. }
  160. // Insert/Update/Delete для view без правки .xsd:
  161. // ViewPersistenceProfile.NormalizedCatalogView — каталог (Product + справочники)
  162. // ViewPersistenceProfile.NormalizedOrdersView — заказы ([Order] + OrderItem + справочники)
  163. .WithViewDataPersistence(connectionString, settings);
  164. // ═══════════════════════════════════════════════════════════════
  165. // ШАГ 7. Запуск: вход → главная форма → каталог / заказы
  166. // ApplicationNavigator передаёт UsersDataSet в форму заказов
  167. // для ComboBox клиентов (роль ClientRoleName из settings)
  168. // ═══════════════════════════════════════════════════════════════
  169. new ApplicationNavigator(settings, data).Start();
  170. }
  171. }
  172. }