ListView Controls are probably the most widely used ActiveX controls in scripted 3ds Max tools. Converting such scripts to use DotNet ListView controls is a relatively straightforward process.
Let's take as the base for our conversion example the simple script available in the topic How To ... Develop a Selected Objects Inspector using ListView ActiveX Control - Part One
In the following script, you can compare the original ActiveX code which is now remarked and in green to the new commented DotNet code.
CONVERSION OF THE SCRIPT
``` macroScript SceneListView category:"DotNet" ( rollout listview_rollout "ListView Selected" ( /* ActiveX Version: fn initListView lv = ( lv.gridLines = true lv.View = #lvwReport lv.fullRowSelect = true layout_def = #("Object Name", "Object Class", "Verts", "Faces", "Material") for i in layout_def do ( column = lv.ColumnHeaders.add() column.text = I ) ) */
fn initListView lv = ( lv.gridLines = true --same as in ActiveX --The following controls the display of details. We use defaults: lv.View = (dotNetClass "System.Windows.Forms.View").Details lv.fullRowSelect = true --same as in ActiveX layout_def = #("Object Name", "Object Class", "Verts", "Faces", "Material") for i in layout_def do lv.Columns.add i 96 --add column with name and optional width ) /* ActiveX Version: fn fillInSpreadSheet lv = ( for o in selection do ( li = lv.ListItems.add() li.text = o.name sub_li = li.ListSubItems.add() sub_li.text = (classof o) as string sub_li = li.ListSubItems.add() sub_li.text = try((o.mesh.numverts) as string)catch("--") sub_li = li.ListSubItems.add() sub_li.text = try((o.mesh.numfaces) as string)catch("--") sub_li = li.ListSubItems.add() sub_li.text = (o.material) as string ) ) */
fn fillInSpreadSheet lv = ( theRange = #() --array to collect the list items for o in selection do ( --First we create a ListViewItem objectwith the object's name: li = dotNetObject "System.Windows.Forms.ListViewItem" o.name --Then we add all the sub-itemswith the desired string values: sub_li = li.SubItems.add ((classof o) as string) sub_li = li.SubItems.add (try((o.mesh.numverts) as string)catch("--")) sub_li = li.SubItems.add (try((o.mesh.numfaces) as string)catch("--")) sub_li = li.SubItems.add ((o.material) as string) append theRange li--we add the list item to the array ) lv.Items.AddRange theRange--when done, we populate the ListView ) /* ActiveX Version: activeXControl lv_objects "MSComctlLib.ListViewCtrl" width:490 height:190 align:#center */
dotNetControl lv_objects "System.Windows.Forms.ListView" width:490 height:190 align:#center on listview_rollout open do ( initListView lv_objects fillInSpreadSheet lv_objects ) ) try(destroyDialog listview_rollout)catch() createDialog listview_rollout 500 200 )
```