DataGridView поиск через textbox. С использованием BindingSource

174
23 сентября 2019, 05:30

Решил попробовать поиск по DataGridView, в котором данные хранятся в bindingsource

Для поиска использую textbox

    (dataGridView1.DataSource as DataTable).DefaultView.RowFilter 
= string.Format("ProjectName LIKE '{0}%' OR ProjectName LIKE '% {0}%'", textBox1.Text);

Однако получаю ошибки сразу после ввода первого же символа. Если это поместить в блок try-catch, то следующая ошибка.

Как можно правильно реализовать данный поиск?

P.S. Подключение к бд хранится в Settings.settings

Answer 1

Работаем через BindingSource так

public partial class FormView : Form
{
    //работа с БД
    private readonly IDataContext _dataContext = new TestDataContext();
    //источник привязки для DGV
    private readonly BindingSource _bsPeople = new BindingSource();
    //объект формирования выборок для DGV
    private readonly FilterDgv _filterDgv = new FilterDgv();
    public FormView()
    {
        InitializeComponent();
        //привязки
        SetBindings();
        //загрузка Людей
        LoadData();
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Text = "Пример фильтрации в DGV";
    }
    /// <summary>
    /// Установка привязок
    /// </summary>
    private void SetBindings()
    {
        //DGV
        _bsPeople.DataSource = typeof(List<Person>);
        _dataGridViewPeople.AutoGenerateColumns = false;
        _dataGridViewPeople.DataSource = _bsPeople;
        //текстбоксы для выборки
        var bFN = new Binding("Text", _filterDgv, nameof(FilterDgv.FirstName));
        bFN.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
        _textBoxFindFirstName.DataBindings
                             .Add(bFN);
        var bLN = new Binding("Text", _filterDgv, nameof(FilterDgv.LastName));
        bLN.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
        _textBoxFindLastName.DataBindings
                            .Add(bLN);
        var bAg = new Binding("Text", _filterDgv, nameof(FilterDgv.Age));
        bAg.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
        _textBoxFindAge.DataBindings
                       .Add(bAg);
    }
    /// <summary>
    /// Загрузка данных в DGV
    /// </summary>
    private void LoadData()
    {
        DataSet data = _dataContext.GetPeople();
        _bsPeople.DataSource = data.Tables[0];
        //подписка на событие изменение свойств у фильтрующего объекта
        _filterDgv.PropertyChanged += _filterDgv_PropertyChanged;
    }
    /// <summary>
    /// Обработчик события изменения свойств у фильтрующего объекта
    /// Формирование и применения фильтра к DGV через BindingSource
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void _filterDgv_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        var filters = new List<string>();
        //организуем список условий
        if (!String.IsNullOrEmpty(_filterDgv.FirstName))
        {
            filters.Add($"{nameof(Person.FirstName)} LIKE '{_filterDgv.FirstName}%'");
        }
        if (!String.IsNullOrEmpty(_filterDgv.LastName))
        {
            filters.Add($"{nameof(Person.LastName)} LIKE '{_filterDgv.LastName}%'");
        }
        if (_filterDgv.Age > 0)
        {
            filters.Add($"{nameof(Person.Age)} > {_filterDgv.Age}");
        }
        //удаляем предыдущий фильтр
        _bsPeople.RemoveFilter();
        //назначаем фильтрацию
        if (filters.Count == 1)
        {
            _bsPeople.Filter = filters.First();
        }
        else if (filters.Count > 1)
        {
            _bsPeople.Filter = String.Join(" AND ", filters);
        }
        else
        { }
    }
}

Весь код примера здесь

READ ALSO
Как отобразить страницу HTML со скриптами в CefSharp

Как отобразить страницу HTML со скриптами в CefSharp

использую CefSharp для отображения страницы HTML-документа, в котором содержится скрипт:

93
Помогите переписать код с C++ на C# [закрыт]

Помогите переписать код с C++ на C# [закрыт]

Шарпы ругаются на на эту строку

107
Создание графика WPF C# с Live Chart

Создание графика WPF C# с Live Chart

Использую Live ChartSeriesCollection передает LineSeries в котором Values = ChartValues

87
Unity: выпадающий список переменных в Inspector

Unity: выпадающий список переменных в Inspector

Делаю для игры перевод на разные языкиВ первом скрипте есть публичный класс с публичными переменными

158