【问题标题】:Filtering DataView with multiple columns过滤具有多列的 DataView
【发布时间】:2009-07-16 11:46:28
【问题描述】:

在我的应用程序中,我使用数据视图在动态传递过滤器选项的情况下应用过滤器。如果有 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;
}

请提供合适的解决方案。

提前谢谢...

【问题讨论】:

    标签: c# asp.net ado.net asp.net-2.0


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 但我不确定将传递多少个过滤器参数。如何在同一行过滤器中添加列
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      DataView dv = new DataView(dt);
      string filterText = "some search criteria";
      dv.RowFilter = "Column1 + Column2 + Column3 Like '%" + filterText  + "%'";
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2021-10-07
          • 2011-05-18
          • 2018-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-11
          相关资源
          最近更新 更多