//开始拖动操作事件
private void TreeView_ItemDrag(object sender, ItemDragEventArgs e)
{
TreeNode tn = e.Item as TreeNode;
if ((e.Button == MouseButtons.Left) && (tn != null) && (tn.Parent != null)) //根节点不允许拖放操作。
{
this.treeView.DoDragDrop(tn, DragDropEffects.Copy | DragDropEffects.Move | DragDropEffects.Link);
}
}
//是否允许拖放操作继续检查事件
private void TreeView_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
//例如,当光标悬停在 TreeView 控件上时,展开该控件中的 TreeNode
//this.textBox1.Text = p.ToString();
}
private void TreeView_DragEnter(object sender, DragEventArgs e)
{
//e.Effect = e.AllowedEffect;
}
private void TreeView_DragOver(object sender, DragEventArgs e)
{
//当光标悬停在 TreeView 控件上时,展开该控件中的 TreeNode
Point p = this.treeView.PointToClient(Control.MousePosition);
TreeNode tn = this.treeView.GetNodeAt(p);
if (tn != null)
{
if (this.dragDropTreeNode != tn) //移动到新的节点
{
if (tn.Nodes.Count > 0 && tn.IsExpanded == false)
{
this.startTime = DateTime.Now;//设置新的起始时间
}
}
else
{
if (tn.Nodes.Count > 0 && tn.IsExpanded == false && this.startTime != DateTime.MinValue)
{
TimeSpan ts = DateTime.Now - this.startTime;
if (ts.TotalMilliseconds >= 1000) //一秒
{
tn.Expand();
this.startTime = DateTime.MinValue;
}
}
}
}
//设置拖放标签Effect状态
if (tn != null )//&& (tn != this.treeView.SelectedNode)) //当控件移动到空白处时,设置不可用。
{
if ((e.AllowedEffect & DragDropEffects.Move) != 0)
{
e.Effect = DragDropEffects.Move;
}
if (((e.AllowedEffect & DragDropEffects.Copy) != 0) && ((e.KeyState & 0x08) != 0))//Ctrl key
{
e.Effect = DragDropEffects.Copy;
}
if (((e.AllowedEffect & DragDropEffects.Link) != 0) && ((e.KeyState & 0x08) != 0) && ((e.KeyState & 0x04) != 0))//Ctrl key + Shift key
{
e.Effect = DragDropEffects.Link;
}
if (e.Data.GetDataPresent(typeof(TreeNode)))//拖动的是TreeNode
{
TreeNode parND = tn;//判断是否拖到了子项
bool isChildNode = false;
while (parND.Parent != null )
{
parND = parND.Parent;
if(parND == this.treeView.SelectedNode)
{
isChildNode = true;
break;
}
}
if (isChildNode)
{
e.Effect = DragDropEffects.None;
}
}
else if (e.Data.GetDataPresent(typeof(ListViewItem)))//拖动的是ListViewItem
{
if (tn.Parent == null)
{
e.Effect = DragDropEffects.None;
}
}
}
else
{
e.Effect = DragDropEffects.None;
}
//设置拖放目标TreeNode的背景色
if (e.Effect == DragDropEffects.None)
{
if (this.dragDropTreeNode != null) //取消被放置的节点高亮显示
{
this.dragDropTreeNode.BackColor = SystemColors.Window;
this.dragDropTreeNode.ForeColor = SystemColors.WindowText;
this.dragDropTreeNode = null;
}
}
else
{
if (tn != null)
{
if (this.dragDropTreeNode != null)
{
if (this.dragDropTreeNode != tn)
{
this.dragDropTreeNode.BackColor = SystemColors.Window;//取消上一个被放置的节点高亮显示
this.dragDropTreeNode.ForeColor = SystemColors.WindowText;
this.dragDropTreeNode = tn;//设置为新的节点
this.dragDropTreeNode.BackColor = SystemColors.Highlight;
this.dragDropTreeNode.ForeColor = SystemColors.HighlightText;
}
}
else
{
this.dragDropTreeNode = tn;//设置为新的节点
this.dragDropTreeNode.BackColor = SystemColors.Highlight;
this.dragDropTreeNode.ForeColor = SystemColors.HighlightText;
}
}
}
}
//随着鼠标的移动显示不同的光标效果
private void TreeView_GiveFeedback(object sender, GiveFeedbackEventArgs e)
{
//e.UseDefaultCursors = true;
// Use custom cursors if the check box is checked.
//if (UseCustomCursorsCheck.Checked)
//{
//int i = 0;
// Sets the custom cursor based upon the effect.
//e.UseDefaultCursors = false;
if ((e.Effect & DragDropEffects.Move) == DragDropEffects.Move)
{
//Cursor d = new Cursor("");
//Cursor.Current = MyNormalCursor;
}
else
{
//Cursor.Current = MyNoDropCursor;
}
//}
}
private void TreeView_DragDrop(object sender, DragEventArgs e)
{
if (this.dragDropTreeNode != null)
{
if (e.Data.GetDataPresent(typeof(TreeNode)))
{
TreeNode tn = (TreeNode)e.Data.GetData(typeof(TreeNode));
tn.Remove();//从原父节点移除被拖得节点
this.dragDropTreeNode.Nodes.Add(tn);//添加被拖得节点到新节点下面
Category category = (Category)tn.Tag;
if (this.dragDropTreeNode.Parent == null)
{
category.ParentID = 0;
}
else
{
category.ParentID = ((Category)this.dragDropTreeNode.Tag).CategoryID;
}
//更新节点移动到数据库
DocumentController.GetInstance().UpdateCategoryParent(category);
if (this.dragDropTreeNode.IsExpanded == false)
{
this.dragDropTreeNode.Expand();//展开节点
}
}
else if (e.Data.GetDataPresent(typeof(ListViewItem)))
{
if (this.dragDropTreeNode.Parent != null)
{
int categoryID = ((Category)this.dragDropTreeNode.Tag).CategoryID;
ListViewItem listViewItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
Item item = (Item)listViewItem.Tag;
DocumentController.GetInstance().UpdateItemCategory(item.ItemID, categoryID);
listViewItem.Remove();
}
}
//取消被放置的节点高亮显示
this.dragDropTreeNode.BackColor = SystemColors.Window;
this.dragDropTreeNode.ForeColor = SystemColors.WindowText;
this.dragDropTreeNode = null;
}
}
private void TreeView_DragLeave(object sender, EventArgs e)
{
if (this.dragDropTreeNode != null) //在按下{ESC},取消被放置的节点高亮显示
{
this.dragDropTreeNode.BackColor = SystemColors.Window;
this.dragDropTreeNode.ForeColor = SystemColors.WindowText;
this.dragDropTreeNode = null;
}
}