using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; namespace Prakt2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } string TxtCon = Properties.Settings.Default.agentRUDConnectionString; struct Agent { public string Title, Type, Phone, Logo, Priority, sumSale; } List LstAgent = new List(); int AgentPerPage = 10; // кол-во записей на страницу int startNum = 0; // номер самой первой записи для отображения в DataGridView /// /// получить данные из базы данных и сохранить их в список List /// void GetDateFromDB() { SqlConnection con = new SqlConnection(TxtCon); con.Open(); SqlCommand query = new SqlCommand(@"SELECT Agent.Title, AgentType.Title AS TypeOrg, Agent.Phone, Agent.Logo, Agent.Priority, (Select sum(ProductCount) from ProductSale Where ProductSale.AgentID = Agent.ID Group by AgentID) as sumSale FROM Agent INNER JOIN AgentType ON Agent.AgentTypeID = AgentType.ID", con); SqlDataReader res = query.ExecuteReader(); while(res.Read()) { Agent agent = new Agent(); agent.Title = res["Title"].ToString(); agent.Type = res["TypeOrg"].ToString(); agent.Phone = res["Phone"].ToString(); agent.Logo = res["Logo"].ToString(); agent.Priority = res["Priority"].ToString(); agent.sumSale = res["sumSale"].ToString(); if (agent.sumSale == "") agent.sumSale = "0"; LstAgent.Add(agent); } con.Close(); } /// /// вывести данные текущей страницы в DataGridView /// void FillDgv() { dgvAgents.Rows.Clear(); // перебор записей для вывода в DataGridView // startNum - номер первой записи на текущей странице // AgentPerPage - кол-во записей для отображения на странице for (int i = startNum; i< startNum + AgentPerPage; i++) { if (i > LstAgent.Count - 1) break; int procent = 0; int sumSale = int.Parse(LstAgent[i].sumSale); if (sumSale >= 10 && sumSale < 20) procent = 5; if (sumSale >= 20 && sumSale < 30) procent = 10; if (sumSale >= 30 && sumSale < 40) procent = 20; if (sumSale >= 40) procent = 25; string Template = $@"{LstAgent[i].Type} | {LstAgent[i].Title} {LstAgent[i].sumSale} продаж {LstAgent[i].Phone} Приоритетность: {LstAgent[i].Priority}"; try { // вывести в таблицу логотип агента, данные об агенте и процент скидки для агента dgvAgents.Rows.Add(Image.FromFile(Application.StartupPath + "\\" + LstAgent[i].Logo), Template, procent + "%\n"); } catch { // если файл с логотипом агента отсутствует или поврежден, то вывести // заглушку из ресурсов dgvAgents.Rows.Add(Properties.Resources.picture, Template, procent + "%\n"); } // если у агента есть продажи, то выделить строку с этим агентом зеленым цветом if (LstAgent[i].sumSale != "0") dgvAgents.Rows[dgvAgents.RowCount - 1].DefaultCellStyle.BackColor = Color.LightGreen; } // кол-во страниц исходя из кол-ва записей на одной странице int countpages = LstAgent.Count / AgentPerPage; // если есть последняя неполная страница, то увеличить кол-во страниц на одну if (LstAgent.Count % AgentPerPage != 0) countpages++; // очистить панель с закладками от старых меток с номерами страниц panelPages.Controls.Clear(); for (int i = 1; i <= countpages; i++) { Label lblPage = new Label(); lblPage.Text = i.ToString(); // метку со страницей выравнивать по правому краю панели lblPage.Dock = DockStyle.Right; lblPage.AutoSize = true; // включить AutoSize для автоматического изменения размеров // подключить обработчик события Click lblPage.Click += LblPage_Click; // если выводится номер текущей страницы, то установить для него подчеркивание if (i == startNum / AgentPerPage + 1) lblPage.Font = new Font(lblPage.Font, FontStyle.Underline); // добавить созданную метку на панель panelPages.Controls.Add(lblPage); } } private void LblPage_Click(object sender, EventArgs e) { // прочитать номер страницы с метки, на которой выполнили щелчок int n = int.Parse((sender as Label).Text); // определить номер первой записи, которая должна отображаться в DatagridView startNum = n * AgentPerPage - AgentPerPage; // обновить записи в DatagridView FillDgv(); } private void Form1_Load(object sender, EventArgs e) { GetDateFromDB(); FillDgv(); } } }