AddRows for a DynamicLayout using a for loop and a list - Eto Forms

Hi i cant see this mentioned anywhere so i must be going about it wrong (except it nearly works).

so im trying to make an eto form dynamic layout that might change the amount of rows it has depeneding on, in this case, the number of layers in a file (but for now its just a list i created at the end of the script).

i can get each of the layers on their own seperate row, but i cant seem to get the controls to follow suit.
image

i feel like i either need to make the control variables a method in the class (which i tried to and failed at) or im going about this in completely the wrong way, considering this is my first ever Eto form i feel its the latter.

can anyone help?

import Rhino.UI
import Eto.Drawing as drawing
import Eto.Forms as forms

class Material_assigner(forms.Dialog[bool]):
    
    def __init__(self, material_names, layer_names):##setting up the eto form
        self.Title = "Material Assigner"
        self.Padding = drawing.Padding(10)
        self.Resizable = False
        
        
        self.checkbox = forms.CheckBox( Text = "Consider?") ##check boxes (always true to assume u want to calculate every layer
        self.checkbox.Checked = True
        
        self.dropdown = forms.ComboBox() ##dropdown menu you can edit
        self.dropdown.DataStore = material_names
        self.dropdown.SelectedIndex = 0
        
        self.DefaultButton = forms.Button(Text = 'OK')
        self.DefaultButton.Click += self.OnOKButtonClick
        self.AbortButton = forms.Button(Text = 'Cancel')
        self.AbortButton.Click += self.OnCloseButtonClick
        self.selectbutton = forms.Button(Text = "Select")
        
        ##want to add a "select" button so you dont need to use layers if u dont want to
        
        layout = forms.DynamicLayout()
        layout.Spacing = drawing.Size(5,5)
        for layer in layer_names:
            layout.AddRow(None)
            layout.AddRow(layer, self.checkbox, self.dropdown, self.selectbutton)#u can just chuck strings in layouts and it acts like a lable
            layout.AddRow(None)
        layout.AddRow(self.DefaultButton, self.AbortButton)
        
        self.Content = layout
        
    def OnOKButtonClick(self, sender, e):
        self.Close(True)
    
    
    def OnCloseButtonClick(self, sender, e):
        self.Close(False)
        

def test(materials, layers):
    test = Material_assigner(materials, layers);
    rhinowindow = test.ShowModal(Rhino.UI.RhinoEtoApp.MainWindow)
    
test(["material 1", "material 2"], ["layer 1", "layer 2", "layer 3"])

Thanks a bunch in advance, im pretty stuck

Hi Carlo, you need to create a list of each control:

self.checkboxes = []
for i in layer_names:
    checkbox = forms.CheckBox( Text = "Consider?")
    checkbox.Checked = True
    self.checkboxes.append(checkbox)

and then in the for layer:

for index,layer in enumerate(layer_names):
    layout.AddRow(layer,self.checkboxes[index],...)

you will need to do it for each of the controls.

Thank you so much Christopher!

image