【问题标题】:Filtering DataGridView with two textboxes使用两个文本框过滤 DataGridView
【发布时间】:2014-03-20 10:35:08
【问题描述】:

我有一个使用数据源和表适配器创建的 DGV。在表适配器中,我定义了两个参数来进行搜索。那么我有一个带有数据网格视图和两个文本框的 WPF,我将使用它们来进行搜索。

 public partial class FormConsultaAdvogadosDS : Form
{
  public FormConsultaAdvogadosDS()
    {
        InitializeComponent();
    }

    private void FormConsultaAdvogadosDS_Load(object sender, EventArgs e)
    {
        // TODO: This line of code loads data into the 'dataSetAdvogados.Advogado' table. You can move, or remove it, as needed.
        this.advogadoTableAdapter.Fill(this.dataSetAdvogados.Advogado);

    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        try
        {
            this.advogadoTableAdapter.FillBy(this.dataSetAdvogados.Advogado, textBox1.Text);
        }
        catch (System.Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
        }
    }

    private void textBox2_TextChanged(object sender, EventArgs e)
    {
        try
        {
            this.advogadoTableAdapter.FillBy1(this.dataSetAdvogados.Advogado, textBox2.Text);
        }
        catch (System.Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
        }
    }
}

这是我现在拥有的代码。 当我只使用其中一个文本框进行过滤时,一切正常,过滤一切正常。但我真正需要的是第一次过滤中的过滤器。就像第一次过滤的依赖一样。 如果我在 textbox1 中插入文本“ABC”,则显示的行有“ABC”,然后,使用第一个过滤器,我需要细化在 textbox2 中插入“DEF”,但它不起作用。它会忽略第一次过滤进行新搜索。有人能帮我吗? 问候

【问题讨论】:

    标签: c# wpf datagridview


    【解决方案1】:

    当您过滤一个集合时,您通常需要管理两个集合。一个是包含所有可用值/项目的原始未过滤集合,另一个是仅包含与过滤条件匹配的项目的过滤集合。

    在您有两个过滤器的情况下,您需要管理三个集合。一个是原始的、未过滤的集合,第二个是第一个过滤的集合,它只包含符合第一个过滤条件的项目,第三个是第二个过滤的集合,它只包含符合第二个条件的项目。

    所以如果不清楚,这里有一个例子。我们有这样一种情况,用户输入ABC,第二个集合返回原始(完整)集合中与搜索string匹配的所有项目。现在这是重要的部分。我们需要过滤已经被ABC string 过滤的second 集合,而不是再次使用第二个过滤器过滤原始集合。

    第三个集合是数据绑定到 UI 的集合,只会显示原始集合中满足 both 过滤条件的项目。


    更新 >>>

    再举一个例子,您可以使用LinQ 过滤您的第二个集合(已被第一个条件过滤):

    ThirdCollection = new ObservableCollection<string>(SecondCollection.Where(i => 
        SecondFilterConditionMethod(i)));
    

    现在这个SecondFilterConditionMethod 方法可以包含任何类型的条件,只要它返回truefalse

    private bool SecondFilterConditionMethod(string item)
    {
        // implement whatever filter condition here
        return item.StartsWith("A");
    }
    

    现在您可能没有使用strings,但无论您使用哪种数据类型,想法都是一样的。另请查看我在 Stack Overflow 上对Change combo box item list depending on the Textbox Text 问题的回答,以获取更多示例。

    【讨论】:

    • 好的,我明白你的解释了。但是,我真的不知道如何管理收藏!我使用的方法包括创建数据集,然后在表适配器中定义参数。我将 Fill、FillBy 和 FillBy1 视为集合。如您所说,过滤第一个就可以了。但我不知道如何获得最后一个过滤(FILLBY“ABC”)以在其上方进行另一个过滤(FILLBY1(FILLBY)“DEF”)。这真的是我的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2019-05-25
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多