在从事使用powerbuilder进行数据库开发的过程中常常碰到要使用列表框来选择数据但是普通的下拉列表框并没有提供和数据相连接的方法而使用数据窗口的子下拉列表框来代替又显得有些别扭下面介绍一种好看又好用的方法
如果使用指针把要连接的数据一条一条地从select 语句的查询结果中fetch 出来然后再把数据additem到下拉列表框中去虽然这也是一种可行的方法但是他的速度不能令人满意太受数据量的影响我们可以利用powerbuilder 最推崇的数据窗口技术作为数据库和下拉列表框连接的桥梁这种方法即方便快速又安全可靠
下面制作的下拉列表框
一打开powerbuilder的select user object画笔选择在new user object中选择Visual类的Standard项并按下 在弹出来的Select Standard Visual Type对话框中选择列表中的 dropdownlistbox项并按下接着加入一些实例变量选择Declare菜单项的Instance Variables加入变量的声明 datastore ids_user int il_row 并按下
我们要对新的对象进行一些限制在对象的constructor事件中加入程序
sorted = false //这句非常必要
reset()
二把数据检索出来放到ids_user变量里
选择菜单Declare项的User Object Function在弹出来的对话框中按下新建一个对象函数命名为init
参数有一个
sqlstr string
返回值为整型integer
现在我们需要动态地创建datastore
在init函数中写下
//integer init(sqlstr string) 开始
long ll_rowcount
long ll_row
string ls_sql
string errors
string ls_return
ids_user = create datastore
//根据sql语句产生数据窗口
ls_return = sqlcaSyntaxFromSQL(sqlstr style(type=grid)errors)
//sql语句有错误
if len(errors) > then
messagebox(错误 errors)
return
end if
//根据语法动态创建数据窗口
ids_usercreate(ls_return)
ids_usersettransobject(sqlca)
ll_rowcount = ids_userretrieve()
//无数据返回
if ll_rowcount= then
return
end if
//把数据插入控件
for ll_row = to ll_rowcount
thisadditem(string(ids_userObjectData[ll_row]))
next
//成功返回
return
//integer init(sqlstr string) 结束
现在下拉列表框已经能显示数据了但是我们在选择数据的同时往往需要的不是它显示出来的值比如显示的是人员姓名而我们需要的是工号难道再使用select语句把需要的数据检索出来吗?有了下面的程序我们就不必头痛了
重复上面建立函数的步骤新建一个名为getdata的user object函数返回值为any并在函数中写下程序
//any getdata() 开始
any la_return
long ll_row
if text = then
return
end if
//没有选择或没有检索到数据
if ids_userrowcount() = or il_row = then
return
end if
//在缺省情况下返回第二列的数据
la_return = ids_userObjectdata[il_row ]
return la_return
//andy getdata() 结束
现在还不能返回正确的数据还需要一个函数setidx(idx int)程序如下
//setidx(idx int) 开始
il_row = idx
//setidx(idx int) 结束
现在这个user object已经完成了我们来做一下试验试一试新建一个应用app_test一个窗口w_main按照刚才的方法创建一个user object:uo_dbdropdownlistbox放入w_main中
在app_test的open事件中写下连接数据库的语句并加上open(w_main)
在w_main的open事件中写下
int li_result
li_result = uo_init(select name id from sysobjects)
在uo_的selectionchanged事件中写下setidx(index)
messagebox(提示 看 + string(thisgetdata()))
这时我们的用户对象已经能根据选择的name返回相应的id了
编辑推荐
数据仓库与数据挖掘培训视频教程
Microsoft NET框架程序设计视频教程