需求:支持ListView节点拖拽至TreeView,TreeView节点拖拽至ListView,TreeView节点拖拽至TreeView
实现方案:需以下三个事件联合使用
1.源控件的ItemDrag事件
2.目标控件的DragEnter事件
3.目标控件的DragDrop事件
#region ListView节点拖拽至TreeView
private void TlvDwgInfos_ItemDrag(object sender, ItemDragEventArgs e)
{
//判断是否是鼠标右键按动
if (e.Button == MouseButtons.Left)
{
OneKeyForm.DoDragDrop(OneKeyForm.tlvDwgInfos.CheckedItems, DragDropEffects.Move);
}
}
private void MstvPrjInfos_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(CheckedListViewItemCollection))
|| e.Data.GetDataPresent(typeof(List<TreeNode>)))
{
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
}
private void MstvPrjInfos_DragDrop(object sender, DragEventArgs e)
{
//if (TreeNodeLst.Count > 0 && SelectedNode != OneKeyForm.mstvPrjInfos.SelectedNode)
//{
// TreeNodeLst.ForEach(n => n.Remove());
// TreeNodeLst.Clear();
// SelectedNode.ImageIndex = 0;
// SelectedNode.SelectedImageIndex = 0;
//}
//根据鼠标坐标确定要移动到的目标节点
Point pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
SelectedNode = OneKeyForm.mstvPrjInfos.GetNodeAt(pt);
if (SelectedNode != null)
{
ProjectFolderDTO folderDTO = SelectedNode.Tag as ProjectFolderDTO;
if (folderDTO != null)
{
if (e.Data.GetDataPresent(typeof(CheckedListViewItemCollection)))
{
CheckedListViewItemCollection checkedlvItemColl = (CheckedListViewItemCollection)
e.Data.GetData(typeof(CheckedListViewItemCollection));
List<ListViewItem> lvItemLst = new List<ListViewItem>();
foreach (ListViewItem tlvItem in checkedlvItemColl)
{
string nodeText = tlvItem.Text;
TreeNode node = new TreeNode(nodeText);
string splitDwgCode = Path.GetFileNameWithoutExtension(nodeText);
string strHasUpdate = ServerProjectData.HasSplitDwgUpdate(folderDTO.ID, splitDwgCode);
if (Boolean.Parse(strHasUpdate))
{
node.ForeColor = Color.Red;
}
node.ImageIndex = 2;
node.SelectedImageIndex = 2;
node.Tag = tlvItem.Tag;
node.Name = tlvItem.Text;
if (TreeNodeLst.FindIndex(n => n.Text == node.Text) == -1)
{
SelectedNode.Nodes.Add(node);
TreeNodeLst.Add(node);
}
lvItemLst.Add(tlvItem);
}
SelectedNode.ImageIndex = 1;
SelectedNode.SelectedImageIndex = 1;
SelectedNode.Expand();
lvItemLst.ForEach(i => i.Remove());
}
else if (e.Data.GetDataPresent(typeof(List<TreeNode>)))
{
List<TreeNode> selectedNodes = e.Data.GetData(typeof(List<TreeNode>)) as List<TreeNode>;
List<TreeNode> moveNodeParLst = new List<TreeNode>();
foreach (TreeNode node in selectedNodes)
{
if (!moveNodeParLst.Contains(node.Parent))
{
moveNodeParLst.Add(node.Parent);
}
OneKeyForm.mstvPrjInfos.Nodes.Remove(node);
SelectedNode.Nodes.Add(node);
}
foreach (TreeNode moveNodePar in moveNodeParLst)
{
if (moveNodePar.Nodes.Count == 0)
{
moveNodePar.ImageIndex = 0;
moveNodePar.SelectedImageIndex = 0;
}
}
SelectedNode.ImageIndex = 1;
SelectedNode.SelectedImageIndex = 1;
SelectedNode.Expand();
}
Describes();
}
}
OneKeyForm.tlvDwgInfos.Refresh();
OneKeyForm.mstvPrjInfos.Refresh();
}
#endregion
#region TreeView节点拖拽至ListView
private void MstvPrjInfos_ItemDrag(object sender, ItemDragEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ArrayList selectedNodes = OneKeyForm.mstvPrjInfos.SelectedNodes;
if (selectedNodes != null && selectedNodes.Count > 0)
{
List<TreeNode> resNodeLst = new List<TreeNode>();
foreach (TreeNode node in selectedNodes)
{
FrameTemplate frameTemp = node.Tag as FrameTemplate;
if (frameTemp != null)
{
resNodeLst.Add(node);
}
}
OneKeyForm.DoDragDrop(resNodeLst, DragDropEffects.Move);
}
}
}
private void TlvDwgInfos_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(List<TreeNode>)))
{
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
}
private void TlvDwgInfos_DragDrop(object sender, DragEventArgs e)
{
//获得拖放中的节点
List<TreeNode> moveNodes = (List<TreeNode>)e.Data.GetData(typeof(List<TreeNode>));
List<TreeNode> moveNodeParLst = new List<TreeNode>();
foreach (TreeNode moveNode in moveNodes)
{
FrameTemplate frameTemplate = moveNode.Tag as FrameTemplate;
if (frameTemplate != null)
{
if (!moveNodeParLst.Contains(moveNode.Parent))
{
moveNodeParLst.Add(moveNode.Parent);
}
ListViewItem lvItem = new ListViewItem(moveNode.Text);
lvItem.Tag = moveNode.Tag;
lvItem.ImageIndex = 2;
lvItem.SubItems.Add(frameTemplate.LayoutName);
OneKeyForm.tlvDwgInfos.Items.Add(lvItem);
OneKeyForm.mstvPrjInfos.Nodes.Remove(moveNode);
TreeNodeLst.RemoveAll(t => t.Text.Contains(moveNode.Text));
}
}
foreach (TreeNode moveNodePar in moveNodeParLst)
{
if (moveNodePar.Nodes.Count==0)
{
moveNodePar.ImageIndex = 0;
moveNodePar.SelectedImageIndex = 0;
}
}
OneKeyForm.mstvPrjInfos.Refresh();
Describes();
}
#endregion
#region DragOver事件 实现拖拽至目标节点,目标节点高亮显示
private void MstvPrjInfos_DragOver(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(SelectedListViewItemCollection)))
{
//根据鼠标坐标确定要移动到的目标节点
Point pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
TreeNode targeNode = OneKeyForm.mstvPrjInfos.GetNodeAt(pt);
OneKeyForm.mstvPrjInfos.HideSelection = false;
OneKeyForm.mstvPrjInfos.SelectedNode = targeNode;
OneKeyForm.mstvPrjInfos.SelectedNode.ForeColor = SystemColors.HighlightText;
OneKeyForm.mstvPrjInfos.SelectedNode.BackColor = SystemColors.Highlight;
OneKeyForm.mstvPrjInfos.HideSelection = true;
}
}
#endregion