ListView拖动到TreeView

josxhn 2011-04-02 11:08:02
TreeView向TreeView拖动我会做。
TreeView向ListView拖动的资料也找到了

可是ListView向TreeView拖动就做不出来,
分别设置了ListView.AllowDrop和TreeView.AllowDrop为True
并且设置了ListView.ItemDrag事件和TreeView.DragEnter和TreeView.DrapDrop

但选中listView中项目拖动到TreeView区域后,鼠标指针就变成圆圈里面一个斜杠的图标,请问问题在哪里


//lvwBrowser是ListView, tvwCatalog是TreeView

//从lvwBrowser发起的拖动
private void lvwBrowser_ItemDrag(object sender , ItemDragEventArgs e)
{
//判断是否是鼠标右键按动
if (e.Button == MouseButtons.Right)
{
MessageBox.Show("e.Button == MouseButtons.Right");
return;
}
//判断组件中是否存在项目
if (lvwBrowser.SelectedItems.Count <= 0)
{
MessageBox.Show("lvwBrowser.SelectedItems.Count<=0");
return;
}

IList<ListViewItem> dragItemList = new List<ListViewItem>();
foreach (ListViewItem lvi in lvwBrowser.SelectedItems)
{
dragItemList.Add(lvi);
}

//对组件中的字符串开始拖放操作
lvwBrowser.DoDragDrop(dragItemList , DragDropEffects.Copy | DragDropEffects.Move);
}


//从tvwCatalog发起的拖动
private void tvwCatalog_ItemDrag(object sender , ItemDragEventArgs e)
{
DoDragDrop(e.Item , DragDropEffects.Move);
}

//对拖动到tvwCatalog树节点的数据类型的检查
private void tvwCatalog_DragEnter(object sender , DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(TreeNode)) || e.Data.GetDataPresent(typeof(IList<ListViewItem>)))
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
}

//拖动到tvwCatalog树节点的事件的处理,检查数据类型区分拖动事件来自lvwBrowser还是tvwCatalog
private void tvwCatalog_DragDrop(object sender , DragEventArgs e)
{
//来自tvwCatalog的拖动事件
if (e.Data.GetDataPresent(typeof(TreeNode)))
{
//获取被拖动树节点数据
TreeNode dragNode = (TreeNode) (e.Data.GetData(typeof(TreeNode)));

Position.X = e.X;
Position.Y = e.Y;
Position = tvwCatalog.PointToClient(Position);
//获取拖动目标树节点
TreeNode dropNode = this.tvwCatalog.GetNodeAt(Position);
//执行数据处理
CatalogBehaviors cb = new CatalogBehaviors(dragNode , dropNode , null);
cb.DragNodes();
}

//来自lvwBrowser的拖动事件
if (e.Data.GetDataPresent(typeof(IList<ListViewItem>)))
{
//获取拖动起始树节点
TreeNode dragNode = (TreeNode)(lvwBrowser.Tag);
//获取被拖动列表项目数据
IList<ListViewItem> dragItemList = (IList<ListViewItem>) (e.Data.GetData(typeof(IList<ListViewItem>)));

Position.X = e.X;
Position.Y = e.Y;
Position = tvwCatalog.PointToClient(Position);
//获取拖动目标树节点
TreeNode dropNode = this.tvwCatalog.GetNodeAt(Position);
//执行数据处理
CatalogBehaviors cb = new CatalogBehaviors(dragNode,dropNode,dragItemList);
cb.DragItems();
}
}
...全文
255 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
josxhn 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 stella_xu 的回复:]

忘记说了,我的邮箱stella_007525@163.com,非常感谢!
[/Quote]


//Drag informations from browser
private void lvwBrowser_ItemDrag_1(object sender , ItemDragEventArgs e)
{
//判断是否是鼠标右键按动
if (e.Button == MouseButtons.Right)
{
MessageBox.Show("e.Button == MouseButtons.Right");
return;
}
//判断控件中是否存在项目
if (lvwBrowser.SelectedItems.Count <= 0)
{
MessageBox.Show("lvwBrowser.SelectedItems.Count<=0");
return;
}

IList<ListViewItem> dragItemList = new List<ListViewItem>();
foreach (ListViewItem lvi in lvwBrowser.SelectedItems)
{
dragItemList.Add(lvi);
}

//对控件中的项目集合开始拖放操作
lvwBrowser.DoDragDrop(dragItemList , DragDropEffects.Move);
}

//Drag a directory from catalog
private void tvwCatalog_ItemDrag_1(object sender , ItemDragEventArgs e)
{
DoDragDrop(e.Item , DragDropEffects.Move);
}

//Check type of data draged
private void tvwCatalog_DragEnter_1(object sender , DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(TreeNode)) || e.Data.GetDataPresent(typeof(List<ListViewItem>)))
e.Effect = DragDropEffects.Move;
else
{
e.Effect = DragDropEffects.None;
}

}

//Drop a directory or informations into another directory
private void tvwCatalog_DragDrop_1(object sender , DragEventArgs e)
{
//来自tvwCatalog的拖动事件
if (e.Data.GetDataPresent(typeof(TreeNode)))
{
//获取被拖动树节点数据
TreeNode dragNode = (TreeNode) (e.Data.GetData(typeof(TreeNode)));
Position.X = e.X;
Position.Y = e.Y;
Position = tvwCatalog.PointToClient(Position);
//获取拖动目标树节点
TreeNode dropNode = this.tvwCatalog.GetNodeAt(Position);
//禁止拖动到自身
if (dragNode == dropNode)
{
MessageBox.Show("Cannot move a directory to itself." , "Notify");
return;
}
//执行UI处理
DragNode(dragNode , dropNode);
//执行数据处理
LINQDAL.MoveDirectory(dragNode.Name , dropNode.Name);
UpdateNode(dropNode);
UpdateBrowser(dropNode);
}

//来自lvwBrowser的拖动事件
if (e.Data.GetDataPresent(typeof(List<ListViewItem>)))
{
//获取拖动起始树节点
TreeNode dragNode = (TreeNode) (lvwBrowser.Tag);
//获取被拖动列表项目数据
IList<ListViewItem> dragItemList = (IList<ListViewItem>) (e.Data.GetData(typeof(List<ListViewItem>)));
Position.X = e.X;
Position.Y = e.Y;
Position = tvwCatalog.PointToClient(Position);
//获取拖动目标树节点
TreeNode dropNode = this.tvwCatalog.GetNodeAt(Position);
//执行UI处理
DragItems(dragNode , dropNode , dragItemList);
//执行数据处理
IList<string> infoIds = new List<string>();
string dirId = dropNode.Name;
foreach (ListViewItem lvi in dragItemList)
infoIds.Add(lvi.SubItems[2].Text);
//执行数据处理
LINQDAL.MoveInformation(infoIds , dirId);
UpdateNode(dropNode);
UpdateBrowser(dropNode);
}
}

Stella_Xu 2011-11-08
  • 打赏
  • 举报
回复
忘记说了,我的邮箱stella_007525@163.com,非常感谢!
Stella_Xu 2011-11-08
  • 打赏
  • 举报
回复
楼主能不能把代码传给我一份呢?我不知道为什么就是实现不了呢!
artoriar 2011-04-02
  • 打赏
  • 举报
回复
//对拖动到tvwCatalog树节点的数据类型的检查
private void tvwCatalog_DragEnter(object sender , DragEventArgs e)
{
//改成List<ListViewItem>
if (e.Data.GetDataPresent(typeof(TreeNode)) || e.Data.GetDataPresent(typeof(IList<ListViewItem>)))
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
}

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧