2013-07-23 1 views
0

Недавно я загрузил 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, потому что были проблемы с выбором различных узлов после ранее перетаскивания.

Заранее благодарен! Извините за мой плохой английский.

ответ

0

Мне удалось решить проблему. Как я подозревал, проблема была в BeginUpdate без запуска EndUpdate. Я добавил:

((MultiSelectTreeView.MultiSelectTreeView)sender).EndUpdate(); 

на MouseLeave. Теперь он работает хорошо.

Имейте славный день. :)

Смежные вопросы