是否可以从ListView拖放到Winforms中的TreeView?

Joa*_*nge 3 .net c# treeview listview winforms

如果不可能,我也可以使用2个TreeView控件.我只是在第二个TreeView控件中没有层次结构.它会像某种存储库那样行事.

任何代码示例或教程都会非常有用.

Mus*_*sis 6

ListView 自然不支持拖放,但您可以使用一小段代码启用它:

http://support.microsoft.com/kb/822483

下面是专门做从拖和下降的例子ListView,以一个TreeView(它是一个专家性别更改链接,所以只需等待几秒钟,然后滚动至底部,在那里你会找到答案):

http://www.experts-exchange.com/Programming/Languages/.NET/Visual_CSharp/Q_22675010.html

更新: 链接中的代码:

  • 创建列表视图和树视图.(在我的例子中,listview被称为listView1,树视图被称为tvMain)
  • 在树视图上,将AllowDrop设置为true.
  • 在列表视图上创建ItemDrag事件

private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            listView1.DoDragDrop(listView1.SelectedItems, DragDropEffects.Copy);
        }
Run Code Online (Sandbox Code Playgroud)

在此示例中,列表视图中的项目将复制到"drop"对象.现在,在树视图上创建一个DragEnter事件:

private void tvMain_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;
        }
Run Code Online (Sandbox Code Playgroud)

这很容易.现在艰难的部分开始了.以下代码将选定(和拖动)的listview项添加到现有节点(确保树视图中至少有一个节点,否则示例将失败!)

在树视图上创建DragDrop事件:

private void tvMain_DragDrop(object sender, DragEventArgs e)
        {
            TreeNode n;

            if (e.Data.GetDataPresent("System.Windows.Forms.ListView+SelectedListViewItemCollection", false))
            {
                Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
                TreeNode dn = ((TreeView)sender).GetNodeAt(pt);
                ListView.SelectedListViewItemCollection lvi = (ListView.SelectedListViewItemCollection)e.Data.GetData("System.Windows.Forms.ListView+SelectedListViewItemCollection");

                foreach (ListViewItem item in lvi)
                {
                    n = new TreeNode(item.Text);
                    n.Tag = item;

                    dn.Nodes.Add((TreeNode)n.Clone());
                    dn.Expand();
                    n.Remove();
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

要在拖动时更改光标,必须为ListView控件创建GiveFeedback事件:

private void listView1_GiveFeedback(object sender, GiveFeedbackEventArgs e)
        {
            e.UseDefaultCursors = false;

            if (e.Effect == DragDropEffects.Copy)
            {
                Cursor.Current = new Cursor(@"myfile.ico");
            }
        }
Run Code Online (Sandbox Code Playgroud)

myfile.ico 应该与.exe文件位于同一目录中.

这只是一个简单的例子.您可以任意方式扩展它.

  • 他们有时会设置一个Cookie,然后他们会再次向您显示答案,直到您删除它或从Google缓存中打开该页面(取决于您使用的浏览器,Google缓存更容易) (2认同)