2012-06-18 2 views
0

Привет У меня есть данные, которые я хотел бы фильтровать с помощью одного текстового поля, нечувствительного к регистру. Другими словами, когда пользователь начинает вводить текстовое поле, я хотел бы, чтобы RowFilter отображал любые строки, которые СОДЕРЖИЛИ введенную информацию (опять же независимо от случая).фильтрация таблицы данных (многоколоночная)

Мой текущий код будет отображать только точные соответствия и только для одного столбца («ID»). Есть еще несколько столбцов, которые я хочу включить, т. Е. «Название», «Имя пользователя», «Компания» и т. Д.

Любые идеи?

private void searchTextBox_TextChanged(object sender, EventArgs e) 
{ 
    if (searchTextBox.Text.Trim() != "") 
    { 
     gridToTable.DefaultView.RowFilter = "ID = " + searchTextBox.Text; 
    } 
    else 
    { 
     gridToTable.DefaultView.RowFilter = string.Empty; 

    } 

} 
+0

Вы можете использовать LINQ to DataTable для замены RowFilter - он гораздо более универсален и позволяет создавать собственные пользовательские фильтры. См. Пример на http://codecorner.galanter.net/2012/03/06/replace-datatable-rowfilter-with-linq/ –

ответ

2

Вы можете использовать LIKE в RowFilter и CONCAT все flters с OR.

var rowFilter = string.Format(
     "ID LIKE '%{0}%' OR TITLE LIKE '%{1}%' OR Company LIKE '%{2}%' OR UserName LIKE '%{3}%'" 
     , txtSearchID.Text 
     , txtSearchTitle.Text 
     , txtSearchCompany.Text 
     , txtSearchUserName.Text 
    ); 
gridToTable.DefaultView.RowFilter = rowFilter; 

DataColumn.Expression Property (тот же синтаксис для DataView.RowFilter)

Но если честно, я бы предложил использовать вместо LINQ-to-DataSet, так как это гораздо более мощным.

Например:

DataTable tblFiltered = gridToTable.AsEnumerable() 
         .Where(r => r.Field<int>("ID").ToString().Contains(txtSearchID.Text) 
           || r.Field<string>("TITLE").Contains(txtSearchTitle.Text) 
           || r.Field<string>("Company").Contains(txtSearchCompany.Text) 
           || r.Field<string>("UserName").Contains(txtSearchUserName.Text)) 
         .CopyToDataTable(); 
+0

99% там ... ему не нравится столбец «Имя пользователя» с пространством в этом. к сожалению, там много имен, чтобы вернуться к переименованию целиком. какие-либо предложения? 'Первое случайное исключение типа« System.Data.SyntaxErrorException »произошло в System.Data.dll Синтаксическая ошибка: Отсутствует операнд после оператора 'name'. – ikathegreat

+0

@ikathegreat: тогда вам нужно заключить его в скобки:' [Имя пользователя] '. –

+0

абсолютно потрясающий. работает, как я хотел. Благодарю. – ikathegreat

-1

Сетка обеспечивает три дополнительных методов фильтрации данных. Row.Filtered - самый простой способ отображения или скрытия данных. Однако он не поддерживает модель данных с четным управлением и, следовательно, не подходит для более сложных приложений. С помощью этого метода программист должен контролировать видимость строк вручную и учитывать, что данные могут быть отсортированы или сгруппированы и могут иметь сложную иерархическую структуру.

Интерфейс IFilter - самый эффективный и удобный метод фильтрации. Программисту необходимо наследовать интерфейс IFilter и реализовать метод IsFiltered. Этот метод использует строку как аргумент, для которого сетка определяет, требуется ли фильтрация.

Графические фильтры в столбцах. Эта функция позволяет программисту реализовать любой графический фильтр, который может использоваться для интерактивной фильтрации данных. Любой графический элемент управления, размещенный в раскрывающемся списке, может использоваться как фильтр. Реализация такого фильтра основана на знакомом UITypeEditor, который может предоставить любому пользовательскому элементу более подробную информацию, которую вы можете посетить dapfor. com

Смежные вопросы