计算机工程
COMPUTER ENGINEERING
1999年 第25卷 第12期 vol.25 No.12 1999



PB环境下模拟下拉列表框显示动态数据
胡　岩　王宇航　何　慧
1 问题的提出
　　PB(PowerBuilder)是一种面向对象的基于客户机／服务器方式的数据库开发工具，它集成了大量的新技术并成为功能强大、高性能的开发环境。 它采用事件驱动编程方式，在可视化开发环境中，保证数据安全完整的前提下，使开发人员方便灵活的制作自己的产品。 
　　使用过PB的人都知道，在Window对象中，提供了多种可用控件。它是人机交换信息的接口界面，其他的应用程序组件都是通过窗口联系起来并展现给用户的。 在应用程序中只有通过控件的使用，才能发挥其功能。 下拉式列表框控件DropDownListBox 就是其中之一，它也被称为组合框，因为它组合了单行编辑器和列表框的特性，可以编辑一行文本，在一个可以滚动的矩形框中显示多行文本，常用于双击列表框中的某项时触发某些操作。
　　虽然它是一个非常方便的控件，可它提供的功能是有限的，在列表框中显示的数据项需在定制时预先输入或在程序运行时添加，因此它只适合于少量相对固定的数据项。 
　　在实际应用中，例如执行查询操作时，作为查询条件的数据输入方式，常常要对大量动态数据，尤其是来自数据库中的数据，采用下拉列表框的方式提供给用户选择输入，因此，这时仅用下拉列表框控件本身并不能满足要求。
　　下面介绍一种在程序运行时动态地从某一表中选取数据项来模拟下拉列表框的方法。
2 问题的实现
2.1 定义数据窗口
　　表1是一个典型的数据字典表。它只有content和id两个字段，content是所要显示的数据项，id是其对应的编码。
表1 典型的数据字典表
NameTypeWidthDecimalNull
contentchar20　No
idchar2　No

　　在制作管理信息系统时，为了使程序规范、风格统一、提高代码编程效率、节省数据库存储空间、同时又能方便用户操作，经常要用到这种编码表。 如学历编码、性别编码、省市区县编码等。下面以学历编码表为例作详细介绍。
　　首先建立两个数据窗口：
　　(1) 建立第一个数据窗口d_education
　　进入数据窗口描绘器中，从数据源中选择Quick Select选项，从显示样式中选择Grid选项，单击OK按纽后，进入Quick Select对话框，在Tables中选择需要使用的表名，如education。 在Columns列表框中依次选择content，id数据项，单击OK按纽，这时进入了PB设计好的数据输入屏幕。将标题头Header隐藏，只保留Detail项，设计好后将数据窗口命名为d_education后存盘。
　　(2) 建立第二个数据窗口d_education_dw
　　用以上相同的方法进入Quick Select对话框，在Tables中选择需要使用的表名，如education。 在Columns 列表框中依次选择content，id 数据项，单击OK按纽后，将标题头Header隐藏，只保留Detail项。 
　　然后编辑content 项属性: 在content 列单击鼠标右键，选择Properties...命令，在显示出的属性栏上选择Edit 标签，在Style 中选择 DropDownDW，在Data window 中选择已建好的d_education，在Display Column中选择content，在Data Column中选择id， 在Lines in DropDown 中输入适当的下拉列表框的显示行数。 
　　选中V Scroll Bar属性以便在数据项超过下拉列表框边界时自动显示竖直滚动条，选中Always Show Arrow 属性以便提示这是一个下拉列表框。 设计好后将数据窗口命名为d_education_dw后存盘。
　　在这里，定义第一个数据窗口d_education 的目的是，为了定义第二个数据窗口d_education_dw。 在数据窗口d_education_dw中又调用另外一个数据窗口d_education，通过两个数据窗口的嵌套组合方式，达到实现模拟下拉列表框的目的，这是本方法的关键所在。
2.2 创建窗口及控件
　　建立一个窗口命名为w_window，在其上创建一个数据窗口控件dw_1，关联的数据窗口对象是d_education_dw，用于模拟下拉输入列表框。 
　　然后再创建一个数据窗口控件dw_2，用于显示数据窗口，与dw_2相关联的数据窗口对象可以选自个人信息库，其用意在于根据dw_1中选择的数据项值，来检索dw_2中的数据。 也可以说dw_1是dw_2的查询条件输入项。 因此为dw_2定义一个检索参数，这个参数与建立数据窗口对象d_education_dw所依据的表有关，如学历。
2.3 连接数据库与数据窗口中的数据
　　窗口及其控件创建好之后，还必须进行连接数据库操作，否则在数据窗口中无法显示数据库中的数据。 
　　在窗口w_window的open事件中键入下面的语句：
　　Connect Using SQLCA； dw_1.SetTransObject(SQLCA)；
　　dw_1.Retrieve()； dw_2.SetTransObject(SQLCA )； 
　　dw_2.Retrieve('00')； Disconnect Using SQLCA；
2.4 连接dw_1与d_education_dw
　　为了在数据窗口dw_2中，根据下拉列表框的值显示相应的数据，还需要定义dw_1与dw_2两个控件的连接。
　　在dw_1的itemchanged 事件键入下面的语句： Connect Using SQLCA； dw_2.SetTransObject(SQLCA); dw_2.Retrieve(data)； Disconnect Using SQLCA;
3 使用效果
　　在查询数据时，根据dw_1中用户输入的选项，相应地在dw_2窗口中显示与文化程度对应的数据。 用鼠标在输入框中单击，就会弹出2.1 中定义的下拉列表框，选择其中一项数据，如本科，则dw_2数据窗口立即检索出相应文化程度的所有数据。 只要dw_1中的输入数据项一旦发生变化，就会触发其itemchanged 事件，dw_2数据窗口马上就会随之相应变化。
4 结束语
　　在实际应用中，模拟下拉列表框动态显示数据并不局限于某个特定结构的表，它可以是任一个表的任一个字段。从上述过程可以得出结论，在程序运行时动态显示选自数据库中的数据，模拟下拉列表框的输入方式，是完全可行的，其实现方法也简便易行，突破了系统本身提供的下拉列表框功能的局限性，扩展了系统功能，最终方便了用户。 在已投入运行的管理信息系统中，经多次运用此方法，获得了满意的效果。实践证明本方法是简便有效的。
作者单位:哈尔滨工业大学网络中心,哈尔滨150001
参考文献
1 (美)Hatfield B. PowerBuilder5应用程序开发指南. 北京：清华大 学出版社，1997
