C# 使用多列过滤数据视图

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1137020/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 09:06:05  来源:igfitidea点击:

Filtering DataView with multiple columns

c#asp.netado.netasp.net-2.0

提问by

In my application I am using a dataview for having the filters to be applied where the filter options are passed dynamically.if there are 2 filter parameters then the dataview should be filtered for parameter1 and then by parameter two. I am using a method which is called in a for loop where I am setting the count to the total no.of parameters selected using a listbox but the filtering is done only for the last parameter. Here is my code:

在我的应用程序中,我使用数据视图来应用过滤器,其中过滤器选项是动态传递的。如果有 2 个过滤器参数,则应针对参数 1 和参数 2 过滤数据视图。我正在使用一种在 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;
}

Please provide a suitable solution .

请提供合适的解决方案。

Thanks in advance...

提前致谢...

回答by Canavar

You should apply your filter altogether, not one by one :

你应该完全应用你的过滤器,而不是一个一个:

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

So you can change your code as :

因此,您可以将代码更改为:

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;

回答by Tadas ?ukys

I think you should build a complete filter string and then set this filter to your DataView. For example:

我认为您应该构建一个完整的过滤器字符串,然后将此过滤器设置为您的 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();

回答by amit poddar

DataView dv = new DataView(dt);
string filterText = "some search criteria";
dv.RowFilter = "Column1 + Column2 + Column3 Like '%" + filterText  + "%'";

回答by Fd-ski

I had a similar problem - but i think solution will be the same for both of them. I have a datatable that needs to be filtered by 5 controls and if they aren't filled - it shouldn't be filtered.

我有一个类似的问题 - 但我认为他们两个的解决方案都是一样的。我有一个需要由 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 = ""; }