FormFindLeven.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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 СУБД_Агентство
  12. {
  13. public partial class FormFindLeven : Form
  14. {
  15. public FormFindLeven()
  16. {
  17. InitializeComponent();
  18. }
  19. int levenshtein(string t1, string t2)
  20. {
  21. // разница в количестве символов в проверяемых строках
  22. int lev = Math.Abs(t1.Length - t2.Length);
  23. // минимальная длина из длин двух строк
  24. int minlen = Math.Min(t1.Length, t2.Length);
  25. // перебор символов от нулевого и до последнего более короткой строки
  26. for (int i = 0; i <= minlen-1; i++)
  27. // если i-е символы не совпали, то сосчитать их
  28. if (t1[i] != t2[i]) lev++;
  29. return lev;
  30. }
  31. // структура данных для хранения фамилии и имени
  32. struct user
  33. {
  34. public string fam, name;
  35. }
  36. // список с фамилиями и именами клиентов
  37. List<user> lst = new List<user>();
  38. public int type;
  39. private void FormFindLeven_Load(object sender, EventArgs e)
  40. {
  41. // объект для подключения к базе данных
  42. SqlConnection con = new SqlConnection(Form1.txtcon);
  43. con.Open(); // открыть подключение
  44. string txtsql = @"
  45. select fam, name
  46. from Users
  47. where type = " + type;
  48. // SQL-запрос для извлечения из БД списка пользователей
  49. SqlCommand query1 = new SqlCommand(txtsql, con);
  50. // выполнить запрос и сохранить результат запроса
  51. SqlDataReader rez = query1.ExecuteReader();
  52. // если есть строки в результате запроса
  53. if (rez.HasRows)
  54. {
  55. // прочитать очередную строку из результата запроса
  56. // выполнять цикл до тех пор, пока не достигли последней записи в таблице
  57. // с результатами запроса
  58. while(rez.Read())
  59. {
  60. user u1;
  61. // новый элемент для списка пользователей
  62. u1.fam = rez["fam"].ToString(); u1.name = rez["name"].ToString();
  63. lst.Add(u1); // добавить в список очередного пользователя
  64. // вывести данные очередного пользователя в таблицу
  65. dgvUsers.Rows.Add(u1.fam, u1.name);
  66. }
  67. }
  68. con.Close(); // закрыть подключение
  69. }
  70. private void btnFind_Click(object sender, EventArgs e)
  71. {
  72. dgvUsers.Rows.Clear(); // очистить таблицу
  73. // перебор пользователей в списке
  74. foreach (user u1 in lst)
  75. {
  76. // если выполняется поиск по фамилии и фамилия пользователя не превышает 3 по расстоянию Левенштейна с символами для поиска, или выполняется поиск по имени и имя пользователя не превышает 3 по расстоянию Левенштейна с символами для поиска, ...
  77. if (rbtFam.Checked && levenshtein(u1.fam, tbxFind.Text) <= 3 ||
  78. rbtName.Checked && levenshtein(u1.name, tbxFind.Text) <= 3)
  79. // вывести в DataGridView такого пользователя
  80. dgvUsers.Rows.Add(u1.fam, u1.name);
  81. }
  82. }
  83. private void dgvUsers_CellContentClick(object sender, DataGridViewCellEventArgs e)
  84. {
  85. }
  86. private void btnShowAll_Click(object sender, EventArgs e)
  87. {
  88. dgvUsers.Rows.Clear(); // очистить таблицу
  89. // перебор пользователей в списке
  90. foreach (user u1 in lst)
  91. {
  92. // вывести в DataGridView пользователя
  93. dgvUsers.Rows.Add(u1.fam, u1.name);
  94. }
  95. }
  96. }
  97. }