我正在做一个实验性的treeview,其中每个treeview项可以表示一个条件,也可以表示一个带有运算符的分支。这将被解析为sql。
例如,树可以有一个带有“AND”或“or”运算符的分支,其子级将成为条件这用于生成SQL语句的WHERE
段,例如((Name = 'Matt' AND AGE > 20) OR (Name = 'John' AND Age = 15)) AND Job = 'Student'
。
我该怎么着手建造呢?到目前为止,我所做的是考虑将string,list<Condition>
对放在Tuple<>
中,其中字符串表示分支运算符(和/或),列表表示该分支中包含的条件。
但是,由于每个分支可以被拆分为多个运算符分支或条件,因此它可以非常迅速地变得非常复杂
最佳答案
您可以使用递归函数从顶部解析treeview
,因此treeview的每个根注释都是一个sql语句:
例如。:
功能代码:
_
string getHead(TreeViewItem t)
{
string s = "";
if (t.Items.Count == 0) //get the condition
{
return s=t.Header.ToString(); //change this to your real getCondition function.
}
else
{
for (int i = 0; i < t.Items.Count; i++ )
{
if(t.Items[i] is TreeViewItem) //Edit: only use treeviewitems not the button...
{
if (i == 0) // first note doesn't need the operator
{
s += getHead(t.Items[0] as TreeViewItem);
}
else // only needs operator in between
{
s += (string.IsNullOrEmpty(getHead(t.Items[i] as TreeViewItem).Trim()) ? "" : (" " + t.Header + " " + getHead(t.Items[i] as TreeViewItem))); // only get real treeviewitem, not the one with two buttons and an empty header; change t.Header to your real getOperator function.
}
}
}
return string.Format("({0})",s); //group sub conditions
}
}
用法:
MessageBox.Show(getHead((treeView1.Items[0] as TreeViewItem)));
结果:
关于c# - 如何遍历具有多个分支的树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13911450/