display selection in dotnet listview when it's out of focus?


#1

is there a command for that or a workAround, I found the on lostfocus event but haven’t been able to show the selection without forcing the focus on the listview ( which breaks everything as you get always stuck in the listview unless you close the window)


#2
tv.HideSelection  = false;

useful dotnet reference


#3

thx but I already tried this command that in my initialisation function and didn’t help.

like :


	fn initLv theLv=
	(
		--Setup the forms view
		theLv.view=(dotNetClass "system.windows.forms.view").details
		theLv.FullRowSelect=true		--Set so full width of listView is selected and not just first column.
		theLv.GridLines=true			--Show lines between the items. 
		theLv.MultiSelect=true			--Allow for multiple selections. 
		theLV.hideSelection = false
	)

Just to make sure I tried using it with this script from paul neale but didn’t work either
As soon as I click outside of the listview I loose the “blue selection bar”


#4

it does work the colour is not the selection blue though and is tricky to spot against white try

--Destroy dialog if it already exists.
try(destroyDialog theRollout)catch()

--Create a rollout
rollout theRollout "The Rollout" width:300
(
	--Create the dotNet listview control
	dotNetControl lv "system.windows.forms.listView" height:200
	
	--Create a button for testing. 
	button testButton "Test"
	on testButton pressed do
	(
		clearListener()			--Clear the listener.
		format "Props
"			--Format a header so we know what we are looking at below. 
		showProperties lv		--Show the properties of the listView control.
		format "
Methods
"			--Format a header so we know what we are looking at below. 
		showMethods lv		--Show the properties of the listView control.
		format "
Events
"			--Format a header so we know what we are looking at below. 
		showEvents lv		--Show the properties of the listView control.
	)
	
	--Innitialize the listview control
	fn initLv theLv=
	(
		--Setup the forms view
		theLv.view=(dotNetClass "system.windows.forms.view").details
		theLv.BackColor = (dotNetClass "System.Drawing.Color").PaleTurquoise;
		theLv.FullRowSelect=true		--Set so full width of listView is selected and not just first column.
		theLv.GridLines=true			--Show lines between the items. 
		theLv.MultiSelect=true			--Allow for multiple selections. 
		theLv.HideSelection  =false			--Allow for multiple selections. 
	)
	
	--Add columns. 
	fn addColumns theLv columnsAr=
	(
		w=(theLv.width/columnsAr.count)-1		--Calculate the width of each column.
		for x in columnsAr do		--Loop through all the column names to be added. 
		(
			theLv.columns.add x w		--Add each new column to the listview control. 
		)
	)
	
	--Adds rows of data to the listView
	fn populateList theLv=
	(
		rows=#()		--Empty array to collect rows of data
		for x in objects do		--Loop through all the objects in the scene. 
		(
			li=dotNetObject "System.Windows.Forms.ListViewItem" x.name		--Create a listViewItem object and name it. 
			li.subitems.add ((classOf x) as string)		--Add data to the second column.
			li.subitems.add (((x.wireColor) as point3) as string)		--Add data to the third coumn
			
			append rows li		--Added the listViewItem to the rows array
		)
		theLv.items.addRange rows		--Add the array of rows to the listView control. 
	)
	
	on lv mouseDown arg do
	(
		clearListener()
		showProperties arg
		print "---"
		hit=(lv.HitTest (dotNetObject "System.Drawing.Point" arg.x arg.y))
		showProperties hit
		showProperties hit.item
		print hit.item.text
		showProperties hit.item.subItems
		print hit.item.subItems.count
		print hit.item.subItems.item[1].text
	)
	
	on theRollout open do
	(
		initLv lv
		addColumns lv #("Object","Class","Wire Color")
		populateList lv
	)
)

--Create a dialog and assign the rollout to it. 
createDialog theRollout

#5

dot net controls work with the system in-focus and out-focus color schemes.
the system defines colors of selected item backcolor for both focus situations. usually dot net controls don’t have built-in solutions to change this behavior.
there is a trick what i already showed on this forum. it’s the using of the system menu color as listview backcolor instead of default (or custom).

try(destroydialog ListViewTest)catch()
 rollout ListViewTest "" 
 ( 
 	dotNetControl lv "ListView" width:110 height:130 align:#center pos:[5,5]
 
 	on ListViewTest open do 
 	( 
 		-- Setup the listview
 		lv.View = lv.View.Details
 		lv.HideSelection = off
 		lv.FullRowSelect = on  
 		lv.BackColor = (dotnetclass "System.Drawing.SystemColors").Menu
 		lv.Columns.Add "Items" 100
 		
 		-- Add items to listview
 		for k=1 to 5 do lv.Items.Add ("Item." + k as string)
 	)
 )
 createDialog ListViewTest 120 140

a disadvantage of this solution is you can’t use the backcolor you want.


#6

worked like a charm thanks for both answer :slight_smile:


#7

this also works. and you can change background color too :wink:

fn markItem itm = (
	
	local hc = (dotnetClass "System.Windows.SystemColors").HighlightColor
	itm.BackColor = (dotNetClass "drawing.color").fromArgb hc.r hc.g hc.b
)

fn unmarkItem itm = (
	
	local cc = my_item_color
	itm.BackColor = (dotNetClass "drawing.color").fromArgb cc.r cc.g cc.b
)

on lbx GotFocus args  do  ( unmarkItem  lbx.SelectedItems.item[0] )
on lbx LostFocus args do ( markItem  lbx.SelectedItems.item[0] )