问题描述
在项目中使用TreeView通过DataBinding的方式展示数据,后来发现数据量稍微有点大的话,在呈现的时候就要耗很多时间,导致用户体验很差,后来通过UIV的方式解决了这个问题(设置VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling")但这时带来一个问题,由于Tree上有搜索节点的功能,在使用了UIVirtualization之后,如果我从没有通过滚动条拖动到那个节点的位置(UIV部分加载,只加载你看到的那部分数据,所以从没有拖过去的话,这部分节点也就从未生成),这个时候我把我搜索到的节点的IsSelected属性设置为True的话,是没有用的,请问各位前辈要如何解决这个问题呢?
解决方案
解决方案二:
修改TreeView中的节点文本privatevoidModifiedNode_Load(objectsender,EventArgse){treeView1.LabelEdit=true;//设置treeView1的可编辑属性为trueNexusConnection=newOleDbConnection(ConnectString);//初始化一个数据库连接对象NexusConnection.Open();//打开数据库连接stringSelectString="select产品编号,产品名称fromWare";//定义一个数据库查询字符串NexusCommand=newOleDbCommand(SelectString,NexusConnection);//初始化执行SQL语句对象OleDbDataReaderNexusReader=NexusCommand.ExecuteReader();//定义一个数据读取器treeView1.Nodes.Clear();//清空treeView1原有的数据内容TreeNoderoot=treeView1.Nodes.Add("产品名称");//为treeView1控件添加根节点while(NexusReader.Read())//开始读取数据中的内容{TreeNodetempNode=//将数据库中的数据字段变换为treeView控件的节点newTreeNode(NexusReader[1].ToString());root.Nodes.Add(tempNode);//向根节点上添加数据库字段}NexusReader.Close();//关闭数据读取器root.ExpandAll();//展开treeView1中的所有节点NexusConnection.Close();//关闭数据库连接}//CodeGo.net/privatevoidtreeView1_AfterLabelEdit(objectsender,NodeLabelEditEventArgse){if(e.Label!=null&&e.Label!="")//当选定项的内容存在且不为空时{NexusConnection.Open();//打开数据库连接stringRefreshString="updateWareset产品名称='"+//定义一个数据库连接字段e.Label+"'where产品编号="+(e.Node.Index+1).ToString();NexusCommand=newOleDbCommand(RefreshString,NexusConnection);//定义一个执行SQL语句的对象NexusCommand.ExecuteNonQuery();//执行SQL语句NexusConnection.Close();//关闭数据库连接MessageBox.Show("修改成功!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);//弹出修改成功的提示信息}}
解决方案三:
引用楼主shyhacker的回复:
在项目中使用TreeView通过DataBinding的方式展示数据,后来发现数据量稍微有点大的话,在呈现的时候就要耗很多时间,导致用户体验很差,后来通过UIV的方式解决了这个问题(设置VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling")但这时带来一个问题,由于Tree上有搜索节点的功能,在使用了UIVirtualization之后,如果我从没有通过滚动条拖动到那个节点的位置(UIV部分加载,只加载你看到的那部分数据,所以从没有拖过去的话,这部分节点也就从未生成),这个时候我把我搜索到的节点的IsSelected属性设置为True的话,是没有用的,请问各位前辈要如何解决这个问题呢?
加载TreeNode之前,数据应该保存在内存中的数据模型里。搜索应该在内存的数据模型里的数据集合进行,而不是在控件上。