Фильтр DataView не находит соответствия - PullRequest
0 голосов
/ 28 июня 2018

Я выбираю строку 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 верен для одной записи, но фильтр не может его вернуть. Любая помощь приветствуется, я ненавижу использовать цикл, где единственная строка должна делать свое дело ...

1 Ответ

0 голосов
/ 28 июня 2018

Цикл, который вы запускаете, переопределяет значение 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() + "'";
               }
            }

Это будет запускать фильтр каждый раз, когда он находит совпадение.

Надеюсь, это поможет.

...