DataView筛选器找不到匹配项

时间:2018-06-28 17:37:05

标签: c# filter dataview

我要根据树视图中的Tag值选择一个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

如您所见,布尔测试对于一条记录是正确的,但过滤器无法返回它。非常感谢您的帮助,我讨厌使用循环,而单行应该可以解决问题……

1 个答案:

答案 0 :(得分: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() + "'";
               }
            }

这将在每次找到匹配项时运行过滤器。

我希望这会有所帮助。