【发布时间】:2011-02-18 19:01:00
【问题描述】:
如果不可能,我也可以使用 2 个 TreeView 控件。我只是在第二个 TreeView 控件中没有层次结构。它会像某种存储库一样工作。
任何代码示例或教程都会很有帮助。
【问题讨论】:
标签: c# .net winforms listview treeview
如果不可能,我也可以使用 2 个 TreeView 控件。我只是在第二个 TreeView 控件中没有层次结构。它会像某种存储库一样工作。
任何代码示例或教程都会很有帮助。
【问题讨论】:
标签: c# .net winforms listview treeview
ListView 自然不支持拖拽,但是你可以用一小段代码来启用它:
http://support.microsoft.com/kb/822483
这是一个专门从ListView 拖放到TreeView 的示例(这是一个专家交流链接,所以只需等待几秒钟,然后滚动到底部,您会在其中找到答案):
http://www.experts-exchange.com/Programming/Languages/.NET/Visual_CSharp/Q_22675010.html
更新:链接中的代码:
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 文件位于同一目录中。
这只是一个简单的例子。你可以随意扩展它。
【讨论】: