ProfilePage.xaml.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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.Media.Imaging;
  7. using System.Windows.Navigation;
  8. namespace MyTests.Pages
  9. {
  10. // Страница с профилем
  11. public partial class ProfilePage : Page
  12. {
  13. static Users user;
  14. public ProfilePage(Users _user)
  15. {
  16. InitializeComponent();
  17. TestsListBox.Items.Clear(); // Очистка списка с тестами
  18. user = _user;
  19. //Заполняются данные из БД
  20. FIOLabel.Content = user.Surname + " " + user.Name + " " + user.Patronymic; // Заполнение ФИО из базы данных
  21. ProfileImage.Source = user.Image == null ? // Если НЕТ картинки у пользователя в базе данных, то
  22. new BitmapImage(new Uri("../Resources/StandartImage.png", UriKind.RelativeOrAbsolute)) : // Устанавливается стандартная
  23. ImagesFunctions.NewImage(user); // Если есть - картинка устанавливается из БД
  24. EmailBox.Text = user.Email; // Заполняется электронная почта из БД
  25. InfoBox.Text = user.Info; // Заполняется информация из БД
  26. if (user != Session.User) //
  27. { //
  28. EmailBox.IsEnabled = false; // Если пользователь не владелец профиля, то запрещается редактирование
  29. InfoBox.IsEnabled = false; //
  30. SaveButton.Visibility = Visibility.Collapsed;//
  31. } //
  32. if (user.Post == "Преподаватель")// Если пользователь - преподаватель, то
  33. TestsLoading(); // загружается список тестов преподавателя
  34. else // иначе
  35. TestsListBox.Visibility = Visibility.Collapsed; // список тестов скрывается
  36. }
  37. private void EditImage_Click(object sender, RoutedEventArgs e)
  38. {
  39. if (user == Session.User) // если пользователь - владелец
  40. {
  41. BitmapImage image = ImagesFunctions.SelectImage(); // Выбор картинки с компьютера пользователя
  42. if (image != null) // Если картинка выбрана
  43. {
  44. ProfileImage.Source = image; // картинка профиля заменяется на выбранную
  45. Session.User.Image = ImagesFunctions.BitmapSourceToByteArray((BitmapSource)ProfileImage.Source); // Замена картинки в базе данных в виде varbinary
  46. cdb.db.SaveChanges(); // Сохранение данных
  47. }
  48. }
  49. }
  50. private void TestsLoading()
  51. {
  52. // Создание списка с тестами. Если профиль открыл владелец, то в список добавляются еще и скрытые тесты.
  53. List<Tests> list = user != Session.User ? cdb.db.Tests.Where(item => item.IdUser == user.IdUser && item.IsVisible == true).ToList() :
  54. cdb.db.Tests.Where(item => item.IdUser == user.IdUser).ToList();
  55. // Создание списка с типом TestsClass, в котором будут хранится тесты и их картинки
  56. List<TestsClass> testsList = new List<TestsClass>();
  57. // Берется каждый тест из списка с тестами
  58. foreach (Tests test in list)
  59. {
  60. TestsClass tc = new TestsClass();
  61. tc.test = test;
  62. tc.testImage = test.Image == null ? new BitmapImage(new Uri("../Resources/Approval.png", UriKind.RelativeOrAbsolute)) : ImagesFunctions.NewImage(test); // Если у теста нет картинки, то устанавливается стандартная. Иначе - картинка из БД
  63. testsList.Add(tc);// Добавление данных в список с тестами и картинками
  64. }
  65. // Добавление данных из списка с тестами и картинками в список для отображения (ListBox)
  66. TestsListBox.ItemsSource = testsList;
  67. }
  68. private void SaveButton_Click(object sender, RoutedEventArgs e)
  69. {
  70. if (!Functions.IsValidEmail(EmailBox.Text)) // Проверка на правильность ввода электронной почты
  71. new ErrorWindow("Email введен неверно.").Show(); // Вывод ошибки
  72. else if (Functions.IsEmailAlreadyTaken(EmailBox.Text) && EmailBox.Text != user.Email) // Проверка на уникальность электронной почты
  73. new ErrorWindow("Данный email уже используется.").Show(); // Вывод ошибки
  74. else
  75. {
  76. Session.User.Email = EmailBox.Text; // Замена электронной почты в БД на содержимое EmailBox
  77. Session.User.Info = InfoBox.Text; // Замена информации в БД на содержимое InfoBox
  78. cdb.db.SaveChanges(); // Сохранение
  79. new ErrorWindow("Успешно.").ShowDialog(); // Вывод диалогового окна
  80. }
  81. }
  82. private void CheckResultsButton_Click(object sender, RoutedEventArgs e)
  83. {
  84. Button btn = (Button)sender; // Создание кнопки, которая равна sender
  85. if (btn.DataContext is TestsClass) // Проверка на содержимое элемента ListBox
  86. NavigationService.Navigate(new CheckTestResultsCatalog(((TestsClass)btn.DataContext).test)); //Переход на страницу с каталогом результатов
  87. }
  88. private void EditTestButton_Click(object sender, RoutedEventArgs e)
  89. {
  90. Button btn = (Button)sender;// Создание кнопки, которая равна sender
  91. if (btn.DataContext is TestsClass) // Проверка на содержимое элемента ListBox
  92. NavigationService.Navigate(new EditTestPage(((TestsClass)btn.DataContext).test)); // Переход на страницу с редактированием теста
  93. }
  94. private void TestsListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
  95. {
  96. try
  97. {
  98. if (((Tests)TestsListBox.SelectedItem) != null) // Если выбран элемент списка с тестами
  99. {
  100. // Заполняется переменная, которая хранит в себе открытый тест
  101. Session.OpenedTest = cdb.db.Tests.Where(item => item.IdTest == ((TestsClass)TestsListBox.SelectedItem).test.IdTest).FirstOrDefault();
  102. // Сбрасывается количество баллов за ответы на вопросы
  103. Session.Points = 0;
  104. // Сбрасывается номер вопроса
  105. Session.CurQuestion = 0;
  106. // Массив Content заполняется вопросами из открытого теста
  107. Session.Quest.Content = cdb.db.Questions.Where(item => item.IdTest == Session.OpenedTest.IdTest).Select(item => item.Content).ToArray();
  108. // Массив Answer заполняется ответами из открытого теста
  109. Session.Quest.Answer = cdb.db.Questions.Where(item => item.IdTest == Session.OpenedTest.IdTest).Select(item => item.Answer).ToArray();
  110. // Переход на страницу с прохождением теста
  111. NavigationService.Navigate(new CurTestPage());
  112. }
  113. }
  114. catch
  115. {
  116. new ErrorWindow("Ошибка открытия теста.").ShowDialog(); // Вывод ошибки
  117. }
  118. }
  119. private void DeleteTestButton_Click(object sender, RoutedEventArgs e)
  120. {
  121. Button btn = (Button)sender; // Создается кнопка, которая равна sender
  122. if (btn.DataContext is TestsClass) // Проверка на содержимое элемента ListBox. Т.е нажато по элементу ListBox или нет
  123. {
  124. ConfirmationWindow confWindow = new ConfirmationWindow(); // Открытие окна
  125. confWindow.ShowDialog(); // с подтверждением действия
  126. if (confWindow.answer) // Если ответ "Да"
  127. {
  128. // Удаляются все ответы пользователей, которые относились к выбранному тесту
  129. foreach (Answers answer in cdb.db.Answers.Where(item => item.Questions.IdTest == ((TestsClass)btn.DataContext).test.IdTest))
  130. cdb.db.Answers.Remove(answer);
  131. // Удаляются все вопросы, которые относились к выбранному тесту
  132. foreach (Questions question in cdb.db.Questions.Where(item => item.IdTest == ((TestsClass)btn.DataContext).test.IdTest))
  133. cdb.db.Questions.Remove(question);
  134. // Удаление теста
  135. cdb.db.Tests.Remove(((TestsClass)btn.DataContext).test);
  136. cdb.db.SaveChanges(); // Сохранение
  137. TestsLoading(); // Обновление списка тестов
  138. }
  139. }
  140. }
  141. //Класс, хранящий в себе тест и картинку теста
  142. public class TestsClass
  143. {
  144. public Tests test { get; set; }
  145. public BitmapImage testImage { get; set; }
  146. }
  147. }
  148. }