Поиск файлов в combobox по его содержимому
У меня есть combobox, который отображает файлы .docx и pdf. В бд храню имя документа и ссылку на него. В приложении могу открывать эти документы в отдельной форме. Я сделала поиск файла по его названию с помощью textbox, а также по содержимому файла. Но когда ввожу в textbox слово, которое есть в одном из файлов - combobox показывает пустой список.
private void FillComboBox()
{
// Очистка combobox
comboBoxFiles.Items.Clear();
// Выполнение запроса для получения имен файлов
using (MySqlConnection connection = Database.GetConnection())
{
MySqlCommand command = new MySqlCommand("SELECT Name FROM document", connection);
using (MySqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
comboBoxFiles.Items.Add(reader["Name"].ToString());
}
}
}
}
private void comboBoxFiles_SelectedIndexChanged(object sender, EventArgs e)
{
string selectedFileName = comboBoxFiles.SelectedItem.ToString();
string filePath = GetFilePath(selectedFileName);
if (!string.IsNullOrEmpty(filePath))
{
// Создать новую форму для отображения файла
FormFileContent formFileContent = new FormFileContent(filePath);
formFileContent.Show();
}
}
private string GetFilePath(string fileName)
{
using (MySqlConnection connection = Database.GetConnection())
{
MySqlCommand command = new MySqlCommand("SELECT Content FROM document WHERE Name = @fileName", connection);
command.Parameters.AddWithValue("@fileName", fileName);
string filePath = (string)command.ExecuteScalar();
return filePath;
}
}
private void TextBoxSearch_TextChanged(object sender, EventArgs e)
{
string searchText = textBoxSearch.Text.Trim();
FillComboBox(searchText);
}
// Перегруженный метод для поиска файлов
private void FillComboBox(string searchText)
{
// Очистка combobox
comboBoxFiles.Items.Clear();
using (MySqlConnection connection = Database.GetConnection())
{
MySqlCommand command = new MySqlCommand("SELECT Name, Content FROM document WHERE Name LIKE @searchText OR Content LIKE @searchText", connection);
command.Parameters.AddWithValue("@searchText", "%" + searchText + "%");
using (MySqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
// Формируем строку, содержащую имя и часть содержимого
string itemText = $"{reader["Name"].ToString()} ({reader["Content"].ToString().Substring(0, Math.Min(reader["Content"].ToString().Length, 20))})";
// Добавьте имя файла в combobox
comboBoxFiles.Items.Add(itemText);
}
}
}
}
Ответы (1 шт):
Попробуйте сделать
command.Parameters.AddWithValue("@searchText", "'%" + searchText + "%'");
вдруг банально дело в одиночных кавычках?
Уважаемый @aepot, конструкция вида
using MySqlConnection connection = new MySqlConnection(mySQL_ConnStr);
using MySqlCommand cmd = new MySqlCommand
{
Connection = connection,
CommandType = CommandType.Text,
CommandText = $"SELECT id FROM my_table WHERE def LIKE @searchText ORDER BY Type ;"
};
cmd.Parameters.AddWithValue("@searchText", "%"+ searchText + "%");
преобразуется в
SELECT id FROM my_table WHERE def LIKE %Vasia% ORDER BY Type ;
что приводит к выбросу исключения. Я не просто так отметил одинарные кавычки, можно было бы дождаться реакции автора вопроса перед удалением моего ответа. И вот этот кусок кода:
private void TextBoxSearch_TextChanged(object sender, EventArgs e)
{
string searchText = textBoxSearch.Text.Trim();
FillComboBox(searchText);
}
// Перегруженный метод для поиска файлов
private void FillComboBox(string searchText)
{
// Очистка combobox
comboBoxFiles.Items.Clear();
using (MySqlConnection connection = Database.GetConnection())
{
MySqlCommand command = new MySqlCommand("SELECT Name, Content FROM document WHERE Name LIKE @searchText OR Content LIKE @searchText", connection);
command.Parameters.AddWithValue("@searchText", "%" +searchText + "%");
прямо показывает, что пытается делаться фильтрация содержимого комбобокса, а не поиск строки в содержимом файла, как отмечают коллеги