Первоначальный алгоритм. Создали класс бд, создали класс frame. В MainWindow инициализировали бд и фрейм, сделали переход на следующее окно(авторизация)
class db:
class db
{
public static Entities tbe;
}
-----------------
class Frame
class MainFrame
{
public static Frame frame;
}
-----------------
class User - объединить в одну строку
public string FullName
{
get
{
return UserSurname + " " + UserName + " " + UserPatronymic;
}
}
-----------------
style App
-----------------
окно MainWindow
public MainWindow()
{
InitializeComponent();
db.tbe = new Entities();
MainFrame.frame = fMain;
MainFrame.frame.Navigate(new AuthorizationPage());
}
-----------------
Капча AuthPage(первое окно)
private DispatcherTimer dispatcher;
public static bool checkedCaptcha;
private int counter = 10;
public AuthorizationPage()
{
InitializeComponent();
dispatcher = new DispatcherTimer();
dispatcher.Interval = new TimeSpan(0, 0, 0, 1);
dispatcher.Tick += new EventHandler(TimerEnd);
}
private void TimerEnd(object sender, EventArgs e)
{
try
{
if (counter != 0)
{
tbAuth.Text = "Новый код доступен через \n\t" + string.Format("00:00:{0}", counter) + " секунд ";
}
else
{
btnAuth.IsEnabled = true;
gpPassword.IsEnabled = true;
gpLogin.IsEnabled = true;
tbAuth.Visibility = Visibility.Collapsed;
dispatcher.Stop();
}
counter--;
}
catch
{
MessageBox.Show("Дваайте еще раз попробуем");
}
}
private void btnAuth_Click(object sender, RoutedEventArgs e)
{
User user = db.tbe.User.FirstOrDefault(x => x.UserPassword == tbPassword.Text && x.UserLogin == tbLogin.Text);
try
{
if (user == null)
{
//tbLogin.Text != user.UserLogin && tbPassword.Text != user.UserPassword
MessageBox.Show("Введенный логин и/или пароль неверен");
Captcha captcha = new Captcha();
captcha.Show();
captcha.Closing += (obj, args) =>
{
if (!checkedCaptcha)
{
btnAuth.IsEnabled = false;
gpPassword.IsEnabled = false;
gpLogin.IsEnabled = false;
counter = 10;
dispatcher.Start();
}
};
}
else
{
if (!string.IsNullOrEmpty(tbLogin.Text) && !string.IsNullOrEmpty(tbPassword.Text))
{
if (tbLogin.Text != null && tbPassword.Text != null)
{
if (user.UserLogin == tbLogin.Text)
{
if (user.UserPassword == tbPassword.Text)
{
NavigationService.Navigate(new PageProducts(user));
}
else
{
MessageBox.Show("Пароль в системе отсутствует");
}
}
else
{
MessageBox.Show("Логин в системе отсутствует");
}
}
}
else
{
MessageBox.Show("Неверный логин и/или пароль!");
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
-----------------
Страница с выводом:
В инициализации:
db.tbe = new Entities();
lvProduct.ItemsSource = db.tbe.Product.ToList();
lvProduct.SelectedValuePath = "ProductArticleNumber";
tblast.Text = db.tbe.Product.Count().ToString(); // вывод 15
tbFirst.Text = lvProduct.Items.Count.ToString(); // вывод 47
-----------------
-----------------
1.ListView
2.ListView.ItemTemplate
3.DataTemplate
4.Grid
В конце можно изьебнуться и вставить. При нажатии на контекстное меню добавляется товар в заказ
а в коде
public static List articleProducts = new List();
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
btnOrder.Visibility = Visibility.Visible;
articleProducts.Add(lvProduct.SelectedValue.ToString());
}
Создать кнопку btnorder
private void btnOrder_Click(object sender, RoutedEventArgs e)
{
Window1 window = new Window1(user);
window.Show();
window.Closing += (obj, args) =>
{
if (articleProducts.Count == 0)
{
btnOrder.Visibility = Visibility.Collapsed;
}
else
{
btnOrder.Visibility = Visibility.Visible;
}
};
}
-----------------
Просмотр заказа (корзина)
Разметка:
Введите количество товара
Код на корзину
List products = new List();
List articles = new List();
User user;
public Window1(User user)
{
InitializeComponent();
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
this.user = user;
cmbOrderPoint.ItemsSource = db.tbe.Point.ToList();
cmbOrderPoint.SelectedValuePath = "idPickupPoint";
cmbOrderPoint.DisplayMemberPath = "displayPoint";
cmbOrderPoint.SelectedIndex = 0;
foreach (Product product in db.tbe.Product.ToList())
{
foreach (string item in PageProducts.articleProducts)
{
if (product.ProductArticleNumber == item)
{
products.Add(product);
Article article = new Article()
{
article = product.ProductArticleNumber,
count = 1,
};
articles.Add(article);
}
}
}
lvOrder.ItemsSource = products;
lvOrder.SelectedValuePath = "ProductArticleNumber";
summOrder();
}
private void summOrder() // вывод суммы заказа
{
double sum = 0;
double summWithDiscount = 0;
foreach (var item in articles)
{
sum += Convert.ToDouble(db.tbe.Product.FirstOrDefault(x => x.ProductArticleNumber == item.article).ProductCost * item.count);
summWithDiscount += Convert.ToDouble(((db.tbe.Product.FirstOrDefault(x => x.ProductArticleNumber == item.article).ProductCost - db.tbe.Product.FirstOrDefault(x => x.ProductArticleNumber == item.article).ProductCost / 100 * db.tbe.Product.FirstOrDefault(x => x.ProductArticleNumber == item.article).ProductDiscountAmount)) * item.count);
}
tbSaleZakaza.Text = "Общая скидка " + Convert.ToInt32((sum - summWithDiscount)).ToString() + "руб.";
tbSummaZakaza.Text = "Итоговая цена " + Convert.ToInt32(Math.Round(summWithDiscount)).ToString() + "руб.";
orderSummaSale = Convert.ToInt32((sum - summWithDiscount)).ToString() + "руб.";
orderSumma = Convert.ToInt32(Math.Round(summWithDiscount)).ToString() + "руб.";
}
public static string ordedDate;
public static int orderID;
public static string orderSostav;
public static string orderSumma;
public static string orderSummaSale;
public static string orderPoint;
private void btnFormOrder_Click(object sender, RoutedEventArgs e)
{
try
{
Random random = new Random();
int codeRND = random.Next(100, 999);
Order order = new Order();
order.OrderID = db.tbe.Order.Max(x => x.OrderID) + 1;
order.OrderStatus = 1;
order.OrderPickupPoint = (int)cmbOrderPoint.SelectedValue;
if (user != null)
{
order.OrderClientsId = user.UserID;
}
else
{
}
order.Code = codeRND;
order.OrderDate = DateTime.Now;
foreach (Product item in products)
{
if (item.ProductQuantityInStock < 3 || item.ProductQuantityInStock == 0)
{
order.OrderDeliveryDate = DateTime.Now.AddDays(6);
}
else
{
order.OrderDeliveryDate = DateTime.Now.AddDays(3);
}
}
db.tbe.Order.Add(order);
db.tbe.SaveChanges();
string orderPoint = cmbOrderPoint.Text;
int orderID = order.OrderID;
// формирование для смежной таблицы
foreach (var item in articles)
{
OrderProduct orderProduct = new OrderProduct();
orderProduct.OrderID = order.OrderID;
orderProduct.ProductArticleNumber = item.article;
orderProduct.Count = item.count;
db.tbe.OrderProduct.Add(orderProduct);
}
string ordedDate = order.OrderDeliveryDate.ToString();
db.tbe.SaveChanges();
PageProducts.articleProducts.Clear();
var ok = MessageBox.Show("Ваш заказ сформирован. Вам доступен талон для получения заказа. ", "Системное сообщение", MessageBoxButton.OK, MessageBoxImage.Information);
// формирование состава заказа
string nameOrderProduct = "";
List orderProductSostav = db.tbe.OrderProduct.Where(x => x.OrderID == order.OrderID).ToList();
foreach (var item in orderProductSostav)
{
Product product1 = db.tbe.Product.FirstOrDefault(x => x.ProductArticleNumber == item.ProductArticleNumber);
nameOrderProduct += product1.ProductName + $"({item.Count} шт.) ";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void deleteMethod(string id) // метод удаления из списка добавленных
{
PageProducts.articleProducts.Remove(id);
if (PageProducts.articleProducts.Count == 0)
{
this.Close();
}
else
{
products.Clear();
foreach (Product product in db.tbe.Product.ToList())
{
foreach (string item in PageProducts.articleProducts)
{
if (product.ProductArticleNumber == item)
{
products.Add(product);
Article article = new Article()
{
article = product.ProductArticleNumber,
count = 1,
};
articles.Add(article);
MessageBox.Show(article.article);
}
}
}
lvOrder.Items.Refresh();
lvOrder.ItemsSource = products;
lvOrder.SelectedValuePath = "ProductArticleNumber";
lvOrder.Items.Refresh();
summOrder();
}
}
private void btnDelete_Click(object sender, RoutedEventArgs e)
{
Button button = (Button)sender;
string id = button.Uid;
deleteMethod(id);
}
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox textBox = (TextBox)sender;
string id = textBox.Uid;
articles.FirstOrDefault(x => x.article == id).count = Convert.ToInt32(textBox.Text);
if (!string.IsNullOrEmpty(textBox.Text))
{
summOrder();
}
if (textBox.Text.Equals("0"))
{
deleteMethod(id);
}
}
-----------------
-----------------
Отсутствие фото:
-----------------
В гриде биндинг, нулевая фотка:
Вывод в комбобокс без контента на разметке:
cmbOrderPoint.ItemsSource = db.tbe.Point.ToList();
cmbOrderPoint.SelectedValuePath = "idPickupPoint";
cmbOrderPoint.DisplayMemberPath = "displayPoint";
cmbOrderPoint.SelectedIndex = 0;
Вывод в комбобокс с добавлением через цикл
List raions = Base.baseDate.Raions.ToList(); // Заполнение списка районов
cbFilterRaion.Items.Add("Все районы");
foreach(Raions raion in raions)
{
cbFilterRaion.Items.Add(raion.RaionName);
}
cbFilterRaion.SelectedIndex = 0;
Вывод записей 15 из 47
1. 15
private void tblast_Loaded(object sender, RoutedEventArgs e)
{
List products = db.tbe.Product.ToList();
tblast.Text = lvProduct.Items.Count.ToString();
lvProduct.ItemsSource = products;
}
2. 47
private void tbFirst_Loaded(object sender, RoutedEventArgs e)
{
List products = db.tbe.Product.ToList();
tbFirst.Text = db.tbe.Product.ToList().Count().ToString();
lvProduct.ItemsSource = products;
}
-----------------
Фильтрация и сортировка
-----------------
private void filtresMethod() // общий метод сортировки и фильтрации
{
List products = db.tbe.Product.ToList();
if (cmbSorted.SelectedItem != null)
{
ComboBoxItem comboBoxItem = (ComboBoxItem)cmbSorted.SelectedItem;
switch (comboBoxItem.Content)
{
case "По умолчанию":
{
products = products;
break;
}
case "По возрастанию стоимости":
{
products = products.OrderBy(x => x.ProductCost).ToList();
break;
}
case "По убыванию стоимости":
{
products = products.OrderByDescending(x => x.ProductCost).ToList();
break;
}
}
}
if (cmbFiltres.SelectedItem != null)
{
ComboBoxItem comboBoxItem = (ComboBoxItem)cmbFiltres.SelectedItem;
switch (comboBoxItem.Content)
{
case "Все диапазоны":
{
products = products;
break;
}
case "0-9,99%":
{
products = products.Where(x => x.ProductDiscountAmount >= 0 && x.ProductDiscountAmount <= 9.99).ToList();
break;
}
case "10-14,99%":
{
products = products.Where(x => x.ProductDiscountAmount >= 10 && x.ProductDiscountAmount <= 14.99).ToList();
break;
}
case "15% и более":
{
products = products.Where(x => x.ProductDiscountAmount >= 15).ToList();
break;
}
}
}
if (tbSearch.Text != null)
{
if (!string.IsNullOrEmpty(tbSearch.Text))
{
products = products.Where(x => x.ProductName.ToLower().Contains(tbSearch.Text)).ToList();
}
}
if (products.Count == 0 || products.Count == null)
{
MessageBox.Show("Отсутствуют критерии, удовлетворяющие результатам поиска!");
}
lvProduct.ItemsSource = products;
tblast.Text = lvProduct.Items.Count.ToString();
}
-----------------
Удаление заказа
-----------------
Получаем UID кнопки, инициализируем объект БД, прогняем по циклу и удаляем
Удаление со смежными таблицами
Button button = (Button)sender;
string id = button.Uid;
Product product = db.tbe.Product.FirstOrDefault(x => x.ProductArticleNumber == id);
foreach (var item in db.tbe.OrderProduct.Where(x => x.ProductArticleNumber == id))
{
db.tbe.OrderProduct.Remove(item);
}
var result = MessageBox.Show("Подтвердите удаление товара", "Системное диалоговое окно", MessageBoxButton.YesNo, MessageBoxImage.Question);
if(result == MessageBoxResult.Yes)
{
db.tbe.Product.Remove(product);
db.tbe.SaveChanges();
MessageBox.Show("Товар " + product.ProductName + " был удален");
NavigationService.Navigate(new PageProducts(user));
}
else
{
MessageBox.Show("Товар " + product.ProductName + " не удален");
NavigationService.Navigate(new PageProducts(user));
}
-----------------
Изменение товара (создать новое окно)
-----------------
Button button = (Button)sender;
string id = button.Uid;
Product product = db.tbe.Product.FirstOrDefault(x => x.ProductArticleNumber == id);
WindowChangeProduct windowChangeProduct = new WindowChangeProduct(product);
windowChangeProduct.Show();
windowChangeProduct.Closing += (bin, args) => // при закрытии окна применяем возможные изменения
{
NavigationService.Navigate(new PageProducts(user));
lvProduct.ItemsSource = db.tbe.Product.ToList();
};
-----------------
В самом окне windowChangeProduct создаем объекты текстбоксов, в коде следующее:
В инициализации
tbProductName.Text = product.ProductName;
tbProductDescription.Text = product.ProductDescription;
cmbProductSupplier.ItemsSource = db.tbe.supplier.ToList();
cmbProductSupplier.SelectedValuePath = "idSupplier";
cmbProductSupplier.DisplayMemberPath = "supplierName";
cmbProductSupplier.SelectedValue = product.idSupplier.ToString();
tbOldPrice.Text = product.ProductCost.ToString();
tbSale.Text = product.ProductDiscountAmount.ToString();
в кнопке для изменения
if(!string.IsNullOrEmpty(tbProductName.Text) && !string.IsNullOrEmpty(tbProductDescription.Text) && !string.IsNullOrEmpty(tbOldPrice.Text) && !string.IsNullOrEmpty(tbSale.Text) && cmbProductSupplier.SelectedIndex != null && cmbProductSupplier != null)
{
product.ProductName = tbProductName.Text;
product.ProductDescription = tbProductDescription.Text;
product.idSupplier = Convert.ToInt32(cmbProductSupplier.SelectedValue);
product.ProductCost = Convert.ToDecimal(tbOldPrice.Text);
product.ProductDiscountAmount = Convert.ToInt32(tbSale.Text);
db.tbe.SaveChanges();
this.Close();
MessageBox.Show("Готово");
}
-----------------
Добавление товара. Создаем нужны поля в разметке
В инициализации определяем комбобоксы
cmbCategory.ItemsSource = db.tbe.ProductCategory.ToList();
cmbCategory.SelectedValuePath = "ProductCategoryID";
cmbCategory.DisplayMemberPath = "ProductCategoryName";
cmbManufacturer.ItemsSource = db.tbe.manufacture.ToList();
cmbManufacturer.SelectedValuePath = "idManufacture";
cmbManufacturer.DisplayMemberPath = "manufactureName";
cmbEdIzm.ItemsSource = db.tbe.edIzm.ToList();
cmbEdIzm.SelectedValuePath = "idEdIzm";
cmbEdIzm.DisplayMemberPath = "edenicaizm";
cmbSupplier.ItemsSource = db.tbe.supplier.ToList();
cmbSupplier.SelectedValuePath = "idSupplier";
cmbSupplier.DisplayMemberPath = "supplierName";
addProduct.Background = (SolidColorBrush)new SolidColorBrush(Color.FromRgb(73, 140, 81));
В кнопке добавления проверяем все условия на !null и !string.IsNullOrEmpt? а после
Product product = new Product();
product.ProductArticleNumber = tbArcticle.Text;
product.ProductName = tbNameProduct.Text;
product.ProductDescription = tbDescriptionProduct.Text;
product.ProductCategory = Convert.ToInt32(cmbCategory.SelectedValue);
product.ProductManufacturer = Convert.ToInt32(cmbManufacturer.SelectedValue);
product.ProductCost = Convert.ToDecimal(tbCost.Text);
product.ProductDiscountAmount = Convert.ToInt32(tbSale.Text);
product.ProductQuantityInStock = Convert.ToInt32(tbQuantity.Text);
product.ProductStatus = null;
product.idEdIzm = Convert.ToInt32(cmbEdIzm.SelectedValue);
product.maxDiscount = Convert.ToInt32(tbMaxDiscount.Text);
product.idSupplier = Convert.ToInt32(cmbSupplier.SelectedValue);
product.ProductPhoto = null;
db.tbe.Product.Add(product);
db.tbe.SaveChanges();
MessageBox.Show("Товар был успешно добавлен");
this.Close();
-----------------
-----------------
Капча второе окно с выводом картинки:
public partial class Captcha : Window
{
public static bool checkedCaptcha;
int num = 0;
public Captcha()
{
InitializeComponent();
CreateImg();
}
private void CreateImg()
{
Random random = new Random();
num = random.Next(1000, 9999);
var pixels = new byte[Convert.ToInt32(CaptchaImage.Width) * Convert.ToInt32(CaptchaImage.Height) * 4];
random.NextBytes(pixels);
BitmapSource bitmapSource = BitmapSource.Create(Convert.ToInt32(CaptchaImage.Width), Convert.ToInt32(CaptchaImage.Height), 96, 96, PixelFormats.Bgra32, null, pixels, Convert.ToInt32(CaptchaImage.Width) * 4);
var visual = new DrawingVisual();
using (DrawingContext drawingContext = visual.RenderOpen())
{
drawingContext.DrawText(
new FormattedText(num.ToString(), CultureInfo.InvariantCulture, FlowDirection.LeftToRight,
new Typeface("Arial"), 100, System.Windows.Media.Brushes.Red), new System.Windows.Point(0, CaptchaImage.Height / 2));
drawingContext.DrawImage(bitmapSource, new Rect(0, 0, 256, 256));
}
var image = new DrawingImage(visual.Drawing);
CaptchaImage.Source = image;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if(num == Convert.ToInt32(tbCheckedCaptcha.Text))
{
if (!string.IsNullOrEmpty(tbCheckedCaptcha.Text))
{
MessageBox.Show("Код введен верно.");
AuthorizationPage.checkedCaptcha = true;
this.Close();
}
else
{
MessageBox.Show("Введите код для капчи");
}
}
else
{
MessageBox.Show("Код введен неверно.");
AuthorizationPage.checkedCaptcha = false;
this.Close();
}
}
}
-----------------
Классы
-----------------
Article
public class Article
{
public string article
{
get;
set;
}
public int count
{
get;set;
}
}
-----------------
db
class db
{
public static Entities tbe;
}
-----------------
Frame
class MainFrame
{
public static Frame frame;
}
-----------------
PartialEditedOrder - парш на смена цвета смену цвета
-----------------
public partial class Product
{
public SolidColorBrush colorBrushes
{
get
{
if (ProductQuantityInStock > 3)
{
SolidColorBrush scb = (SolidColorBrush)new BrushConverter().ConvertFromString("#20b2aa");
return scb;
}
else
{
SolidColorBrush scb1 = (SolidColorBrush)new BrushConverter().ConvertFromString("#ff8c00");
return scb1;
}
}
}
}
-----------------
PartialProduct. Вывод скидки товра. Вывод скидка товара. Закрашивание на ListView
-----------------
public double ActualPrice
{
get
{
if (ProductDiscountAmount != null)
{
double ammount = Convert.ToDouble(ProductCost) - Convert.ToDouble(ProductCost) / 100 * Convert.ToDouble(ProductDiscountAmount);
return ammount;
}
else
{
return Convert.ToDouble(ProductCost);
}
}
}
public SolidColorBrush colorBrush
{
get
{
if (ProductDiscountAmount > 15)
{
SolidColorBrush solidColorBrush = new SolidColorBrush(Color.FromRgb(127, 255, 0));
return solidColorBrush;
}
else
{
SolidColorBrush solidColorBrush = new SolidColorBrush(Color.FromRgb(255, 255, 255));
return solidColorBrush;
}
}
}
-----------------
Объединение ФИО В одно
public partial class User
{
public string FullName
{
get
{
return UserSurname + " " + UserName + " " + UserPatronymic;
}
}
}
-----------------
SaleClass
-----------------
public class SaleClass
{
public Order order { get; set; }
public double Sale { get; set; }
}
-----------------
SummClass
public class SummClass
{
public Order order { get; set; }
public int Summa { get; set; }
public double
SALE { get; set; }
}
-----------------
Объединение городов в комбобокс на странице WindowOrder
public partial class Point
{
public string displayPoint
{
get
{
string str = indexPoint.ToString() + " " + cityPoint + " " + streetPoint + " " + homePoint.ToString();
return str;
}
}
}
-----------------
Тут ведется вывод старой цены и новой цены с учетом скидки