MainPage.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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 ClosedXML.Excel;
  11. using Npgsql;
  12. namespace TestsManipulate
  13. {
  14. public partial class MainPage : Form
  15. {
  16. private DataTable _dt = new DataTable();
  17. public MainPage()
  18. {
  19. InitializeComponent();
  20. UpdateInfo();
  21. LoadResults();
  22. }
  23. private void MainPage_FormClosed(object sender, FormClosedEventArgs e)
  24. {
  25. Application.Exit();
  26. }
  27. private void UpdateInfo()
  28. {
  29. switch (Program.role_id)
  30. {
  31. case 1: label1.Text = "Администратор"; break;
  32. case 2: label1.Text = "Пользователь";
  33. button1.Visible = false;
  34. button2.Visible = false;
  35. button3.Visible = false; break;
  36. default: label1.Text = "Пользователь";
  37. button1.Visible = false;
  38. button2.Visible = false;
  39. button3.Visible = false; break;
  40. }
  41. LoadResults();
  42. }
  43. public void LoadResults()
  44. {
  45. string sql;
  46. if (Program.role_id == 1)
  47. {
  48. sql = @"
  49. SELECT
  50. r.id as ""id"",
  51. t.title AS ""Название теста"",
  52. tp.name AS ""Тема"",
  53. dl.name AS ""Сложность"",
  54. u.login AS ""Пользователь"",
  55. r.score AS ""Баллы"",
  56. r.max_score AS ""Макс. баллов"",
  57. r.score_percent AS ""Процент (%)"",
  58. TO_CHAR(r.completed_at, 'DD.MM.YYYY HH24:MI') AS ""Дата завершения""
  59. FROM results r
  60. JOIN tests t ON t.id = r.test_id
  61. JOIN topics tp ON tp.id = t.topic_id
  62. JOIN difficulty_levels dl ON dl.id = t.difficulty_level_id
  63. JOIN users u ON u.id = r.user_id
  64. ORDER BY r.completed_at DESC;";
  65. }
  66. else
  67. {
  68. sql = @"
  69. SELECT
  70. r.id as ""id"",
  71. t.title AS ""Название теста"",
  72. tp.name AS ""Тема"",
  73. dl.name AS ""Сложность"",
  74. r.score AS ""Баллы"",
  75. r.max_score AS ""Макс. баллов"",
  76. r.score_percent AS ""Процент (%)"",
  77. TO_CHAR(r.completed_at,'DD.MM.YYYY HH24:MI') AS ""Дата завершения""
  78. FROM results r
  79. JOIN tests t ON t.id = r.test_id
  80. JOIN topics tp ON tp.id = t.topic_id
  81. JOIN difficulty_levels dl ON dl.id = t.difficulty_level_id
  82. WHERE r.user_id = @userId
  83. ORDER BY r.completed_at DESC;";
  84. menuStrip1.Visible = false;
  85. }
  86. using (var conn = new NpgsqlConnection(Program.connString))
  87. {
  88. conn.Open();
  89. using (var cmd = new NpgsqlCommand(sql, conn))
  90. {
  91. if (Program.role_id != 1)
  92. cmd.Parameters.AddWithValue("userId", Program.user_id);
  93. using (var adapter = new NpgsqlDataAdapter(cmd))
  94. {
  95. _dt = new DataTable();
  96. adapter.Fill(_dt);
  97. dataGridView1.DataSource = _dt;
  98. dataGridView1.Columns["id"].Visible = false;
  99. conn.Close();
  100. }
  101. }
  102. }
  103. }
  104. private void Delete(object sender, EventArgs e)
  105. {
  106. if (dataGridView1.SelectedRows.Count == 0) return;
  107. int resultId = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["id"].Value);
  108. int[] ids = new int[] { resultId };
  109. using (var conn = new NpgsqlConnection(Program.connString))
  110. {
  111. conn.Open();
  112. using (var cmd = new NpgsqlCommand("call delete_selected_results(@id, @user_login)", conn))
  113. {
  114. cmd.Parameters.AddWithValue("id", ids);
  115. cmd.Parameters.AddWithValue("user_login", Program.login);
  116. cmd.ExecuteNonQuery();
  117. }
  118. }
  119. UpdateInfo();
  120. }
  121. private void Update(object sender, EventArgs e)
  122. {
  123. MessageBox.Show("Можно изменить только количество очков", "Внимание");
  124. if (dataGridView1.SelectedRows.Count == 0) return;
  125. int resultId = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["id"].Value);
  126. int[] ids = new int[] { resultId };
  127. using (var conn = new NpgsqlConnection(Program.connString))
  128. {
  129. conn.Open();
  130. using (var cmd = new NpgsqlCommand("call update_selected_results(@id, @new_score, @user_login)", conn))
  131. {
  132. cmd.Parameters.AddWithValue("id", ids);
  133. cmd.Parameters.AddWithValue("new_score", dataGridView1.SelectedRows[0].Cells["Баллы"].Value);
  134. cmd.Parameters.AddWithValue("user_login", Program.login);
  135. cmd.ExecuteNonQuery();
  136. }
  137. }
  138. UpdateInfo();
  139. }
  140. private void Add(object sender, EventArgs e)
  141. {
  142. AddResult addResult = new AddResult(this);
  143. addResult.ShowDialog();
  144. }
  145. private void UsersTable(object sender, EventArgs e)
  146. {
  147. UsersPage usersPage = new UsersPage();
  148. usersPage.ShowDialog();
  149. }
  150. private void AnswerOptionsTable(object sender, EventArgs e)
  151. {
  152. AnswerOptionsPage answerOptionsPage = new AnswerOptionsPage();
  153. answerOptionsPage.ShowDialog();
  154. }
  155. private void TestQuestionsTable(object sender, EventArgs e)
  156. {
  157. TestQuestionsPage testQuestionsPage = new TestQuestionsPage();
  158. testQuestionsPage.ShowDialog();
  159. }
  160. private void TestsPage(object sender, EventArgs e)
  161. {
  162. QuestionsPage questionsPage = new QuestionsPage();
  163. questionsPage.ShowDialog();
  164. }
  165. private void QuestionsTable(object sender, EventArgs e)
  166. {
  167. QuestionsPage questionsPage = new QuestionsPage();
  168. questionsPage.ShowDialog();
  169. }
  170. private void TestsTable(object sender, EventArgs e)
  171. {
  172. TestsPage testsPage = new TestsPage();
  173. testsPage.ShowDialog();
  174. }
  175. private void DifficultyLevelsTable(object sender, EventArgs e)
  176. {
  177. DifficultyLevelsPage difficultyLevelsPage = new DifficultyLevelsPage();
  178. difficultyLevelsPage.ShowDialog();
  179. }
  180. private void TopicsTable(object sender, EventArgs e)
  181. {
  182. TopicsPage topicsPage = new TopicsPage();
  183. topicsPage.ShowDialog();
  184. }
  185. private void LogsTable(object sender, EventArgs e)
  186. {
  187. LogsPage logsPage = new LogsPage();
  188. logsPage.ShowDialog();
  189. }
  190. private void Search(object sender, EventArgs e)
  191. {
  192. string keyword = textBox1.Text.Trim();
  193. _dt.DefaultView.RowFilter = string.IsNullOrEmpty(keyword)
  194. ? ""
  195. : $"[Название теста] LIKE '%{keyword}%'" +
  196. $" OR [Тема] LIKE '%{keyword}%'" +
  197. $" OR [Сложность] LIKE '%{keyword}%'";
  198. }
  199. private void Report(object sender, EventArgs e)
  200. {
  201. var dlg = new SaveFileDialog { Filter = "Excel файл|*.xlsx", FileName = "Отчёт.xlsx" };
  202. if (dlg.ShowDialog() != DialogResult.OK) return;
  203. var wb = new XLWorkbook();
  204. var ws = wb.AddWorksheet("Результаты");
  205. ws.Cell(1, 1).InsertTable(dataGridView1.DataSource as DataTable);
  206. ws.Columns().AdjustToContents();
  207. wb.SaveAs(dlg.FileName);
  208. MessageBox.Show("Отчёт сохранён");
  209. }
  210. }
  211. }