Converting ActiveX ListView Control to DotNet ListView Control

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
)

See Also