Žiadny popis

ababin 0fdbec39ab Обновить 'readme.md' 1 deň pred
img 97c3425a3a Загрузить файлы 'img' 1 deň pred
readme.md 0fdbec39ab Обновить 'readme.md' 1 deň pred

readme.md

MainWindows.xaml

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition />
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListBox 
Grid.Row="1"
Grid.Column="1"
Background="White"
ItemsSource="{Binding productList}" 
            ScrollViewer.HorizontalScrollBarVisibility="Disabled" Margin="3,3,0,0"  RenderTransformOrigin="0.5,0.5">

            <ListBox.ItemContainerStyle>
                <Style 
            TargetType="ListBoxItem">
                    <Setter 
                Property="HorizontalContentAlignment"
                Value="Stretch" />
                </Style>
            </ListBox.ItemContainerStyle>

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border 
        BorderThickness="1" 
        BorderBrush="Black" 
        CornerRadius="5">

                        <Grid 
Margin="10" 
HorizontalAlignment="Stretch">

                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="64"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="auto"/>
                            </Grid.ColumnDefinitions>

                            <Image
                            Width="64" 
                            Height="64"
                            Source="{Binding ImageBitmap}" HorizontalAlignment="Center"/>

                            <StackPanel
                            Grid.Column="1"
                            Margin="5"
                            Orientation="Vertical">

                                <TextBlock
                                Text="{Binding Title}"/>
                                <TextBlock
                                Text="{Binding ArticleNumber}"/>
                            </StackPanel>

                            <TextBlock
                            Grid.Column="2"
                        Text="{Binding ProductTypeID}"/>

                        </Grid>

                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>

        </ListBox>

        <WrapPanel
    Grid.Column="1" 
    Orientation="Horizontal" 
    ItemHeight="50">



            <ComboBox
    Width="150"
    x:Name="ProductTypeFilter"
    SelectedIndex="0"
    SelectionChanged="ProductTypeFilter_SelectionChanged"
    ItemsSource="{Binding productTypeList}"/>

            <ComboBox
        Name="SortTypeComboBox"
        SelectedIndex="0"
        VerticalContentAlignment="Center"
        MinWidth="200"
        SelectionChanged="SortTypeComboBox_SelectionChanged"
        ItemsSource="{Binding sortList}"/>

            <TextBox
Width="200"
VerticalAlignment="Center"
x:Name="searchFilterTextBox" 
KeyUp="searchFilterTextBox_KeyUp"/>
        </WrapPanel>

        <ListBox
x:Name="PageListListBox"
ItemsSource="{Binding pageList}"
Grid.Column="1"
Grid.Row="2">

            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel 
            HorizontalAlignment="Left" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock 
            Margin="5"
            Text="{Binding}" 
            PreviewMouseDown="TextBlock_PreviewMouseDown"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <Image 
            Grid.Row="0"
            Grid.RowSpan="2"
            
        Source="foto/1.jpg" 
            
        />
        <StackPanel 
            Grid.Row="2"
        Orientation="Vertical"
        
        VerticalAlignment="Bottom">
            <Button 
            x:Name="ExitButton"
            Content="Выход" 
            Click="ExitButton_Click"
            Height="54"/>
        </StackPanel>

        <WrapPanel
Orientation="Horizontal"
Grid.Column="1"
MinHeight="50">
        </WrapPanel>

    </Grid>
</Window>

MainWindow

using System.ComponentModel;
using System.Security.Cryptography.X509Certificates;
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 WpfApp1;

namespace WpfApp1
{


    public partial class MainWindow : Window,
        INotifyPropertyChanged

    {
        public List<string> pageList { get; set; } = new List<string>();
        private int productCount;
        private string searchFilter = "";
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            Globals.dataProvider = new DBDataProvider();
            productTypeList = Globals.dataProvider.getProductTypes().ToList();
            productTypeList.Insert(0, new ProductType { Title = "Все типы продукции" });

        }
        private int _currentPage = 1;
        public int currentPage
        {
            get
            {
                return _currentPage;
            }

            set
            {
                _currentPage = value;
                Invalidate();
            }
        }
        public IEnumerable<Product> productList
        {
            get
            {
                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("ProductionWorkshopNumber");
                        break;
                    case 4:
                        Globals.dataProvider.setOrder("ProductionWorkshopNumber DESC");
                        break;
                    case 5:
                        Globals.dataProvider.setOrder("MaterialCost");
                        break;
                    case 6:
                        Globals.dataProvider.setOrder("MaterialCost DESC");
                        break;
                }
                Globals.dataProvider.clearFilter();
                if (productTypeFilterId > 0)
                    Globals.dataProvider.addFilter(
                        "ProductTypeID = @ProductTypeID",
                        new { ProductTypeID = productTypeFilterId }
                    );
                if (searchFilter.Length > 0)
                {
                    Globals.dataProvider.addFilter(
                        "(Title 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(">");
                Invalidate("pageList");
                return result;
            }

        }

        private void ExitButton_Click(object sender, RoutedEventArgs e)
        {
            Application.Current.Shutdown();

        }
        
        public event PropertyChangedEventHandler? PropertyChanged;
        private void Invalidate(string propertyName = "productList")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        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;
            }
        }
        public string[] sortList { get; set; } =

        {
            "Без сортировки",
            "название по убыванию",
            "название по возрастанию",
            "номер цеха по убыванию",
            "номер цеха по возрастанию",
            "цена по убыванию",
            "цена по возрастанию"
        };
        private int sortType = 0;

        private void SortTypeComboBox_SelectionChanged(
            object? sender,
            SelectionChangedEventArgs e)
        {
            if (SortTypeComboBox != null)
            {
                sortType = SortTypeComboBox.SelectedIndex;
                Invalidate();
            }
        }
        public List<ProductType> productTypeList { get; set; }
        private int productTypeFilterId = 0;

        private void ProductTypeFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // запоминаем ID выбранного типа
            productTypeFilterId = (ProductTypeFilter.SelectedItem as ProductType).ID;
            Invalidate();
        }
        private void searchFilterTextBox_KeyUp(object sender, KeyEventArgs e)
        {
            if (searchFilterTextBox.Text != null && searchFilterTextBox.Text != "")
            {
                searchFilter = searchFilterTextBox.Text;
                Invalidate();
            }
        }
    }
}
using Dapper;
using MySqlConnector;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WpfApp1;

namespace WpfApp1
{
    public class DBDataProvider : IDataProvider
    {
        static string connectionString = "Server=kolei.ru; User ID=ababin; Password=290306; Database=ababin";
        private Dictionary<string, object> filters = new Dictionary<string, object>();
        public void addFilter(string name, object value)
        {
            filters.Add(name, value);
        }

        public void clearFilter()
        {
            filters.Clear();
        }
        public int getProductCount()
        {
            using (MySqlConnection db = new MySqlConnection(connectionString))
            {
                var builder = new SqlBuilder();
                if (filters.Count > 0)
                {
                    foreach (var item in filters)
                    {
                        builder.Where(item.Key, item.Value);
                    }
                }
                var template = builder.AddTemplate(
                    "SELECT count(*) FROM Product /**where**/");
                return db.QuerySingle<int>(
                    template.RawSql,
                    template.Parameters);
            }
        }
        public IEnumerable<Product> getProduct(int pageNum)
        {

            using (MySqlConnection db = new MySqlConnection(connectionString))
            {
                var builder = new SqlBuilder();

                if (orderCondition.Length > 0)
                    builder.OrderBy(orderCondition);

                if (filters.Count > 0)
                {
                    foreach (var item in filters)
                        builder.Where(item.Key, item.Value);
                }

                // добавляем сортировку
                if (orderCondition.Length > 0)
                    builder.OrderBy(orderCondition);

                // формируем шаблон запроса
                var template = builder.AddTemplate(
                    "SELECT * FROM Product /**where**/ /**orderby**/ LIMIT @pageLen OFFSET @offset",
                    new
                    {
                        pageLen = Globals.PAGE_LEN,
                        offset = (pageNum - 1) * Globals.PAGE_LEN
                    }
                );

                // выполняем запрос
                return db.Query<Product>(
                    template.RawSql,
                    template.Parameters).ToList();
            }
        }

       
        private string orderCondition = "";
        public void setOrder(string condition)
        {
            orderCondition = condition;
        }
        public List<ProductType> getProductTypes()
        {
            using (MySqlConnection db = new MySqlConnection(connectionString))
            {
                return db.Query<ProductType>(
                   "SELECT ID, Title FROM ababin.ProductType;").ToList();
            }
        }
    }
}