![](img/2.png) ![](img/3.jfif) ![](img/4.jfif) ```MainWindow.xaml.cs``` ``` using sql_pagining.models; using System.ComponentModel; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Dapper; using MySqlConnector; using sql_pagining.Windows; namespace sql_pagining { public partial class MainWindow : Window, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void Invalidate() { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("productList")); } public int productsSelectedCount = 0; public decimal Result; private void CostChangeButton_Click(object sender, RoutedEventArgs e) { decimal sum = 0; List idList = new List(); if (ProductListBox.SelectedItems.Count == 0) { MessageBox.Show("Выберите продукты для изменения цены."); return; } foreach (Product item in ProductListBox.SelectedItems) { sum += item.MinCostForAgent; idList.Add(item.ID); } var newWindow = new EnterMinCostForAgentWindow(sum / ProductListBox.SelectedItems.Count); if ((bool)newWindow.ShowDialog()) { try { Globals.dataProvider.setMinCostForAgent(newWindow.Result, idList.ToArray()); MessageBox.Show("Стоимость успешно изменена."); } catch (Exception ex) { MessageBox.Show($"Ошибка: {ex.Message}"); } } } private void ProductListBox_OnSelectionChanged( object? sender, SelectionChangedEventArgs e) { if (ProductListBox != null) { productsSelectedCount = ProductListBox.SelectedItems.Count; } Invalidate(); } private int productCount; public List pageList { get; set; } = new List(); public IEnumerable productList { get { Globals.dataProvider.clearFilter(); if (productTypeFilterId > 0) Globals.dataProvider.addFilter( "ProductTypeID = @ProductTypeID", new { ProductTypeID = productTypeFilterId } ); switch (sortType) { case 0: Globals.dataProvider.setOrder(""); break; case 1: Globals.dataProvider.setOrder("Title"); break; case 2: Globals.dataProvider.setOrder("Title DESC"); break; case 3: Globals.dataProvider.setOrder("ArticleNumber"); break; case 4: Globals.dataProvider.setOrder("ArticleNumber DESC"); break; case 5: Globals.dataProvider.setOrder("MaterialCost"); break; case 6: Globals.dataProvider.setOrder("MaterialCost DESC"); break; } if (searchFilter.Length > 0) { Globals.dataProvider.addFilter( "(Title LIKE @search OR Description LIKE @search)", new { search = $"%{searchFilter}%" } ); } var result = Globals.dataProvider.getProduct(currentPage); productCount = Globals.dataProvider.getProductCount(); pageList.Clear(); pageList.Add("<"); for (int i = 1; i < (productCount / Globals.PAGE_LEN) + 1; i++) { pageList.Add(i.ToString()); } pageList.Add(">"); PageListListBox.ItemsSource = pageList; return result; } set { _productList = value; Invalidate(); } } public List productTypeList { get; set; } public MainWindow() { InitializeComponent(); DataContext = this; Globals.dataProvider = new DBDataProvider(); productList = Globals.dataProvider.getProduct(currentPage); productTypeList = Globals.dataProvider.getProductTypes().ToList(); productTypeList.Insert(0, new ProductType { Title = "Все типы продукции" }); } public string[] sortList { get; set; } = { "Без сортировки", "название по убыванию", "название по возрастанию", "артикул по убыванию", "артикул по возрастанию", "цена по убыванию", "цена по возрастанию" }; private IEnumerable _productList; private const int PAGE_LEN = 20; private int _currentPage = 1; private string searchFilter = ""; private int currentPage { get { return _currentPage; } set { _currentPage = value; Invalidate(); } } private void InputElement_OnPointerPressed( object? sender, MouseButtonEventArgs e) { switch ((sender as TextBlock).Text) { case "<": if (currentPage > 1) currentPage--; return; case ">": if (currentPage < productCount / Globals.PAGE_LEN) currentPage++; return; default: currentPage = Convert.ToInt32( (sender as TextBlock).Text ); return; } } private int productTypeFilterId = 0; private void ProductTypeFilter_SelectionChanged(object sender, SelectionChangedEventArgs e) { productTypeFilterId = (ProductTypeFilter.SelectedItem as ProductType).ID; Invalidate(); } private void ProductListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (ProductListBox != null) { productsSelectedCount = ProductListBox.SelectedItems.Count; CostChangeButton.Visibility = productsSelectedCount > 0 ? Visibility.Visible : Visibility.Collapsed; } } private void SearchFilter_KeyUp(object sender, KeyEventArgs e) { searchFilter = searchFilterTextBox.Text; Invalidate(); } private int sortType = 0; private bool sortAsc = true; private void TextBlock_PreviewMouseDown(object sender, MouseButtonEventArgs e) { switch ((sender as TextBlock).Text) { case "<": if (currentPage > 1) currentPage--; return; case ">": if (currentPage < productCount / Globals.PAGE_LEN) currentPage++; return; default: currentPage = Convert.ToInt32( (sender as TextBlock).Text ); return; } } private void SortTypeComboBox_SelectionChanged( object? sender, SelectionChangedEventArgs e) { if (SortTypeComboBox != null) { sortType = SortTypeComboBox.SelectedIndex; Invalidate(); } } private void SearchFilterTextBox_OnKeyUp(object? sender, KeyEventArgs e) { if (searchFilterTextBox.Text != null && searchFilterTextBox.Text != "") { searchFilter = searchFilterTextBox.Text; Invalidate(); } } private void ExitButton_Click(object sender, RoutedEventArgs e) { Application.Current.Shutdown(); } public string costChangeButtonVisible { get { return productsSelectedCount > 1 ? "Visible" : "Hidden"; } } } } ``` ```MainWindow.xaml``` ```