zoukankan      html  css  js  c++  java
  • WPF TreeView大数据量多层级搜索定位

       private  bool ExpandAndSelectItem(ItemsControl parentContainer, object itemToSelect)
            {
                //检查当前级别的所有项目
                foreach (Object item in parentContainer.Items)
                {
                    TreeViewItem currentContainer = parentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
                    //如果数据项与我们要选择的项匹配,则设置相应的项
                    //TreeViewItem 是被选为真的
                    if (item == itemToSelect && currentContainer != null)
                    {
                        currentContainer.IsSelected = true;
                        currentContainer.BringIntoView();
                        currentContainer.Focus();
                        //item被找到
                        return true;
                    }
                }
                //如果我们到达这一点,在当前级别上找不到所选项目,所以我们必须检查 children
                foreach (Object item in parentContainer.Items)
                {
                    TreeViewItem currentContainer = parentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
                    //如果 children 存在
                    if (currentContainer != null && currentContainer.Items.Count > 0)
                    {
                        //跟踪树视图项是否被扩展
                        bool wasExpanded = currentContainer.IsExpanded;
                        //展开当前的树视图项,以便我们可以检查它的子树视图项
                        currentContainer.IsExpanded = true;
                        //如果尚未生成树视图项子容器,则必须侦听
                        //状态更改事件,直到它们是
                        if (currentContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
                        {
                            //将事件处理程序存储在变量中,以便我们可以删除它(在处理程序本身中)
                            EventHandler eh = null;
                            eh = new EventHandler(delegate
                            {
                                if (currentContainer.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
                                {
                                    if (ExpandAndSelectItem(currentContainer, itemToSelect) == false)
                                    {
                                        //假设在此事件处理程序中执行的代码是父进程的结果
                                        //由于没有生成容器而被扩展。
                                        //由于在孩子们中找不到“选择”项,所以折叠父项,因为它以前是折叠的
                                        currentContainer.IsExpanded = false;
                                    }
                                    //删除状态更改事件处理程序,因为我们刚刚处理了它(我们只需要它一次)
                                    currentContainer.ItemContainerGenerator.StatusChanged -= eh;
                                }
                            });
                            currentContainer.ItemContainerGenerator.StatusChanged += eh;
                        }
                        else //否则容器已经生成,所以在子目录中查找要选择的项
                        {
                            if (ExpandAndSelectItem(currentContainer, itemToSelect) == false)
                            {
                                //恢复当前树视图项的扩展状态
                                currentContainer.IsExpanded = wasExpanded;
                            }
                            else //否则找到并选择节点,因此返回true
                            {
                                return true;
                            }
                        }
                    }
                }
                //找不到item
                return false;
            }
    

      

  • 相关阅读:
    附加数据库报错:无法打开物理文件 XXX.mdf",操作系统错误 5:"5(拒绝访问。)"
    Java(TM) SE Development Kit 6 卸载不掉怎么办
    (转)WCF入门教程(一)简介
    (转)SQL Server 2008怎样编辑200行以上的数据
    远程桌面下如何打开任务管理器
    在 sys.servers 中找不到服务器的解决办法,自己解决的
    MySQL 8小时问题
    Spring 事件机制
    MapReduce架构
    HDFS架构
  • 原文地址:https://www.cnblogs.com/liangbinlong/p/14048163.html
Copyright © 2011-2022 走看看