Проблема с несколькими критериями в bindingsource.filter

#c# #filter #bindingsource

#c# #Фильтр #bindingsource

Вопрос:

Я пытаюсь отфильтровать источник привязки на основе 2 списков со списком. У меня один из списков со списком фильтруется просто отлично. Второй ставит меня в тупик, поскольку он использует первый combobox, а затем второй на основе инструкции switch:

     private void comboBox2_SelectedIndexChanged(object sender,
    System.EventArgs e)
    {
        string sItem;
        sItem = comboBox2.SelectedItem.ToString();

        switch (sItem)
        {
            case "Banks":
                propertyInformationBindingSource.Filter = ("ClientKey ='"   comboBox1.SelectedValue   "'" And "Search = -1");
                break;
            case "Exam":
                propertyInformationBindingSource.Filter = ("ClientKey ='"   comboBox1.SelectedValue   "'") And ("Exam = -1");
                break;
            case "Search Finished":
                propertyInformationBindingSource.Filter = ("ClientKey ='"   comboBox1.SelectedValue   "'") And ("Finished = -1;
                break;
            case "All":
                propertyInformationBindingSource.Filter = "ClientKey ='"   comboBox1.SelectedValue   "'";
                break;


        }
    }
  

У меня возникли проблемы со значением после И, в котором он утверждает, что оно неверно. Любая помощь была бы отличной.

Спасибо

Ответ №1:

Я думаю, что были некоторые проблемы с конкатенацией строк, и вы пропустили закрывающую скобку вокруг Finisher = -1 .

Попробуйте

  switch (sItem)
        {
            case "Banks":
                propertyInformationBindingSource.Filter = ("ClientKey ='"   comboBox1.SelectedValue   "' And Search = -1");
                break;
            case "Exam":
                propertyInformationBindingSource.Filter = ("ClientKey ='"   comboBox1.SelectedValue   "' And Exam = -1");
                break;
            case "Search Finished":
                propertyInformationBindingSource.Filter = ("ClientKey ='"   comboBox1.SelectedValue   "' And Finished = -1");
                break;
            case "All":
                propertyInformationBindingSource.Filter = "ClientKey ='"   comboBox1.SelectedValue   "'";
                break;


        }
  

Обратите внимание, что если у вас происходит слишком много конкатенации строк, лучше всего использовать string.Format() . Это улучшает читаемость и более эффективно, чем конкатенация. В качестве примера, ваш первый случай будет выглядеть следующим образом

 propertyInformationBindingSource.Filter = 
      string.Format("ClientKey ='{0}' And Search = -1", comboBox1.SelectedValue);
  

Комментарии:

1. @Balar синтаксис кажется правильным, но я все еще не получаю желаемых результатов. При использовании combobox2 он всегда возвращается без записей.

2. @Korrowan если вы поставите точку останова в конце блока переключения, как propertyInformationBindingSource.Filter будет выглядеть?

3. @Bala R для случая «Банки» это «ClientKey =’3′ И Search = -1»

4. Каков тип данных ClientKey? если это не строка, возможно, вы можете пропустить одинарные кавычки. В остальном выражение Filter выглядит для меня хорошо.

5. @Balar Я убрал одинарные кавычки. Кажется, это работает ТОЛЬКО для банков … все остальное игнорируется.