百万数据瞬间浏览属性

作者:皇皇
  • 发现问题

信息化时代,项目里面数据量达到几十上百万是经常遇到的事情,浏览这些数据的时候我们往往采取分页的方式。但是在一些特殊情况下需要把数据一起加载出来,比如说GIS行业里面,已经获取到了所有矢量对象,希望把这些对象的属性信息展示出来。如果用DataGridView或者ListView采用最简单、常用的逐行填充法,运行没问题,但是在大数据量的时候显示速度非常慢,体验效果很差,那我们怎么才能做到短时间内把所有数据加载出来呢?

  • 解决问题

查看资料,发现用DataGridView的虚模式就可以解决逐行填充速度慢的问题,因为虚模式只填充当前窗口中需要显示的那一小部分数据,实时根据滚动条位置刷新数据,并不是像逐条填充和数据源绑定时一次性将数据填充完成再显示。用31万条数据做了个测试,用虚模式和逐条填充两种方式,同一个设备逐条填充用时30多分钟,虚模式几乎无法察觉它的填充时间。
通过行列号和数据索引的关系实现对数据的编辑。

  • 代码演示

    下面我们通过对超图矢量数据的操作,来演示对大数据的快速浏览和编辑。
    1、瞬间浏览
    首先把DataGridView的VirtualMode属性设置为true,创建列。

            //创建列
            FieldInfos mFieldInfos = oRst.GetFieldInfos();
            for (int i = 0; i < mFieldInfos.Count; i++)
            {
                FieldInfo mField = mFieldInfos[i];
                string columnTitle = mField.Name;
                if (!string.IsNullOrEmpty(mField.Caption))
                    columnTitle = mField.Caption;
                DataGridViewColumn col = new DataGridViewTextBoxColumn();
                col.Name = mField.Name;
                col.HeaderText = columnTitle;
                if (mField.IsSystemField)
                {
                    col.ReadOnly = true;
                    col.DefaultCellStyle.BackColor = Color.FromArgb(240, 240, 240);
                }
                dataGridViewNew.Columns.Add(col);
            }
            mFieldInfos = null;

			//采用虚模式来填充数据   
            dataGridViewNew.VirtualMode = true;
            dataGridViewNew.Rows.Add(oRst.RecordCount);

然后完成DataGridView的CellValueNeeded事件填充数据

        // 单元格填充数据事件  
        private void dataGridView_CellValueNeeded(object sender,     DataGridViewCellValueEventArgs e)
        {
            if (e.RowIndex == this.dataGridViewNew.RowCount)
                return;
            // 从记录集中读取数据   
            string colName = this.dataGridViewNew.Columns[e.ColumnIndex].Name;
            oRst.MoveTo(e.RowIndex);
            e.Value = oRst.GetFieldValue(colName);
        }

数据加载上去,马上就可以拖动滑块浏览所有数据,如图一。
这里写图片描述

							                    图一

2、数据编辑
数据编辑的时候,不是去编辑DataGridView里面的数据,而是通过用户点击的行列号去匹配数据集里面的索引,找到对应的数据,对数据进行编辑,编辑完成后重新加载数据。
以修改数据集为例,当用户双击单元格修改数据的时候获取单元格的行列号,确定单元格位置大小,然后在单元格位置放置一个控件,比如编辑日期,首先获取单元格位置及大小

        //指定单元格位置、大小
        private Rectangle SizeAndBounds(int RowIndex, int ColumnIndex)
        {
            Size _Size = this.dataGridViewNew.Rows[upRowIndex].Cells[upColumnIndex].Size;
            int cellX = dataGridViewNew.GetCellDisplayRectangle(upColumnIndex, upRowIndex, false).X;
            int cellY = dataGridViewNew.GetCellDisplayRectangle(upColumnIndex, upRowIndex, false).Y;
            int x = dgvX + cellX;
            int y = dgvY + cellY;
            Rectangle _Rectangle = new Rectangle(cellX, cellY, _Size.Width, _Size.Height);
            return _Rectangle;
        }

设置DateTimePicker的Bounds,然后添加到dataGridViewNew的Controls组里面

 _DateTimePicker.Bounds = _Rectangle;
 dataGridViewNew.Controls.Add(_DateTimePicker);

效果如图二
这里写图片描述

							                     图二

DateTimePicker时间修改后失去焦点时,就把DateTimePicker的值修改到数据集里面
通过行号定位到记录集

oRst.SeekID(e.RowIndex+1);

通过列号定位到记录集的列名

FieldInfos fieldInfos = oRst.GetFieldInfos();
string names = fieldInfos[e.ColumnIndex].Name;

根据列名修改数据

String time=_DateTimePicker.Text;
DateTime dt = DateTime.Parse(time);
addData = oRst.SetFieldValue(names, dt);

把日期控件删除掉,再重新加载数据就OK了

### 校园导航系统的设计与实现 #### 背景介绍 **校园导航系统**是一种基于地图的应用程序,旨在帮助用户在校内找到目的地。通过输入起点和终点,系统可以提供最优路径,并显示相关信息如距离、预计时间等。 #### 使用数据结构设计校园导航系统的关键点: 1. **图论模型** - 将整个校园建模成一张无向加权图(Graph),其中节点表示各个建筑物或地标位置,边则代表两个地点之间的道路连接。权重设置为两点间的实际步行路程长度。 2. **邻接表存储** - 鉴于图可能会比较稀疏(即并非所有建筑之间都有直接通道相连),因此采用`链式前向星`或者`vector数组+pair<next_node, weight>`这样的形式来储存每一个顶点对应的相邻结点及相应的边长信息会更节省空间并且易于操作访问邻居元素;同时还能方便地支持动态添加新的路标设施及其关联路线。 3. **最短路径算法** - 对于求解两处之间的最佳行进线路问题,则可以根据实际情况选用Dijkstra(适用于正权值) 或者 Bellman-Ford (能处理负环的情况但效率较低) 来计算从源点出发到其它任意目标可达位置间最小耗费总里程数; 此外若对实时性和性能有更高追求的话还可以考虑A*启发式搜索策略,在保证结果正确的前提下往往可以获得更快的速度收敛效果。 4. **树形文件夹组织地理要素类别分类管理** - 地理信息系统(GIS)相关的矢量数据一般都包含属性字段说明其物理特征以及功能用途等内容描述,为了便于查询检索和维护更新这些元信息建议构建一棵二叉查找树BST或其他有序映射容器存放各类别下的实例对象引用指针即可满足需求。 5. **哈希表加速定位服务** - 如果希望进一步提高按名称快速匹配特定兴趣点POI坐标的响应速度,那么不妨利用hashmap散列表机制将字符串key映射至int型id编号上从而构成索引项以便瞬间完成关键词联想提示以及精准命中指定实体记录的操作流程体验优化工作。 6. **队列辅助广度优先遍历周边环境探索模式** - 当涉及到范围圈定区域内推荐候选方案展示环节时,BFS自然成为首选利器之一。它能够按照层次顺序依次扫描并返回离当前位置最近的一系列备选参考点集供用户体验浏览决策之用。 7. **栈用于保存历史轨迹回溯功能支持** - 给予访客回顾先前游览过的站点序列的能力同样重要。此时借助stack后入先出LIFO特性很容易就能达成目的:每当成功抵达新一站之后便压入当前坐标参数作为记忆标记;而在需要撤销某一步骤选择时只需弹出来恢复之前的状态就好了。 8. **集合去重避免重复录入相同信息** - 最后来谈谈set这一神奇的数据类型吧~它可以高效检测是否存在完全一致的成员个体存在,所以在批量导入一批预设好的热点地址资源库时就特别有用啦!有效防止因人为失误而导致数据库里混杂着大量雷同冗余条目影响整体质量的问题发生哦~ --- 综上所述,以上就是关于如何运用多种经典基础数据结构知识结合现代计算机科学技术手段共同打造出一款实用高效的智慧化校园区域导览助手应用程序的大致思路框架了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值