TestsCatalog.xaml.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows;
  5. using System.Windows.Controls;
  6. using System.Windows.Input;
  7. using System.Windows.Media.Imaging;
  8. using System.Windows.Navigation;
  9. namespace MyTests.Pages
  10. {
  11. // Каталог тестов
  12. public partial class TestsCatalog : Page
  13. {
  14. public TestsCatalog()
  15. {
  16. InitializeComponent();
  17. TestsListBox.Items.Clear(); // Очистка списка тестов
  18. if (Session.User.Post == "Преподаватель") // Если пользователь имеет права преподавателя, то
  19. AddTestButton.Visibility = Visibility.Visible;// Кнопка "Создать тест" становится видна
  20. LoadingTests(); // Обновление списка тестов
  21. }
  22. private void AddTest_Click(object sender, RoutedEventArgs e) // Метод, который вызывается при нажатии на кнопку "создать тест"
  23. {
  24. NavigationService.Navigate(new EditTestPage()); // Переход на страницу редактирования/создания теста
  25. }
  26. void LoadingTests() // Метод, обновляющий список тестов
  27. {
  28. List<Tests> list = cdb.db.Tests.Where(item => item.IsVisible == true && item.Questions.Count > 0).ToList(); // Создается список и заполняется тестами, которые видны пользователям и в которых больше 0 вопросов
  29. if (TestNameBox.Text != "Название теста") //
  30. list = list.Where(item => item.Name.StartsWith(TestNameBox.Text)).ToList(); // В списке остаются только тесты, названия которых начинается на содержимое TestNameBox (aka поиск)
  31. if (AuthorTestBox.Text != "Преподаватель") //
  32. list = list.Where(item => item.Users.Surname.StartsWith(AuthorTestBox.Text) // В списке остаются только тесты,
  33. || item.Users.Name.StartsWith(AuthorTestBox.Text) // автор которых начинается на содержимое AuthorTestBox (aka поиск)
  34. || item.Users.Patronymic.StartsWith(AuthorTestBox.Text)).ToList(); // Поиск по имени, фамилии и отчеству
  35. List<TestsClass> testsList = new List<TestsClass>(); // Создание списка с тестами "для отображения"
  36. foreach (Tests test in list) // Получение всех тестов из списка с тестами
  37. {
  38. TestsClass tc = new TestsClass();
  39. tc.test = test;
  40. tc.testImage = test.Image == null ? new BitmapImage(new Uri("../Resources/Approval.png", UriKind.RelativeOrAbsolute)) : ImagesFunctions.NewImage(test); // Если у теста нет картинки - устанавливается стандартная. Если есть, то берется из БД
  41. testsList.Add(tc);// Добавление теста в список "для отображения"
  42. }
  43. // Заполнение содержимым TestsListBox. Т.е сам вывод тестов пользователю
  44. TestsListBox.ItemsSource = testsList;
  45. }
  46. private void FindTests_Click(object sender, RoutedEventArgs e)
  47. {
  48. LoadingTests(); // Обновление списка тестов
  49. }
  50. private void TestNameBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
  51. {
  52. ((TextBox)sender).Text = String.Empty; // Очистка строки поиска по названию теста
  53. }
  54. private void TestNameBox_LostFocus(object sender, RoutedEventArgs e)
  55. {
  56. if (TestNameBox.Text.Trim() == "") //
  57. TestNameBox.Text = "Название теста"; // Возврат стандартного текста у поля для ввода названия теста(поиск)
  58. }
  59. private void AuthorTestBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
  60. {
  61. ((TextBox)sender).Text = String.Empty; // Очистка строки поиска по автору
  62. }
  63. private void AuthorTestBox_LostFocus(object sender, RoutedEventArgs e)
  64. {
  65. if (AuthorTestBox.Text.Trim() == "") //
  66. AuthorTestBox.Text = "Преподаватель"; //Возврат стандартного текста у поля для ввода автора теста(поиск)
  67. }
  68. private void TestsListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) // Вызывается при нажатии на тест
  69. {
  70. try
  71. {
  72. if (((TestsClass)TestsListBox.SelectedItem) != null) // Доп проверка на то, что выбран именно тест
  73. {
  74. // Создание переменной, которая равна выбранному тесту
  75. Tests thisTest = cdb.db.Tests.Where(item => item.IdTest == ((TestsClass)TestsListBox.SelectedItem).test.IdTest).FirstOrDefault();
  76. if (!thisTest.CanAgain && cdb.db.Answers.Where(item => item.Questions.Tests.IdTest == thisTest.IdTest).Select(item => item.IdUser).Contains(Session.User.IdUser) && Session.User.IdUser != thisTest.IdUser) // Проверка на возможность пройти тест повторно
  77. new ErrorWindow("Этот тест не может быть пройден повторно.").ShowDialog(); // Вывод ошибки
  78. else // Если пройти повторно или впервые возможно, то
  79. {
  80. Session.OpenedTest = thisTest; // Открытый тест = выбранному тесту
  81. Session.Points = 0; // Сброс очков
  82. Session.CurQuestion = 0; // Сброс текущего вопроса
  83. Session.Quest.Content = cdb.db.Questions.Where(item => item.IdTest == Session.OpenedTest.IdTest).Select(item => item.Content).ToArray(); // Заполнение массива вопросами (нужно для отображения вопросов в тесте)
  84. Session.Quest.Answer = cdb.db.Questions.Where(item => item.IdTest == Session.OpenedTest.IdTest).Select(item => item.Answer).ToArray(); // Запонение массива ответами (нужно для подсчета правильных ответов)
  85. NavigationService.Navigate(new CurTestPage()); // Переход на страницу с решением теста
  86. }
  87. }
  88. }
  89. catch
  90. {
  91. new ErrorWindow("Ошибка открытия теста.").ShowDialog(); // Вывод ошибки
  92. }
  93. }
  94. public class TestsClass
  95. {
  96. public Tests test { get; set; }
  97. public BitmapImage testImage { get; set; }
  98. }
  99. }
  100. }