找控件就像找爱人:小评几个可用于显示交叉表数据的控件

2024-01-09 15:32

本文主要是介绍找控件就像找爱人:小评几个可用于显示交叉表数据的控件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明

作者:xixi

出处:http://blog.csdn.net/slowgrace/archive/2008/10/02/3009557.aspx

 

所谓交叉表是一种常用的分类汇总表格。使用交叉表查询,显示源于表中某个字段的汇总值,并将它们分组,其中一组列在数据表的左侧,另一组列在数据表的上部。行和列的交叉处可以对数据进行多种汇总计算,如:求和、平均值、记数、最大值、最小值等。 

比如我现在要做的这种一周食谱这样的交叉表。

在数据库里其实是基于下面这样的表:

其中bytMealtype字段和lngrecipeid字段其实都不是文本型字段,但是因为设置为组合框,所以ACCESS自动把这些数字对应的文本显示出来了。在第一张图显示的交叉表中,bytmealtype字段被用作行标题、也就是行字段;dateMeal字段被用作列标题,也就是列字段;lngrecipeid则是值字段,可以看到主要内容是被值字段的值表示的,有时值字段也叫明细字段。 

具体到我们现在要处理的问题,对这个交叉表显示的要求如下:

1. 显示:能方便地从数据库的表中获得数据并显示出来。这是最基本的要求。

2. 定位:能方便地定位单元格。

3. 配色:能方便地设置单元格的颜色。这是为了方便用户编制、分析每周食谱。

4. 明细:能展示多于1个的明细数据。这一点是因为每个菜谱既有ID也有NAME,显示ID对用户不友好;显示NAME在保存数据时可能会导致混乱,因为NAME可能是不唯一的。

5. 删改:能删改显示的数据,以便用户边调整边看结果。

6. 保存:能把改过的数据,方便的存回数据库。以便以后调阅。 

可以选择的控件很多,我试了下面几个:

(1)基于交叉表查询的自动窗体:这是最简单的显示交叉表数据的办法。在ACCESS中用可视化工具设计一个交叉表查询,然后基于这个查询自动生成窗体。

    a)显示:基本是比较简单的。不过生产自动窗体之后,还要写一些代码以便在在程序运行期间根据用户的选择动态更改列标题(改为当前选定时间区间内的相应日期)。

    b)定位:行就是当前记录的mealtype值;列就是当前获得焦点的控件的name。

        Me.txtRow = Me.交叉表查询自动窗体.Form.bytMealType
        Me.txtCol = Me.交叉表查询自动窗体.Form.ActiveControl.Name

    c)配色:这个比较麻烦。设置一列的颜色比较简单,就是把那列对应的combo控件的背景色改掉就行。设置某个单元格的颜色比较麻烦,好在我也不是要求设置任意单元格的颜色,只是要把菜谱资料不齐的单元格变色,所以可以用各combobox的formatcondions写:

  1.     Dim FCs As Access.FormatConditions
  2.     Set FCs = Me.交叉表查询自动窗体.Form.Ctl2008_9_25.FormatConditions
  3.    
  4.     FCs(0).BackColor = RGB(255, 255, 0)
  5.     FCs(0).Modify Type:=acExpression, Expression1:= “SetYellowOrNot([cbo5])”
  6.     Set FCs = Nothing

    d)明细:方便。只要手工把这几个combo控件的行来源设置为基于tblrecipe的查询就行了

    e)删改:不允许改。可以代码改之后让窗体requery,还比较快。

    f)保存:得自己写代码。

 (2)比较容易想到的办法是用pivottable控件

    a)显示:只要在程序里设置好列字段、行字段和值字段就可以了。

    b)定位:支持。

    c)配色:不支持。很郁闷。貌似它只能按字段设置颜色。

    d)明细:可以显示多个字段。也可以直接得到和一个字段相关的其他字段(即使不显示)。这一点比较吸引我。因为我需要显示的只是菜名,但需要得到的相关数据却比较多,这样写代码时可以省些事。

    e)删改:不允许改。可以先在后台该了,然后刷新显示,还算简单。

    f)保存:得自己写代码。

   小结:它的致命伤是无法设置单个单元格的颜色,没有变通办法。 

 

(3)另外还可以用datagrid控件。这个的用法,其实是把交叉表查询生成的记录集作为它的数据源来做显示。它的缺点是不能设置单个单元格颜色;不能显示多于一个的细节。所以,放弃。

 

另外我还看了下其他data bound的控件。主要是看了datarepeater, datacombo。本想试试,但在VBA里好像用不了,折腾许久也不行。看了些资料,datarepeater大约是像ACCESS连续窗体的效果,是其他控件的容器,同时自己又是数据绑定的;datacombo基本上就是我用惯了的combo,只不过好像不用编程就可以设置它的列表啥的,可以绑定字段好像。我感觉这两个控件结合在一起能满足我的需要。只可惜它们属于VB power packs,我下载了却装不上,貌似必须先装了VB才行,光拷OCX和注册不灵。另外,我觉得这个和第一种方案的工作量和实质都基本一致,就不继续朝这个方向努力了。 

(4)spreadsheet控件。这个基本上就是把excel嵌进来。本文的第一张图就是用spreadsheet控件做的。

    a)显示:数据需要自己从DB中逐条读出来显示。

    b)定位:可以方便地定位单元格。

    c)配色:可以方便地设置单元格的颜色。

    d)明细:只能显示1个明细。变通的办法有两个,1个是把两个细节合在一起并在一个单元格里显示;一个是做两个worksheet,相应的细节单元格,一个显示ID,一个显示name。

    e)删改:可以删改。

    f)保存:需要自己写代码存盘。 

(5)再有listview控件。用它的report view模式。这个我不是很满意,比较早的否了。因为它一选就是选一行,不支持单元格的点选。 

这么折腾下来,其实我可以用的只有自动窗体和spreadsheet两种选择。我比较倾向于用自动窗体,因为感觉工作量稍小点。试这些控件花了2天多,还可以无穷尽的try下去,比如flexgrid控件、crystalreport、各种扩展的datagrid和pivottable等,但我决定打住了。这找控件就像买东西。你是选择把所有货物都穷尽以便找到最好的那一个,还是在满足你的性价比要求下找到一个就下单?估计一般人想也不想会说选后者。问题是,很多时候我们不太明白自己的底线,也就是自己的性价比要求。比如,我选这个控件,一开始我并没有太清楚我有哪些必须完成的需求,比如设置颜色的需求、比如对明细数据的需求等等。 

或者不如说,找控件就像找爱人。在你年轻的时候你并不知道你需要什么样的伴,你既不明确知道当前自己的需求、更无从知道未来的你的需求,而且你也无从判断你将要相伴一生的这个人性价比如何,你只能根据不靠谱的爱情感觉或者其他一些什么因素圈定一个,从此踏上充满风险的婚姻之旅。这以后如果发现这个控件不能满足你的需求,你只能见招拆招,能将就着用就用吧,实在绕不过去,那只好壮士断腕,从头来过。 

唉。这么一说,还有点凄凉了。控件真是不靠谱的东西,标准的、简单的、人所共知的控件还行;稍复杂点的,即使是微软出品的,它的性能、它的易用性、它的不出错率你就别寄予太高期望了。(而且,该死的微软,它们挣了那么多钱,就不能花九牛一毛的钱雇个人好好地写一份言简意赅的控件说明书么?)很多时候,你也许会发现你最初因为采用了控件而省出的编代码的时间,远远抵不过你跟这该死的控件较劲的时间。这和人类社会又很像了,你能控制的、完全依靠的永远都只有你自己。 

在用别人的控件和自己动手这两者中选择哪个,是个难题。实在没时间调研明白的时候,咱扔硬币吧。不管怎样,我得记住,别穷尽!  

另外,也有点明白了在ACCESS里用VBA和直接用VB6的区别,那就是微软针对ACCESS的常见需要提供了许多方便,省去了编程的麻烦,许多功能不需要太多的代码就可以实现了。比如,自动窗体。比如,我一行代码没编就得到的复合框……所以,我想以后能用ACCESS自己提供的功能就少用外边的。针对相同的功能,我猜ACCESS自己提供的八成还是比外边的好用。 

注:以上讨论只是本人基于浅显经验的粗浅认识,结论未必正确,仅供参考。

 

参考文献:http://msdn.microsoft.com/zh-cn/library/bx2998ay(VS.71).aspx

这篇关于找控件就像找爱人:小评几个可用于显示交叉表数据的控件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/587592

相关文章

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

通过ibd文件恢复MySql数据的操作方法

《通过ibd文件恢复MySql数据的操作方法》文章介绍通过.ibd文件恢复MySQL数据的过程,包括知道表结构和不知道表结构两种情况,对于知道表结构的情况,可以直接将.ibd文件复制到新的数据库目录并... 目录第一种情况:知道表结构第二种情况:不知道表结构总结今天干了一件大事,安装1Panel导致原来服务

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Jmeter如何向数据库批量插入数据

《Jmeter如何向数据库批量插入数据》:本文主要介绍Jmeter如何向数据库批量插入数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Jmeter向数据库批量插入数据Jmeter向mysql数据库中插入数据的入门操作接下来做一下各个元件的配置总结Jmete

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值