最近我从here下载了Multi_select TreeView。它添加了一个选项来选择多个TreeNodes。
我在每个页面上使用3个TabControls和1个Multi_select TreeView(动态创建)。有一个选项可以从第一个拖动到另一个拖放。我还可以在每个TabControls上添加额外的TabPage(上面有TreeViwe)。
问题是TreeView(拖动源)随机消失,由不同的动作引起。 有时它是由一个TabControl快速拖放到另一个TabControl引起的。有时它会在创建新的TabPage后消失。它每20-30次发生一次。调试拖放操作非常困难,尤其是每次都不会发生拖放操作。
这是我提供拖放的事件处理程序。
private void Tv_ItemDragSource(object sender, ItemDragEventArgs e)
{
if (((MultiSelectTreeView.MultiSelectTreeView)sender).SelectedNodes.Count == 0 || (((MultiSelectTreeView.MultiSelectTreeView)sender).SelectedNodes.Count == 1 && ((MultiSelectTreeView.MultiSelectTreeView)sender).SelectedNodes[0] != ((TreeNode)e.Item)))
{
((MultiSelectTreeView.MultiSelectTreeView)sender).SelectedNodes.Clear();
((MultiSelectTreeView.MultiSelectTreeView)sender).SelectedNodes.Add((TreeNode)e.Item);
}
foreach (TreeNode i in ((MultiSelectTreeView.MultiSelectTreeView)sender).SelectedNodes)
{
if (i.Level != 0)
return;
}
DoDragDrop(((MultiSelectTreeView.MultiSelectTreeView)sender).SelectedNodes, DragDropEffects.Copy);
((MultiSelectTreeView.MultiSelectTreeView)sender).EndUpdate();
}
private void Tv_DragEnterSource(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
private void Tv_DragDropSource(object sender, DragEventArgs e)
{
TreeNode rewritten = new TreeNode();
ArrayList selectNodes = e.Data.GetData(e.Data.GetFormats()[0]) as ArrayList;
foreach (TreeNode i in selectNodes)
{
rewritten.Text = i.Text;
((TreeView)sender).Nodes.Add(rewritten);
foreach (TreeNode j in i.Nodes)
{
rewritten.Nodes.Add(j.Text);
}
rewritten = new TreeNode();
}
foreach (TreeNode i in ((MultiSelectTreeView.MultiSelectTreeView)sender).Nodes)
{
i.BackColor = Color.White;
i.ForeColor = SystemColors.WindowText;
}
selectNodes.Clear();
}
void tv_LostFocus(object sender, EventArgs e)
{
foreach (TreeNode i in ((MultiSelectTreeView.MultiSelectTreeView)sender).Nodes)
{
i.BackColor = Color.White;
i.ForeColor = SystemColors.WindowText;
}
((MultiSelectTreeView.MultiSelectTreeView)sender).SelectedNodes.Clear();
}
void tv_MouseUp(object sender, MouseEventArgs e)
{
((MultiSelectTreeView.MultiSelectTreeView)sender).EndUpdate();
}
void tv_MouseDown(object sender, MouseEventArgs e)
{
((MultiSelectTreeView.MultiSelectTreeView)sender).BeginUpdate();
}
我添加了一些TreeNodes颜色的更改,因为在早期拖放之后选择不同的节点时出现了问题。
提前致谢! 抱歉我的英语不好。
答案 0 :(得分:0)
我设法解决了问题。我怀疑问题是在BeginUpdate中没有触发EndUpdate。我添加了:
((MultiSelectTreeView.MultiSelectTreeView)sender).EndUpdate();
MouseLeave上的。现在它运作良好。
祝你有个愉快的一天。 :)