PDA

View Full Version : DotNet Drag&Drop / ListView --> TreeView


MerlinEl
11-18-2009, 11:41 AM
Hi

As an example:

TreeView contains items : #(dir_name1, dir_name2)
Property:
text = directory name
tag = directory path

ListView contains items : #(file_name1, file_name2, file_name3, file_name4)
Property:
text = filename
tag = filepath


--first Im using this code in ListView to drag the file from listView in to treeView

fn dragStart arg =
(
if listView.SelectedItems.Count == 0 do return false
current_list_item = listView.SelectedItems.Item[ 0 ] --get first item from selection
local intnum = dotnetobject "System.Int32" 0
local filenamestring= dotnetobject "System.string" current_list_item.tag
local dropfile = dotnetobject "System.String[]" 1
dropfile.setvalue filenamestring intnum
local DataObj = dotnetobject "DataObject" ((dotnetclass "DataFormats").filedrop) dropfile
listView.dodragdrop Dataobj ((dotnetclass "DragDropEffects").Copy)
)


--second Im detect hited node in TreeView and collect file data

on treeView DragOver send arg do
(
local mouseDPos = send.PointToClient send.MousePosition
local node = send.GetNodeAt mouseDPos.x mouseDPos.y
if node != undefined do send.SelectedNode =node
drag_file_data = arg.data -- Assing files collection in to Global Var

)

--thrid Im triyng here to move this file in hited dir
on treeView DragLeave send arg do
(
local mouseDPos = send.PointToClient send.MousePosition
local node = send.GetNodeAt mouseDPos.x mouseDPos.y
if node != undefined and drag_file_data != undefined do
(
local dl = drag_file_data.GetFileDropList() -- get file paths array
print dl.Item[0] --get first file path
--how to move the file in this dir?
--evry time when I do this operation .. the file is droped in to max iterface
--passed tough my dialog why?
)
)



I don’t know if is clear what I’m trying to do , if somebody understand I will be grateful for your suggestion.

denisT
11-18-2009, 05:24 PM
use this snippet at your own risk:

try(destroyDialog lvtv_rollout)catch()
rollout lvtv_rollout "ListView - TreeView by denisT"
(
fn vc c = (dotNetClass "System.Drawing.Color").fromARGB c.r c.g c.b

dotNetControl lv "ListView" width:200 height:200 pos:[4,4]
dotNetControl tv "TreeView" width:200 height:200 pos:[208,4]
local drag_effect = dotNetclass "System.Windows.Forms.DragDropEffects"
local tree_node = dotNetClass "System.Windows.Forms.TreeNode"
local list_node = dotNetClass "System.Windows.Forms.ListViewItem"
on lv dragOver s a do
(
a.effect = if a.data.GetDataPresent tree_node then
(
node = a.data.GetData tree_node
if node.treeview.equals tv then drag_effect.move else drag_effect.none
)
else drag_effect.none
)
on tv dragOver s a do
(
a.effect = if a.data.GetDataPresent list_node then
(
item = a.data.GetData list_node
if item.listview.equals lv then drag_effect.move else drag_effect.none
)
else drag_effect.none
)
on lv ItemDrag a do tv.DoDragDrop a.item drag_effect.move
on tv ItemDrag a do lv.DoDragDrop a.item drag_effect.move

on lv DragDrop s a do
(
node = a.data.GetData tree_node
p = lv.PointToClient (dotNetObject "System.Drawing.Point" a.x a.y)
if (item = lv.GetItemAt p.x p.y) != undefined do
(
item.text = node.text
)
)
on tv DragDrop s a do
(
item = a.data.GetData list_node
p = tv.PointToClient (dotNetObject "System.Drawing.Point" a.x a.y)
if (node = tv.GetNodeAt p.x p.y) != undefined do
(
node.text = item.text
)
)

on lvtv_rollout open do
(
lv.BeginUpdate()
tv.BeginUpdate()
lv.allowDrop = on
lv.view = lv.view.Details
lv.HideSelection = off
lv.HeaderStyle = lv.HeaderStyle.None
lv.Columns.add "" 180
lv.backcolor = vc (color 230 230 200)

i = dotnetobject "ListViewItem" ""
i.backcolor = lv.backcolor
seed 0
items = for k=1 to 10 collect
(
item = i.clone()
item.text = bit.intashex (random -1e9 1e9)
item
)
lv.items.addrange items
tv.AllowDrop = on
tv.ItemHeight = 14
tv.HideSelection = off
tv.backcolor = vc (color 200 230 230)
i = dotnetobject "TreeNode" ""
items = for k=1 to 10 collect
(
item = i.clone()
item.text = bit.intashex (random -1e9 1e9)
item
)
tv.nodes.addrange items
lv.EndUpdate()
lv.Refresh()
tv.EndUpdate()
tv.Refresh()
ok
)
)
createDialog lvtv_rollout 412 230

MerlinEl
11-19-2009, 08:23 AM
Thanks for you help! It worked perfectly :thumbsup::D

Have a nice Day Denis

CGTalk Moderation
11-19-2009, 08:23 AM
This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.