Недавно я загрузил Multi_select TreeView с here. Он добавляет возможность выбора нескольких TreeNodes.Случайное исчезновение Multi_select TreeView
Я использую 3 TabControls с 1 Multi_select TreeView на каждой странице (созданный динамически). Есть возможность перетащить с первого и перейти на другой. Я также могу добавить дополнительные TabPage (с TreeViwe на нем) на каждом из TabControls.
Проблема в том, что TreeView (источник перетаскивания) случайным образом исчезает, вызванный различными действиями. Иногда это вызвано быстрым перетаскиванием из одного TabControl в другое. Иногда он исчезает после создания новой вкладки. Это происходит каждые 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, потому что были проблемы с выбором различных узлов после ранее перетаскивания.
Заранее благодарен! Извините за мой плохой английский.