【问题标题】:Is it possible to have drag and drop from a ListView to a TreeView in Winforms?是否可以在 Winforms 中从 ListView 拖放到 TreeView?
【发布时间】:2011-02-18 19:01:00
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net winforms listview treeview


    【解决方案1】:

    ListView 自然不支持拖拽,但是你可以用一小段代码来启用它:

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

    这是一个专门从ListView 拖放到TreeView 的示例(这是一个专家交流链接,所以只需等待几秒钟,然后滚动到底部,您会在其中找到答案):

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

    更新:链接中的代码:

    • 创建一个列表视图和一个树视图。 (在我的示例中,列表视图称为 listView1,而树视图称为 tvMain)
    • 在树视图中,将 AllowDrop 设置为 true。
    • 在列表视图上创建 ItemDrag 事件

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

    在此示例中,列表视图中的项目被复制到“放置”对象。 现在,在树视图上创建一个 DragEnter 事件:

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

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

    在树视图上创建一个 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 文件位于同一目录中。

    这只是一个简单的例子。你可以随意扩展它。

    【讨论】:

    • 谢谢,但是从一个控件拖到另一个控件呢?
    • 虽然它没有让我看到任何东西,只是一个模糊的屏幕,上面覆盖着请订阅。
    • 老鼠! - 几分钟前我第一次访问它时它让我向下滚动,但现在它没有显示答案。
    • @Joan:我认为他们可能 95% 的时间都不会在底部显示答案,所以你只需要刷新直到答案出现。他们想赚钱,这是可以理解的。
    • 他们有时会设置一个 cookie,然后他们不会再次向您显示答案,直到您删除它或从 Google 缓存中打开页面(取决于您使用的浏览器,Google 缓存更容易)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    相关资源
    最近更新 更多