3

私は実験的な TreeView に取り組んでおり、各 TreeViewItem は条件、または演算子を持つ分岐を表すことができます。これは、SQL に解析されます。

たとえば、ツリーに「AND」演算子または「OR」演算子を含む分岐があり、その子が条件になります。WHEREこれは、たとえば、SQL ステートメントのセグメントを生成できるようにするために使用されます((Name = 'Matt' AND AGE > 20) OR (Name = 'John' AND Age = 15)) AND Job = 'Student'

どうすればそれを構築できますか?ここstring,list<Condition>Tuple<>、文字列は分岐演算子 (AND/OR) を表し、リストはその分岐に含まれる条件を表します。

ただし、各ブランチは多数の演算子ブランチまたは条件に分割できるため、非常に複雑になる可能性があります。

4

2 に答える 2

2

再帰関数を使用しtreeviewて先頭から解析できるため、ツリービューの各ルート ノートは 1 つの 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)));

結果:

ここに画像の説明を入力

于 2012-12-17T13:49:45.227 に答える
0

ツリー ビューで、最後の AND と OR が入れ替わっていませんか? そのビューでは、以下で指定したのと同じ解析済み文字列に到達できません。

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

最後の AND は、別の OR 条件と 1 つのステートメントを AND 演算します。

これが役立つかどうかはわかりませんが、bison はこのようなボトムアップ解析用の C コードを生成します。試してみることができます。

e: conditional statement|
   e AND e|
   e OR e
;
于 2012-12-17T09:50:48.303 に答える