Цикл, который вы запускаете, переопределяет значение 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() + "'";
}
}
Это будет запускать фильтр каждый раз, когда он находит совпадение.
Надеюсь, это поможет.