我需要在c#中使用treeview拖放。因为我听说3个事件是最常见的 1.itemDrag 2.DragDrop和3.DragEnter。
虽然这里的itemDrag事件在从树视图中拖动时为我开火,但是休息两个事件都没有为我开火。已经有很多解决方案,现在来这里寻求解决方案
private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
{
string[] strItem = e.Item.ToString().Split(':');
DoDragDrop(strItem[1], DragDropEffects.Copy | DragDropEffects.Move); }
以上方法触发,
private void treeView1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
bove dragEnter事件没有触发,同样dragDrop事件也没有触发。为什么这样呢??
从树视图拖动并需要粘贴PowerPoint或Word。 (即)树视图类似于Office工具的AddIn。
此致 艾尔沙德
答案 0 :(得分:0)
允许丢弃和..
好的,假设您在Form_Load中声明/创建了所有事件... e.i. :
tlAssemblies.DragDrop +=tlAssemblies_DragDrop;
tlAssemblies.MouseDown +=tlAssemblies_MouseDown;
tlAssemblies.MouseMove +=tlAssemblies_MouseMove;
tlAssemblies.DragEnter +=tlAssemblies_DragEnter;
tlAssemblies.DragOver += tlAssemblies_DragOver;
拖动事件用于在treeView中触发拖动事件,这就是它工作的原因。 dragEnter是您输入其他*控件的边界时。
即你想从treeview 1拖到treeview2。
如果您没有尝试将项目拖动到其他控件中,则dragEnter错误。
这是一个拖放事件示例:
private void tlAssemblies_DragDrop(object sender, DragEventArgs e)
{
if (sender == null)
return;
Point p = tlAssemblies.PointToClient(new Point(e.X, e.Y));
TreeListNode dragNode = e.Data.GetData(typeof(TreeListNode)) as TreeListNode;
TreeListNode targetNode = tlAssemblies.CalcHitInfo(p).Node;
if (targetNode == null)
{
return;
}
} 不确定是否可行,但您可能想要更改您的dragEnter代码,只需在拖动事件中使用它即可。
e.Effect = DragDropEffects.Move;
如果你没有离开相同的控件,你来回拖动,也可以显示拖动动作。
你可以做的另一件事是在treeView_MouseMove事件上。
private void tlAssemblies_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && downHitInfo != null)
{
Size dragSize = SystemInformation.DragSize;
Rectangle dragRect = new Rectangle(new Point(downHitInfo.HitPoint.X - dragSize.Width / 2,
downHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);
if (!dragRect.Contains(new Point(e.X, e.Y)))
{
DataRow row = viewProduct.GetDataRow(downHitInfo.RowHandle);
if(row != null)
tlAssemblies.DoDragDrop(row, DragDropEffects.Move);
//viewProduct.GridControl.DoDragDrop(row, DragDropEffects.All);
downHitInfo = null;
DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
}
}
}
答案 1 :(得分:0)
从您提供的代码中,我看不到您已实现DragDrop
事件,也未在所涉及的控件上设置AllowDrop
属性,这与其他两个事件一起需要执行拖放。
以下是直接从MSDN抢取的示例,它使用两个树视图在其间移动节点。添加几个树视图,添加一些根节点和子节点,并连接这些事件。记住AllowDrop
属性。
在测试时,我添加了几个Debug.WriteLine()
来帮助调试。断点可能很难; - )
注意:对于brewity,我没有提供事件接线代码,也没有提供创建样本节点的代码。如果需要,可以在参考文章中找到。否则使用属性窗口添加它们。
示例代码:
private void treeView_ItemDrag(object sender, ItemDragEventArgs e)
{
Debug.WriteLine("ItemDrag fired!");
DoDragDrop(e.Item, DragDropEffects.Move);
}
private void treeView_DragEnter(object sender, DragEventArgs e)
{
Debug.WriteLine("TreeView DragEnter fired!");
e.Effect = DragDropEffects.Move;
}
private void treeView_DragDrop(object sender, DragEventArgs e)
{
Debug.WriteLine("TreeView DragDrop fired!");
TreeNode NewNode;
if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
{
Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
TreeNode DestinationNode = ((TreeView)sender).GetNodeAt(pt);
NewNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
if (DestinationNode.TreeView != NewNode.TreeView)
{
DestinationNode.Nodes.Add((TreeNode)NewNode.Clone());
DestinationNode.Expand();
//Remove Original Node
NewNode.Remove();
}
}
}