2012-12-17 84 views
3

我工作的一個實驗性的TreeView,其中每個樹型視圖可以代表一個條件,或與運營商的一個分支樹。這將被解析成SQL。如何遍歷多個分支

例如,樹可以有一個分支與「AND」或「OR」運營商,他們的孩子則是條件。這用於能夠生成SQL語句的WHERE段,例如((Name = 'Matt' AND AGE > 20) OR (Name = 'John' AND Age = 15)) AND Job = 'Student'

我該如何去構建的?我到目前爲止所做的是考慮將string,list<Condition>對放在Tuple<>中,其中字符串表示分支運算符(AND/OR),並且該列表表示該分支中包含的條件。

然而,由於每個分支還可以再分割成許多運營商分公司或條件的,它可以變得非常複雜,很快

+0

你可能需要一個樹數據結構:http://stackoverflow.com/questions/66893/tree-data-structure-in-c- sharp – MBen

+0

「treeview」已經在那裏供您解析,或者您還需要構建'treeview'? – Bolu

+0

@Bolu TreeView已經在那裏供我解析 –

回答

2

可以使用遞歸函數來分析從頂部treeview,所以每根音樹視圖是一個SQL語句:

如:

enter image description here

功能代碼:

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))); 

結果:

enter image description here

+0

感謝您的回覆。不幸的是,在每個分支之後,我都有一個帶有按鈕的TreeViewItem。它如何跳過並仍然遞歸地工作? –

+0

@DotNET,更新,你需要添加'如果(t.Items [i]是TreeViewItem)' – Bolu

+0

嗨,我幾乎已經得到它的工作。出於某種原因,它始終在最後添加「AND」或「OR」。 所以我越來越像'(ID = 5,名稱=馬特和)' –

0

在你的樹視圖,是不是最後的AND和OR應該互換?我無法使用該視圖在下面指定的同一個分析字符串。

AND 
    AND 
     Job='Student' 
     Age > 20 
    AND 
     OR 
      Name='John' 
      Name='Matt' 
     Sex='Male' 

最後一個AND AND另一個OR條件和一個語句。

不知道這是否會有所幫助,但野牛生成C代碼自下而上分析這個樣子。你可以試試看。

e: conditional statement| 
    e AND e| 
    e OR e 
; 
+0

我提供的僅僅是一個例子。用戶可以根據自己的喜好修改樹木 –