Form1.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Data.SqlClient;
  11. namespace Prakt2
  12. {
  13. public partial class Form1 : Form
  14. {
  15. public Form1()
  16. {
  17. InitializeComponent();
  18. }
  19. string TxtCon = Properties.Settings.Default.agentRUDConnectionString;
  20. struct Agent
  21. {
  22. public string Title, Type, Phone, Logo, Priority, sumSale;
  23. }
  24. List<Agent> LstAgent = new List<Agent>();
  25. int AgentPerPage = 10; // кол-во записей на страницу
  26. int startNum = 0; // номер самой первой записи для отображения в DataGridView
  27. /// <summary>
  28. /// получить данные из базы данных и сохранить их в список List
  29. /// </summary>
  30. void GetDateFromDB()
  31. {
  32. SqlConnection con = new SqlConnection(TxtCon);
  33. con.Open();
  34. SqlCommand query = new SqlCommand(@"SELECT Agent.Title, AgentType.Title AS TypeOrg, Agent.Phone, Agent.Logo, Agent.Priority, (Select sum(ProductCount)
  35. from ProductSale
  36. Where ProductSale.AgentID = Agent.ID
  37. Group by AgentID) as sumSale
  38. FROM Agent INNER JOIN
  39. AgentType ON Agent.AgentTypeID = AgentType.ID", con);
  40. SqlDataReader res = query.ExecuteReader();
  41. while(res.Read())
  42. {
  43. Agent agent = new Agent();
  44. agent.Title = res["Title"].ToString();
  45. agent.Type = res["TypeOrg"].ToString();
  46. agent.Phone = res["Phone"].ToString();
  47. agent.Logo = res["Logo"].ToString();
  48. agent.Priority = res["Priority"].ToString();
  49. agent.sumSale = res["sumSale"].ToString();
  50. if (agent.sumSale == "")
  51. agent.sumSale = "0";
  52. LstAgent.Add(agent);
  53. }
  54. con.Close();
  55. }
  56. /// <summary>
  57. /// вывести данные текущей страницы в DataGridView
  58. /// </summary>
  59. void FillDgv()
  60. {
  61. dgvAgents.Rows.Clear();
  62. // перебор записей для вывода в DataGridView
  63. // startNum - номер первой записи на текущей странице
  64. // AgentPerPage - кол-во записей для отображения на странице
  65. for (int i = startNum; i< startNum + AgentPerPage; i++)
  66. {
  67. if (i > LstAgent.Count - 1)
  68. break;
  69. int procent = 0;
  70. int sumSale = int.Parse(LstAgent[i].sumSale);
  71. if (sumSale >= 10 && sumSale < 20)
  72. procent = 5;
  73. if (sumSale >= 20 && sumSale < 30)
  74. procent = 10;
  75. if (sumSale >= 30 && sumSale < 40)
  76. procent = 20;
  77. if (sumSale >= 40)
  78. procent = 25;
  79. string Template = $@"{LstAgent[i].Type} | {LstAgent[i].Title}
  80. {LstAgent[i].sumSale} продаж
  81. {LstAgent[i].Phone}
  82. Приоритетность: {LstAgent[i].Priority}";
  83. try
  84. {
  85. // вывести в таблицу логотип агента, данные об агенте и процент скидки для агента
  86. dgvAgents.Rows.Add(Image.FromFile(Application.StartupPath + "\\"
  87. + LstAgent[i].Logo), Template, procent + "%\n");
  88. }
  89. catch
  90. {
  91. // если файл с логотипом агента отсутствует или поврежден, то вывести
  92. // заглушку из ресурсов
  93. dgvAgents.Rows.Add(Properties.Resources.picture, Template, procent + "%\n");
  94. }
  95. // если у агента есть продажи, то выделить строку с этим агентом зеленым цветом
  96. if (LstAgent[i].sumSale != "0")
  97. dgvAgents.Rows[dgvAgents.RowCount - 1].DefaultCellStyle.BackColor = Color.LightGreen;
  98. }
  99. // кол-во страниц исходя из кол-ва записей на одной странице
  100. int countpages = LstAgent.Count / AgentPerPage;
  101. // если есть последняя неполная страница, то увеличить кол-во страниц на одну
  102. if (LstAgent.Count % AgentPerPage != 0)
  103. countpages++;
  104. // очистить панель с закладками от старых меток с номерами страниц
  105. panelPages.Controls.Clear();
  106. for (int i = 1; i <= countpages; i++)
  107. {
  108. Label lblPage = new Label();
  109. lblPage.Text = i.ToString();
  110. // метку со страницей выравнивать по правому краю панели
  111. lblPage.Dock = DockStyle.Right;
  112. lblPage.AutoSize = true; // включить AutoSize для автоматического изменения размеров
  113. // подключить обработчик события Click
  114. lblPage.Click += LblPage_Click;
  115. // если выводится номер текущей страницы, то установить для него подчеркивание
  116. if (i == startNum / AgentPerPage + 1)
  117. lblPage.Font = new Font(lblPage.Font, FontStyle.Underline);
  118. // добавить созданную метку на панель
  119. panelPages.Controls.Add(lblPage);
  120. }
  121. }
  122. private void LblPage_Click(object sender, EventArgs e)
  123. {
  124. // прочитать номер страницы с метки, на которой выполнили щелчок
  125. int n = int.Parse((sender as Label).Text);
  126. // определить номер первой записи, которая должна отображаться в DatagridView
  127. startNum = n * AgentPerPage - AgentPerPage;
  128. // обновить записи в DatagridView
  129. FillDgv();
  130. }
  131. private void Form1_Load(object sender, EventArgs e)
  132. {
  133. GetDateFromDB();
  134. FillDgv();
  135. }
  136. }
  137. }