Как фильтровать DataView на основе нескольких входных данных

Я знаю, как фильтровать данные на основе ввода пользователя из одного текстового поля:

FilterDataView.RowFilter = txtFilter.Text;

Но как бы вы отфильтровали данные на основе ввода нескольких пользователей из нескольких полей. В основном фильтр будет действовать как функция «поиска».


person HelloWorld    schedule 30.03.2011    source источник
comment
Вы имеете в виду, что пользователь, например, может ввести ключевое слово, выбрать вариант из раскрывающегося списка и выбрать диапазон дат?   -  person The Muffin Man    schedule 30.03.2011
comment
Нет. Есть 4 текстовых поля, и если пользователь заполнит их все и нажмет фильтр, он найдет конкретную запись, но если он введет только одно из текстовых полей, он получит больше результатов. Например, если он вводит имя, фамилию, город, профессию, он найдет одного человека, но если пользователь вводит только город, то пользователь получает только записи, чьи люди живут в этом городе.   -  person HelloWorld    schedule 30.03.2011
comment
Привязано ли представление данных к запросу, к которому можно применить последовательные предложения Where? Это было бы легко в Linq. Если это работает для вас, дайте мне знать, и я могу привести пример.   -  person nycdan    schedule 30.03.2011
comment
LINQ было бы достаточно, но я никогда не использовал LINQ. DataSource DataView привязан к одной таблице с парой записей.   -  person HelloWorld    schedule 30.03.2011
comment
Я не уверен, как это сделать с источником данных. Как сказал nycdan, если вы используете LINQ, это будет торт.   -  person The Muffin Man    schedule 30.03.2011


Ответы (3)


Вы можете использовать что-то вроде легкого t-sql при определении RowFilter.

Одна идея:

FilterDataView.RowFilter = "name like '%habjan%' and city like '%new york%'"

Здесь вы можете найти хорошую статью о синтаксисе RowFilter: DataView RowFilter Syntax< /а>

Для того, что вам нужно, вам нужно будет создать фильтр строк на основе введенных полей.

    StringBuilder sb = new StringBuilder();

    if (tb1.Text.Length > 0)
    {
       sb.Append("name like '%" + tb1.Text + "%'");
    }

    if (tb2.Text.Length > 0)
    {
       if(sb.Length > 0)
       {
           sb.Append(" and ");
       }

       sb.Append("city like '%" + tb2.Text + "%'");
    }
    //.... and so on...

    FilterDataView.RowFilter = sb.ToString();
person HABJAN    schedule 30.03.2011
comment
Интересно, но синтаксических ошибок мало. Второй % имеет неправильные кавычки слева. Также, когда я использую этот метод, программа выдает ошибку, указывающую на FilterDataView.RowFilter = sb.ToString(); говоря, что столбец tb1.text не может быть найден. Но разве это не текстовое поле? - person HelloWorld; 30.03.2011
comment
@HelloWorld: Извините, я не использовал редактор кода для написания этого кода, я написал его прямо здесь. - person HABJAN; 30.03.2011
comment
@HelloWorld: я исправил проблему с кавычками. - person HABJAN; 30.03.2011
comment
Оно работает! Но одно из моих текстовых полей принимает только числа (на самом деле оно проверяет ввод через int.TryParse()), и когда я пытаюсь выполнить фильтр: Не удается выполнить операцию «Нравится» для System.Int32 и System.String - person HelloWorld; 30.03.2011
comment
для числового значения вы можете написать что-то вроде этого: город типа «%xxx%» и возраст = 32 - person HABJAN; 30.03.2011
comment
Да, но число исходит из текстового поля, поэтому жесткое кодирование значения в sql не сработает. Этот номер соответствует имени столбца BookCode в моей таблице. - person HelloWorld; 30.03.2011
comment
sb.Append(возраст= + tb3.Text); - person HABJAN; 30.03.2011

Найдите в MSDN (LINQ to DataSet) http://msdn.microsoft.com/en-us/library/bb669073.aspx

person Michael27    schedule 30.03.2011

Хорошо, Linq to SQL станет вашим другом.

Вам нужно изучить синтаксис, и есть несколько разных форм, но вы можете воссоздать свой запрос следующим образом:

var x = from T in db.Table
        where [usual where stuff goes here];

Затем вы можете протестировать каждое текстовое поле и сделать следующее:

if (TextBox1.Text != null) x.Where(w => w.field1 == val1);

Приятно то, что вы можете накладывать предложения Where по одному. Затем просто привяжите свой объект к var.

[objectname].Datasource = x; 
[objectname].Databind();

Это должно решить вашу проблему.

person nycdan    schedule 30.03.2011
comment
Хорошо, я постараюсь заставить это работать. Будет ли он обновлять DataGridView? - person HelloWorld; 30.03.2011
comment
не уверен, что вы все еще хотите делать это таким образом, но стоит попробовать для гибкости. Да, когда вы выполняете .Databind(), он обновляет представление данных. - person nycdan; 30.03.2011