我要根据树视图中的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
如您所见,布尔测试对于一条记录是正确的,但过滤器无法返回它。非常感谢您的帮助,我讨厌使用循环,而单行应该可以解决问题……
答案 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() + "'";
}
}
这将在每次找到匹配项时运行过滤器。
我希望这会有所帮助。