【问题标题】:Randomly disappearing Multi_select TreeView随机消失的 Multi_select TreeView
【发布时间】:2013-07-23 10:32:25
【问题描述】:

最近我从here 下载了Multi_select TreeView。它添加了一个选择多个 TreeNode 的选项。

我在每个页面上使用 3 个 TabControls 和 1 个 Multi_select TreeView(动态创建)。有一个选项可以从第一个拖放到另一个上。我还可以在每个 TabControls 上添加额外的 TabPage(上面带有 TreeViwe)。

问题是TreeView(拖动源)随机消失,由不同的操作引起。 有时它是由从一个 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 颜色的更改,因为在早期拖放后选择不同的节点时出现问题。

提前致谢! 对不起我的英语不好。

【问题讨论】:

    标签: c# winforms treeview multi-select


    【解决方案1】:

    我设法解决了问题。我怀疑问题出在 BeginUpdate 中,没有触发 EndUpdate。我添加了:

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

    在鼠标离开。现在它运行良好。

    祝你有美好的一天。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 2021-11-03
      • 2013-08-26
      相关资源
      最近更新 更多