Фильтрация DataView с несколькими столбцами

В моем приложении я использую представление данных для применения фильтров, где параметры фильтра передаются динамически. Если есть 2 параметра фильтра, то представление данных должно быть отфильтровано по параметру 1, а затем по параметру два. Я использую метод, который вызывается в цикле for, где я устанавливаю счетчик на общее количество параметров, выбранных с помощью списка, но фильтрация выполняется только для последнего параметра. Вот мой код:

string str = "";
for (int i = 0; i < listbox.Items.Count; i++)
{
    if (listbox.Items[i].Selected)
    {
        if (str != string.Empty)
        {
            str = str + "," + listbox.Items[i].Text;

        }
        else
        {
            str = str + listbox.Items[i].Text;
        }
    }
}

string[] items = str.Split(',');
for (int i = 0; i < items.Length; i++)
{
    ApplyFilter(items[i],dv);
}

private DataView ApplyFilter(string str,DataView newdv)
{
    newdv.RowFilter = "[" + str + "]=" + ddl.SelectedItem.ToString();

    return newdv;
}

Пожалуйста, предоставьте подходящее решение.

Заранее спасибо...


person Community    schedule 16.07.2009    source источник


Ответы (3)


Вы должны применять свой фильтр целиком, а не по одному:

newdv.RowFilter = "Column1 = " + value1 + " AND Column2 = " + value2;

Итак, вы можете изменить свой код как:

string[] items = str.Split(',');
string filter = string.Empty;
for (int i = 0; i < items.Length; i++)
{
    filter += items[i] + " = " + dropdown.SelectedValue;
    if (i != items.Length - 1)
    {
         filter += " AND ";
    }
}
newdv.RowFilter = filter;
person Canavar    schedule 16.07.2009
comment
но я не уверен, сколько параметров фильтра будет передано. как добавить столбцы в один и тот же фильтр строк - person ; 16.07.2009

Я думаю, вам следует создать полную строку фильтра, а затем установить этот фильтр в свой DataView. Например:


StringBuilder sb = new StringBuilder()
for (int i = 0; i < listbox.Items.Count; i++) {
  if (!listbox.Items[i].Selected) {
    continue;
  }

  if (sb.Length > 0) {
    sb.Append(" and ");
  }
  sb.AppendFormat("[{0}] = {1}", listbox.Items[i].Text, ddl.SelectedItem);
}

dv.RowFilter = sb.ToString();
person Tadas Šukys    schedule 16.07.2009

У меня была аналогичная проблема, но я думаю, что решение будет одинаковым для них обоих. У меня есть таблица данных, которую нужно отфильтровать по 5 элементам управления, и если они не заполнены, ее не следует фильтровать.

List<string> allParams = new List<string>();
//here add fields you want to filter and their impact on rowview in string form
if (tsPrzelewyTxtOpis.Text != ""){ allParams.Add("Opis like  '%" + tsPrzelewyTxtOpis.Text + "%'"); }
if(tsPrzelewyTxtPlatnik.Text != ""){ allParams.Add("Płacący like  '%" + tsPrzelewyTxtPlatnik.Text + "%'"); }
if(tsPrzelewyDropDownKonto.Text != "") { allParams.Add("Konto =  '" + tsPrzelewyDropDownKonto.Text + "'"); }
if (tsPrzelewyDropDownWaluta.Text != "") { allParams.Add("Waluta =  '" + tsPrzelewyDropDownWaluta.Text + "'"); }
if (tsPrzelewyDropDownStatus.Text != "") { allParams.Add("Status =  '" + tsPrzelewyDropDownStatus.Text + "'"); }

string finalFilter = string.Join(" and ", allParams);
if (finalFilter != "")
{ (dgvPrzelewy.DataSource as DataTable).DefaultView.RowFilter = "(" + finalFilter + ")"; }
else
{ (dgvPrzelewy.DataSource as DataTable).DefaultView.RowFilter = ""; }
person Fd-ski    schedule 03.12.2018