2013-07-23 91 views
0

最近我從here下載了Multi_select TreeView。它添加了一個選項來選擇多個TreeNode。隨機消失Multi_select TreeView

我在每個頁面(動態創建)上使用3個TabControl和1個Multi_select TreeView。有一個選項可以從第一個拖動到另一個。我還可以在每個TabControl上添加額外的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

我設法解決問題。正如我懷疑問題是在BeginUpdate沒有EndUpdate觸發。我已添加:

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

on MouseLeave。現在它運行良好。

祝您有愉快的一天。 :)