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

标签 c# .net winforms listview treeview

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

任何代码示例或教程都会非常有帮助。

最佳答案

ListView 本身不支持拖放,但您可以通过一小段代码启用它:

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

这是一个专门从 ListView 拖放到 TreeView 的示例(这是一个 Experts Exchange 链接,所以只需等待几秒钟,然后滚动到底部,在那里你会找到答案):

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

更新:链接中的代码:

  • 创建一个 ListView 和一个 TreeView 。 (在我的示例中, ListView 称为 listView1, TreeView 称为 tvMain)
  • 在 TreeView 上,将 AllowDrop 设置为 true。
  • 在 ListView 上创建一个 ItemDrag 事件

private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            listView1.DoDragDrop(listView1.SelectedItems, DragDropEffects.Copy);
        }

在此示例中, ListView 中的项目被复制到“drop”对象。 现在,在 TreeView 上创建一个 DragEnter 事件:

private void tvMain_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;
        }

这很容易。现在困难的部分开始了。以下代码将选定(和拖动)的 ListView 项添加到现有节点(确保您的 TreeView 中至少已有一个节点,否则该示例将失败!)

在 TreeView 上创建一个 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();
                }
            }
        }

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

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

            if (e.Effect == DragDropEffects.Copy)
            {
                Cursor.Current = new Cursor(@"myfile.ico");
            }
        }

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

这只是一个简单的例子。您可以按照自己喜欢的方式扩展它。

关于c# - 是否可以从 ListView 拖放到 Winforms 中的 TreeView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5045427/

相关文章:

c# - Graph API 拒绝访问,即使我授予了访问权限

c# - 大数据量的 MemoryStream 替代方案

c# - 区分用户关闭表单和用户关闭应用程序

c# - 如何为 Windows Phone 7 解析以下 JSON?

c# - 如何确定用户控件何时完全加载并显示?

c# - P/Invoke 声明似乎不正确

c# - 使用 DataContractSerializer 时设置属性的初始值

c# - 如果表达式返回类型为 void,如何获取 null?

winforms - ClickOnce 会移植到 .NET Core 3 或 .NET 5 以及 WinForms 吗?

winforms - 如何使用.NET TextBoxRenderer和TextBoxState.Hot来绘制热文本框?