treeview 跨窗体拖拽功能的实现(一)

功能实现:

1.从工具窗体往任务窗体拖拽;

2.在任务窗体中改变节点的顺序;

3.右键复制节点,删除节点

工具窗体treeview1,:

涉及使用的事件:DragEnter,  DragOver ,ItemDrag, NodeMouseDoubleClick,

任务窗口treeview2:

使用的事件:DragEnter,DragOver,ItemDrag,DragDrop

DragEnter与treeview1一样;

DragOver与treeview2一样;

ItemDrag  与treeview1一样,tree_ItemDrag(treeview2, e, 120, -30);然后刷新树形控件,进行Refresh()

最关键的是任务窗口(目标窗体)的DragDrop

 private void treeView2_DragDrop(object sender, DragEventArgs e)
        {
            //ClsMain.tree_DragDrop(sender, e);

            //获得拖放中的节点
            TreeNode moveNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));// // e.Data.GetData("System.Windows.Forms.TreeNode");


            //根据鼠标坐标确定要移动到的目标节点
                    Point pt;
                    TreeNode targeNode;
                    pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
                    targeNode = this.treeView2.GetNodeAt(pt);
                    TreeNode NewMoveNode = new TreeNode(moveNode.Text);
                    if (targeNode != null)//如果目标节点未选中,则添加到一级节点
                        {
                            targeNode.Nodes.Add(NewMoveNode);
                            //更新当前拖动的节点选择
                  treeView2.SelectedNode = NewMoveNode;
                 //展开目标节点,便于显示拖放效果
                   targeNode.Expand();
                   treeView2.Refresh();
             }
         else
             {
                 this.treeView2.Nodes.Add(NewMoveNode);
                 //更新当前拖动的节点选择
                 treeView2.SelectedNode = NewMoveNode;
                 //展开目标节点,便于显示拖放效果
                  treeView2.ExpandAll();
                 treeView2.Refresh();
             }
        }

1.comctl32.dll文件存储在电脑中“C:/Windows/System32”文件夹下

2.DllImport的基本使用
DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出函数的必要调用信息。

其中,引入到C#中的只能是非托管dll中的方法(或者说函数),而不能是数据(或者说变量)

(1)引入命名空间
using System.Runtime.InteropServices;
 (2)创建函数名称
[DllImport("demo.dll")]
public static extern bool OpenDemo();
其中:

修饰符static和extern是必不可少的(extern外部修饰符,常与DllImport属性一起使用,用于支持在外部实现方法)

最少要提供包含入口点的dll的名称


非常重要的外部参考:在Winform中从外部拖动节点到树形结构https://www.cnblogs.com/mjsn/p/6150909.html

在进行拖放操作之前,必须要对进行拖放操作的组件的"AllowDrop"属性值设定为"True",因为此属性是确定组件是否可以进行拖放操作的。  
     我们会用到三种事件:"ItemDrag"、"DragEnter"、"DragDrop"。其中只有第一种事件是在源组件中触发的,另外二种事件是在目标组件中触发的。其中当用户拖动组件触发"ItemDrag"事件;当拖动数据进入目标组件区域触发"DragEnter"事件;当用户在目标组件区域放置拖动的数据触发"DragDrop"事件。
     实现代码如下:
private void listView1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
 2         {
 3             this.DoDragDrop(e.Item,DragDropEffects.Move);
 4         }
 5 
 6         private void listView1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
 7         {
 8             e.Effect=DragDropEffects.Move;
 9         }
10 
11         private void treeView1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
12         {
13             //判定是否现在拖动的数据是LISTVIEW项
14             ListViewItem lvi = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); 
15             if (lvi != null) 
16             { 
17                 e.Effect = DragDropEffects.Move; 
18             } 
19             else 
20                 Cursor = Cursors.No; 
21 
22         }
23         private void treeView1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
24         {
25             //获得拖放中的项
26             ListViewItem lvi = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); 
27 
28             //根据鼠标坐标确定要移动到的目标节点
29             Point pt;
30             TreeNode targeNode;
31             pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
32             targeNode = this.treeView1.GetNodeAt(pt);
33             TreeNode NewMoveNode  =new TreeNode(lvi.Text);
34             if(targeNode!=null)//如果目标节点未选中,则添加到一级节点
35             {
36                 targeNode.Nodes.Add(NewMoveNode);
37                 //更新当前拖动的节点选择
38                 treeView1.SelectedNode = NewMoveNode;
39                 //展开目标节点,便于显示拖放效果
40                 targeNode.Expand();
41                 treeView1.Refresh();
42             }
43             else
44             {
45                 this.treeView1.Nodes.Add(NewMoveNode);
46                 //更新当前拖动的节点选择
47                 treeView1.SelectedNode = NewMoveNode;
48                 //展开目标节点,便于显示拖放效果
49                 treeView1.ExpandAll();
50                 treeView1.Refresh();
51             }
52 
53             
54         }

以上第一部分功能:窗体间treeview节点功能拖拽实现

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现WPF ComboBox下拉绑定Treeview功能,可以参考以下步骤: 1. 创建一个ViewModel,其中包含一个ObservableCollection用于绑定ComboBox的ItemsSource,同时也包含一个ObservableCollection用于绑定TreeView的ItemsSource。 2. 在ViewModel的构造函数中,初始化ComboBox的ItemsSource和TreeView的ItemsSource。 3. 在ComboBox的SelectedIndexChanged事件中,获取选中项的子节点数据,将其添加到TreeView的ItemsSource中。 4. 在XAML中,使用ComboBox和TreeView控件,并将它们的ItemsSource绑定到ViewModel中的相应属性。 下面是一个简单的示例代码: ViewModel: ```c# public class MainViewModel : INotifyPropertyChanged { private ObservableCollection<string> _comboBoxItemsSource; private ObservableCollection<string> _treeViewItemsSource; public MainViewModel() { // 初始化ComboBox的ItemsSource ComboBoxItemsSource = new ObservableCollection<string> { "Node1", "Node2", "Node3" }; // 初始化TreeView的ItemsSource TreeViewItemsSource = new ObservableCollection<string> { "Root" }; } public ObservableCollection<string> ComboBoxItemsSource { get => _comboBoxItemsSource; set { _comboBoxItemsSource = value; OnPropertyChanged(); } } public ObservableCollection<string> TreeViewItemsSource { get => _treeViewItemsSource; set { _treeViewItemsSource = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` XAML: ```xml <Window.DataContext> <local:MainViewModel /> </Window.DataContext> <Grid> <ComboBox ItemsSource="{Binding ComboBoxItemsSource}" SelectedIndex="0" Width="100" /> <TreeView ItemsSource="{Binding TreeViewItemsSource}" Margin="0,30,0,0"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"> <TextBlock Text="{Binding Name}" /> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> </Grid> ``` 在ComboBox的SelectedIndexChanged事件中,获取选中项的子节点数据,将其添加到TreeView的ItemsSource中。 ```c# private void ComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) { var selectedItem = e.AddedItems[0] as string; // 根据选中项获取子节点数据 var children = GetChildren(selectedItem); // 将子节点数据添加到TreeView的ItemsSource中 var root = TreeViewItemsSource[0]; if (root == "Root") { TreeViewItemsSource.Clear(); TreeViewItemsSource.Add(new Node { Name = "Root", Children = children }); } else { var node = TreeViewItemsSource[0] as Node; node.Children = children; } } private ObservableCollection<Node> GetChildren(string selectedItem) { // TODO: 根据选中项获取子节点数据 return new ObservableCollection<Node> { new Node { Name = $"{selectedItem}-1" }, new Node { Name = $"{selectedItem}-2" }, new Node { Name = $"{selectedItem}-3" } }; } public class Node { public string Name { get; set; } public ObservableCollection<Node> Children { get; set; } } ``` 以上示例代码仅供参考,实现过程中可能需要根据具需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值