Member 14017552 Ответов: 1

Как я могу реализовать кнопку для поиска результатов в списке


C#, Windows Forms - я сделал почти 90% проблемы, но кнопка поиска не работает!
Дан доступ к файлу с данными (ниже). Мне нужно построить программу (GUI-приложение), которая использует LINQ для получения данных из файла базы данных под названием (students.accdb).

Мне нужны переключатели для выбора и поиска по фамилии или программе.
Я должен быть в состоянии искать, если введена полная или частичная фамилия.
Результат должен отображаться в списке, который прокручивается.
Результат должен быть таким: Фамилия, Имя (StudentID) имя программы
Кнопка Очистить должна очистить поле списка.
Подсказка по запросу: используйте функцию Contains для сравнения строк в запросе.

Я не могу заставить кнопки поиска или очистки работать! Я попробовал Search_Click и SelectedIndexChanged, но не могу понять, чего мне не хватает. Это первый раз, когда я делаю поиск в C# Windows Forms. Я правильно определил имена списка, текстового поля, кнопки поиска, кнопки очистки и переключателей.

Я уже определил:
Name of List Box: lstResultListBox
Name of Text Box: LastNameProgramTextBox
Name of Search Button: SearchButton
Radio button 1: byLastNameRadioButton
Radio button 2: byProgramRadioButton
Clear Button: ClearButton


Не могли бы вы мне помочь?
Спасибо

Вот скриншот (извините, я не смог найти место для загрузки изображения)
https://i.stack.imgur.com/BHsAw.png[][^]

Это таблица в файле Access:
StudentID ProgramName	ProgramCode	LastName	FirstName
200056	   Maths	2522	        Anderson	Gregory
200057	   Maths	2522	        Anderson	John
200058	   Computer	2421	        Bay	        Samuel
200059	   Maths	2522	        Brown	        James
200060	   Computer	2389	        Brown	        Alicia
200061	   English	2421	        Doe	        Sally
200062	   English	2421	        George	        Jane
200063	   Maths	2522	        Gray	        Mark


Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StdudentSearch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'simpleStudentDataSet.Student' table. You can move, or remove it, as needed.
            this.studentTableAdapter.Fill(this.simpleStudentDataSet.Student);
        }

        private void Search_Click(object sender, EventArgs e)
        {
            var students =
            from s in this.simpleStudentDataSet.Student
            where s.LastName == LastNameProgramTextBox.Text
            where s.ProgramName == LastNameProgramTextBox.Text
            select s;
            foreach (var s in students)
            {
                lstResultListBox.Items.Add(s.LastName + ", " + s.FirstName);
            }
        }

        private void lstResultListBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            LastNameProgramTextBox.Text = lstResultListBox.SelectedItem.ToString();
        }
    }
}

Richard MacCutchan

Я не знаю полного ответа, но вы не должны использовать TextBox.Текстовые элементы непосредственно в вашем коде LINQ; особенно не один и тот же для разных полей. Посмотрите на значения, введенные пользователем, чтобы увидеть, являются ли они полными или частичными именами. А как насчет поиска всех, чье имя начинается с "Смит", например?

1 Ответов

Рейтинг:
12

OriginalGriff

Вместо поиска используйте фильтрацию исходных данных. Это достаточно легко сделать:

private BindingSource displaySource = new BindingSource();
private void frmMain_Shown(object sender, EventArgs e)
    {
    DataTable dt = new DataTable();
    using (SqlConnection con = new SqlConnection(@"Data Source=GRIFF-DESKTOP\SQLEXPRESS;Initial Catalog=MyVideos;Integrated Security=True"))
        {
        con.Open();
        using (SqlDataAdapter da =  new SqlDataAdapter("SELECT Id, Title FROM Videos", con))
            {
            da.Fill(dt);
            }
        }
    MyListBox.DisplayMember = "Title";
    MyListBox.ValueMember = "ID";
    displaySource.DataSource = dt.DefaultView;
    MyListBox.DataSource = displaySource;
    }
private void showOnlyThese_TextChanged(object sender, EventArgs e)
    {
    displaySource.Filter = $"Title LIKE '%{showOnlyThese.Text}%'";
    }
Это быстрее, и нагрузка более отзывчива для пользователя!


Member 14017552

Я не могу, я должен использовать
частная Search_Click недействительным(объект отправителя, EventArgs в электронной)

OriginalGriff

Затем переместите одну строку кода фильтра в обработчик щелчка...

Member 14017552

Да ладно тебе, парень, это так запутанно! кроме того, я уже вызываю таблицу из файла Access, зачем мне нужно это SQL-соединение? Я почти там, мне просто не хватает какого-то кода для поиска и фильтрации!

OriginalGriff

:вздыхать:
Разработка-это мышление и адаптация фрагмента кода в соответствии с вашими конкретными потребностями. Я использовал SQL server для тестирования и для того, чтобы показать, сколько кода на самом деле нужно - вы можете использовать и систему БД, которую хотите, все это работает одинаково.

BillWoodruff

+5 тот, кто это отрицал: позор тебе !