C# DataView筛选器未找到匹配项

C# DataView筛选器未找到匹配项,c#,filter,dataview,C#,Filter,Dataview,我正在根据树视图中的标记值选择DataView行。它在大多数情况下工作正常,但在某些条件下不会返回记录。在调用过滤器之前,我编写了下面的代码来测试每一行 private void TreeView1_AfterSelect(object sender, TreeViewEventArgs e) { if (treeView1.SelectedNode != null) { TreeNode tn = tree

我正在根据树视图中的标记值选择DataView行。它在大多数情况下工作正常,但在某些条件下不会返回记录。在调用过滤器之前,我编写了下面的代码来测试每一行

        private void TreeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
        if (treeView1.SelectedNode != null)
        {
            TreeNode tn = treeView1.SelectedNode;
            Console.WriteLine(tn.Tag.ToString());
            selectedTag = tn.Tag.ToString();

            dv.Table = ds.Tables["ProductStruct"];
            foreach (DataRow dr in dv.Table.Rows)
            {
                bool test = dr["uniqueID"].ToString() == tn.Tag.ToString();
                Console.WriteLine(dr["uniqueID"].ToString() + " and " + tn.Tag.ToString() + test);
            }
            dv.RowFilter = "uniqueID = '" + tn.Tag.ToString() + "'";
            Console.WriteLine(dv.RowFilter.ToString());
            Console.WriteLine(dv.Count.ToString());
        }
    }
结果如下:

12331233-200-00e
12331233 and 12331233-200-00eFalse
12331233-100-000 and 12331233-200-00eFalse
12331233-200-00e and 12331233-200-00eTrue
12331233-300-000 and 12331233-200-00eFalse
12331233-400-000 and 12331233-200-00eFalse
12331233-500-000 and 12331233-200-00eFalse
12331233-600-000 and 12331233-200-00eFalse
12331233-700-000 and 12331233-200-00eFalse
12331233-800-000 and 12331233-200-00eFalse
12331233-900-000 and 12331233-200-00eFalse
uniqueID = '12331233-200-00e'
0

正如您所看到的,bool测试对一条记录是真的,但是过滤器无法返回它。非常感谢您的帮助,我不喜欢使用一行就可以完成的循环…

您运行的循环会覆盖布尔值,循环次数与表中存在的行数相同

在循环内部,找到匹配项后使用return进行转义。它不会穿过所有的行。这将只返回1个值

foreach (DataRow dr in dv.Table.Rows)
        {
            bool test = dr["uniqueID"].ToString() == tn.Tag.ToString();               

           if(dr["uniqueID"].ToString() == tn.Tag.ToString()){
              Console.WriteLine(dr["uniqueID"].ToString() + " and " + tn.Tag.ToString() + test);
               dv.RowFilter = "uniqueID = '" + tn.Tag.ToString() + "'";
               return;
           }
        }
如果需要更多匹配项,请移动

dv.RowFilter = "uniqueID = '" + tn.Tag.ToString() + "'";
在循环内部,并用if语句封装它

foreach (DataRow dr in dv.Table.Rows)
            {
                bool test = dr["uniqueID"].ToString() == tn.Tag.ToString();
                Console.WriteLine(dr["uniqueID"].ToString() + " and " + tn.Tag.ToString() + test);

               if(dr["uniqueID"].ToString() == tn.Tag.ToString()){
                dv.RowFilter = "uniqueID = '" + tn.Tag.ToString() + "'";
               }
            }
这将在每次找到匹配项时运行筛选器


我希望这会有所帮助。

我希望过滤器选择单个记录,但它不是。bool“test”只是为了向自己证明,filter需要获取一个记录……只要添加return,一旦找到需要的内容,就可以退出循环。