private void ConstructQuery(BaseNode node, int x, ref int y) { const int Horz = 100; const int Vert = 25; int index = 0; var label = new Label() { Text = node.Property?.Name, Left = x * Horz, Top = y * Vert, Width = 100, Height = 25 }; var button = new Button() { Text = mSigns[index], Left = x * Horz + label.Width, Top = y * Vert, Width = 35, Height = 25 }; var text = new TextBox() { Left = x * Horz + label.Width + button.Width, Top = y * Vert, Width = 100, Height = 25 }; button.Click += (object sender, EventArgs e) => { var self = sender as Button; index = (++index) % mSigns.Length; self.Text = mSigns[index]; node.ComparisonOperator = BooleanOperator.FromString( self.Text ); }; text.TextChanged += (object sender, EventArgs e) => { var self = sender as TextBox; node.Criterium = self.Text; }; QueryFlowLayout.Controls.Add(label); QueryFlowLayout.Controls.Add(button); QueryFlowLayout.Controls.Add(text); foreach (var kv in node.Nodes) { ++y; ConstructQuery(kv.Value, x + 1, ref y); } }