PB开发笔记(6)


PB开发笔记(6)
2052人阅读 评论(1) 收藏 举报

//如何用代码配置ODBC数据源
自动创建ODBC是基于对Windows注册表的直接写操作来实现的
步骤:
一、创建函数:
gf_create_odbc(string as_odbc_name,string as_odbc_type,string as_path)
string ls_key,ls_key1
ls_key    = 'HKEY_CURRENT_USER/Software/ODBC/ODBC.INI/'+as_odbc_name
ls_key1 = 'HKEY_CURRENT_USER/Software/ODBC/ODBC.INI/ODBC Data Sources'
if as_odbc_type = 'DBF' then
Registryset(ls_key,'Driver',"C:/WINDOWS/SYSTEM/PBDBF12.DLL")
Registryset(ls_key,'Description',"自动生成ODBC'")
Registryset(ls_key,'Database',as_path)
Registryset(ls_key,'CreateType',"FoxPro25")
Registryset(ls_key,'Locking',"RECORD")
Registryset(ls_key,'LockCompatibility',"Fox")
Registryset(ls_key,'FileOpenCache',"1")
Registryset(ls_key,'CacheSize',"4")
Registryset(ls_key,'DataFileExtension',"DBF")
Registryset(ls_key,'IntlSort',"C:0")
Registryset(ls_key,'UseLongNames',"1")
Registryset(ls_key,'UseLongQualifiers',"1")
Registryset(ls_key,'ApplicationUsingThreads',"1")
Registryset(ls_key1,as_odbc_name,"PB INTERSOLV OEM 3.01 32-BIT dBASEFile (*.dbf)")
end if
if as_odbc_type = 'SQLANY' then
Registryset(ls_key,'Driver',as_path+"WOD50T.DLL")
Registryset(ls_key,'Description',"自动生成ODBC'")
Registryset(ls_key,'UID',"DBA")
Registryset(ls_key,'PWD',"SQL")
Registryset(ls_key,'Start',as_path+'dbeng50')
Registryset(ls_key,'DatabaseFile',as_path+as_odbc_name+'.DB')
Registryset(ls_key,'DatabaseName',as_odbc_name)
Registryset(ls_key,'AutoStop',"Yes")
Registryset(ls_key1,as_odbc_name,"Sybase SQL Anywhere 5.0")
end if
if as_odbc_type = 'FOXPRO' then
Registryset(ls_key,'DefaultDir',as_path)
Registryset(ls_key,'Description',as_odbc_name+"的自动ODBC'")
Registryset(ls_key,'Driver','C:/WINDOWS/SYSTEM/odbcjt32.dll')
Registryset(ls_key,'DriverId',ReguLong!,280)
Registryset(ls_key,'FIL',"FoxPro 2.0")
Registryset(ls_key,'SafeTransactions',ReguLong!,0)
Registryset(ls_key,'UID',"")
Registryset(ls_key+'/Engines/Xbase','CollatingSequence','ASCII')
Registryset(ls_key+'/Engines/Xbase','Deleted',Regulong!,1)
Registryset(ls_key+'/Engines/Xbase','ImplicitCommitSync','Yes')
Registryset(ls_key+'/Engines/Xbase','PageTimeout',ReguLong!,600)
Registryset(ls_key+'/Engines/Xbase','Statistics',Regulong!,0)
Registryset(ls_key+'/Engines/Xbase','Threads',Regulong!,3)
Registryset(ls_key+'/Engines/Xbase','UserCommitSync','Yes')
Registryset(ls_key1,s_dbfname,"Microsoft FoxPro Driver (*.dbf)")
end if
...
二、在建立联接前先创建该ODBC的相关信息,如
...
string ls_dbfname="c:/Foxprow/Database"
gf_create_odbc('TestDBF','FOXPRO',ls_dbfname)
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.Database = 'TestDBF'
SQLCA.dbparm = "ConnectString='DSN=TestDBF'"
connect using sqlca;
if sqlca.sqlcode <> 1 then
messagebox('错误','无法连接到制定的数据库文件!('+ls_dbfname+')',stopsign!)
halt close;
end if
...
三、删除该ODBC设置;
创建公用函数 gf_erase_odbc(string as_odbc_name)
...
通过以上步骤,就不需要通过控制面板中的 ODBC工具来设置了。
您可以考虑以下改进:
1、增加ODBC创建函数的参数设置;
2、自己做一个ODBC的设置工具,可以在系统内运行;
3、ODBC驱动程序可以指定到特定的目录或文件。


//这样一个功能怎么建呢?
首先优两个dropdownlistbox,当选择其中一个中的item后,另外一个dropdownlistbox显示相应与第一个
选择项的内容。例如,一个显示各个中心的名称,当选择其中一个中心名称时,另一个则显示相应中心
的所有部门的名称。
(1)用代参数的dropdownDW更好
(2)我刚实现的。表可以这样建:
手机品牌表:MOBILE 手机型号表:MOBILEMODEL
在dw的itemfocuschanged写如下代码:
Long ll_model
ll_model=dw_edit.getitemnumber(dw_edit.getrow(),'mob_id')
if dwo.name='model_id' and not isnull(ll_model) then
    datawindowchild idwc_model
    dw_edit.GetChild ( "model_id", idwc_model )
    idwc_model.SetTransObject ( SQLCA )
    idwc_model.Retrieve()
//     idwc_model.Setfilter("model_id="+string(ll_model))
idwc_model.Setfilter("mob_id="+string(ll_model))
idwc_model.filter()
end if


//在grid的窗口当中,某列不允许编辑,某列允许编辑
有了以下的方法,不就可以很方便了,各取所需吧
//方法一:
在DataWindow中,列与列之间用Tab键进行移动时,是依据DataWindow为每一列设置的Tb 值来进行移动的。
当某列的Tab值为0时,此列不可编辑,使用户无法对其进行增、删、改等操作。故可将某列的Tab值置为0,
即可让此列设为不可编辑。
方法如下(设columnname为DataWindow中要置成的不可编辑的列名):
dw_1.setorder("columnname",0)
或者在数据窗口的script中用以下语句进行修改:
dw_1.modify(:columnname.tabsequence=0")
或dw_1.modify("#"+string(number)+".tabsequence=0")
该方法的优点是易于实现,缺点是不允许列进行移动。即在Grid风格的DataWindow中,必须不选中
column moving,否则按下tab键时会引起顺序混乱。
//方法二:
可查看列属性中的edit属性,查看style风格。若要将某列置不可编辑,可在该列的edi style="edit"中
选中display only;或者在窗口的script中用以下语句进行修改:
dw+1.modify("columnname.edit. displayonly=Yes)
或dw_1.modify("#"+string(number)+".edit.displayonly=Yes")
若将该列改回可编辑,可在该列的edit style="edit"中,不选中display only;或者在窗口的script中用
以下语句进行修改:
dw_1.modify("columnname.edit.displayonly=No")
该方法也很简单,但同样不允许列移动。
//方法三:
用DataWindow的clicked事件中的方法也可以实现列的保护。若某列不可更改,则可置r otect=0。即:
dw_1.modify("columnname.protect=0")
或dw_1.modify("#"+string(number)+".protect=0")
若要将该列改为可更改,则置protect=1,即:
dw_1.modify(:columnname.protect=1")
或dw_1.modify("#"+string(number)+".protect=1")
此方法不影响Tab键的移动,用户可以随意拉动列,还可在应用过程中自己决定哪一列可编辑,哪一列不可
编辑。


//数据表d_query中有一数据列id,设置为DropDownDW格式,并关联到另一数据表d_info(id,name)。
这样程序运行时显示的数据为name的值, 而dw_1.getitemstring(1,'id') / dw_1.object.date(1,1)
得到的数据是id的值。但现在我想得到name的值,有什么简单的方法?
dw_object.Describe("evaluate('LookUpDisplay("列名")',"+String(行号)+")")
你的就是:
dw_1.Describe("evaluate('LookUpDisplay(id)',1)")


//窗口为w_gcde内,放入一个DW_1,如何得到dw_1内的yuonghu_id列的内容
long lng_column_count
integer i
string str_column[]           //列名
string str_column_text[]          //text的名字
//得到数据窗口的总列数
lng_column_count = long(dw_1.Describe("DataWindow.Column.Count"))
//循环依次读取
for i = 1 to lng_column_count
          str_column[i] = dw_1.Describe("#"+string(i)+".name")
          str_column_text[i] = dw_1.Describe(str_column[i] + "_t.text")
next


//保存报表为excel表
string fpath,fname
int f_s
boolean lb_exist
f_s=GetFileSaveName("请选择需保存的文件名", fpath,fname,"txt","文本文件(*.txt),*.txt,Excel(*.xls),*.xls" )
lb_exist = FileExists(fpath)
if f_s<>1 then
return
elseif lb_exist then
choose case MessageBox("Save","OK to over write file: " + fname,Question!, OKCancel!)
case 1
dw_1.saveas(fname, text!, TRUE)
    messagebox("成功覆盖","成功覆盖文件 "+fname)
case else
messagebox("警告","文件未保存成功")
return
    end choose
else
dw_1.saveas(fname, text!, TRUE)
end if


//PB中怎样把数据写到已经固定格式的EXCEL表中
int i,handle,n
handle = openchannel("Excel",'book1.xls')
if handle < 0 then
messagebox('提示','请打开EXCLE程序! 并打开BOOK1.XLS,且清空该表格!')
return
end if
setremote('r1c1' , '客户欠费分析表'     , handle)
setremote('r2c5' , '统计日期: ' + is_rq1 + ' 至 ' + is_rq2    , handle)
setremote('r3c1' , '排名' , handle)
setremote('r3c2' , '客户码' , handle)
setremote('r3c3' , '客户名称' , handle)
setremote('r3c4' , '应收总额' , handle)
setremote('r3c5' , '欠费总额' , handle)
setremote('r3c6' , '比率' , handle)
setremote('r3c7' , tab_1.tabpage_1.dw_1.object.no1_t.text , handle)
setremote('r3c8' , tab_1.tabpage_1.dw_1.object.no2_t.text , handle)
setremote('r3c9' , tab_1.tabpage_1.dw_1.object.no3_t.text , handle)
setremote('r3c10', tab_1.tabpage_1.dw_1.object.no4_t.text , handle)
setremote('r3c11', tab_1.tabpage_1.dw_1.object.no5_t.text , handle)
for i = 1 to tab_1.tabpage_1.dw_1.rowcount()
setremote("r" + string(i+3) + 'c1' , string(i) , handle)
setremote("r" + string(i+3) + 'c2' ,    tab_1.tabpage_1.dw_1.getitemstring (i , 'khbm') , handle)
setremote("r" + string(i+3) + 'c3' ,    tab_1.tabpage_1.dw_1.getitemstring (i , 'khmc') , handle)
setremote("r" + string(i+3) + 'c4' , string(tab_1.tabpage_1.dw_1.getitemdecimal(i , 'ys')) , handle)
setremote("r" + string(i+3) + 'c5' , string(tab_1.tabpage_1.dw_1.getitemdecimal(i , 'qf')) , handle)
setremote("r" + string(i+3) + 'c6' , string(tab_1.tabpage_1.dw_1.getitemdecimal(i , 'bl')) , handle)
setremote("r" + string(i+3) + 'c7' , string(tab_1.tabpage_1.dw_1.getitemdecimal(i , 'no1')) , handle)
setremote("r" + string(i+3) + 'c8' , string(tab_1.tabpage_1.dw_1.getitemdecimal(i , 'no2')), handle)
setremote("r" + string(i+3) + 'c9' , string(tab_1.tabpage_1.dw_1.getitemdecimal(i , 'no3')) , handle)
setremote("r" + string(i+3) + 'c10', string(tab_1.tabpage_1.dw_1.getitemdecimal(i , 'no4')) , handle)
setremote("r" + string(i+3) + 'c11', string(tab_1.tabpage_1.dw_1.getitemdecimal(i , 'no5')) , handle)
next
closechannel(handle)
messagebox('提示','保存完毕!')


//数据窗口保存为excel的通用函数(决定精彩)
/*========================================================================*/
// 函数名: gf_dw2excel  
// 作用范围: public
/*------------------------------------------------------------------------*/
// 描述: 将数据窗口的数据传递至EXCEL表格中,列数有26列限制(一般情况已经够用了)
/*------------------------------------------------------------------------*/
// 参数:
//       [value] datawindow adw_data    需要保存的数据窗口
//       [value] string as_reptitle     表格标题
/*------------------------------------------------------------------------*/
// 返回值: LONG
/*------------------------------------------------------------------------*/
// 作者: xiaolihua             日期: 2003-05-20
// 修改: DoItNow        日期: 2003.06.06
/*========================================================================*/
CONSTANT Integer ppLayoutBlank = 12
Pointer oldpointer
OLEObject ole_object
ole_object = CREATE OLEObject
String s_english = "ABCDEFGHIJKMNLOPQRSTUVWXYZ"
Integer li_ret
//
//====================================================================
// Script - gf_dw2excel ( datawindow adw_data, string as_reptitle )  
// [Reason]: 由于再已经打开EXCEL的情况下,使用连接OLE时有时出错,所以改为
//             直接连接新的OLE 应用。
//--------------------------------------------------------------------
// [MODIFIED By]: DoItNow    Date: 2003.06.06
//====================================================================
//li_ret = ole_object.ConnectToObject("","Excel.Application")
//IF li_ret <> 0 THEN
// //如果Excel还没有打开,则新建。
li_ret = ole_object.ConnectToNewObject("Excel.Application")
IF li_ret <> 0 THEN
    MessageBox('打开错误','无法连接EXCEL!是否已经安装了EXCEL?错误号:' + String(li_ret))
    RETURN 0
END IF
ole_object.Visible = FALSE     //ole应用服务是否显示
//END IF
//-------MODIFIED END-------------------------------------------------
//
oldpointer = SetPointer(HourGlass!)
ole_object.Workbooks.Add
Long ll_colnum,ll_rownum
String ls_value
String ls_objects,ls_obj,ls_objs[],ls_objtag[],ls_width[]
Long ll_pos,ll_len,ll_num = 0
//Excel表格中的行数为数据窗口行数+2
ll_rownum = adw_data.RowCount() + 2
String ls_colname
Integer i,j
Dec ld_width
ll_colnum = Long(adw_data.Object.DataWindow.Column.Count) //取得字段总数
ls_objtag[1] = "序号"
SetNull(ls_width[1])
i = 1
FOR ll_num = 1 TO ll_colnum
IF adw_data.DESCRIBE("#"+String(ll_num)+".Visible") = "1" THEN //列标志为nun_Visible的不显示
    i = i+1
    ls_obj = adw_data.DESCRIBE("#"+String(ll_num)+".name") //字段名称的实际存储值
    ls_objs[i] = ls_obj
    ls_objtag[i] = adw_data.DESCRIBE(ls_obj    + "_t.text")    //字段名称的显示值
    ls_width[i]    = adw_data.DESCRIBE(ls_obj    + '.width')     //每列的宽度
END IF
NEXT
ll_colnum = i //表格列数
//生成总标题
ole_object.Cells(1,1).value = as_reptitle
ole_object.Range('A1').SELECT
ole_object.Selection.Font.Size = 24
ole_object.Selection.HorizontalAlignment = 3
ole_object.Range('A1:'+Mid(s_english,ll_colnum,1)+'1').select
ole_object.Range('A1:'+Mid(s_english,ll_colnum,1)+'1').Merge
//设置标题栏
FOR i = 1 TO ll_colnum
ls_value = ls_objtag[i]
ole_object.Cells(2,i).value = ls_value
IF IsNull(ls_width[i]) THEN
    ld_width = 12
ELSE
    ld_width = Dec(ls_width[i])/35    //why devided by 35 ???
END IF
ole_object.Columns(i).ColumnWidth = ld_width
ole_object.Columns(i).HorizontalAlignment = 3
ole_object.Columns(i).Borders.LineStyle = 1
ole_object.Columns(i).Font.Bold = TRUE
NEXT
//添充实际数据到EXCEL
String column_name,ls_coltype
FOR i = 3 TO ll_rownum
ole_object.Cells(i,1).Font.Bold = FALSE
ole_object.Cells(i,1).value = i - 2
FOR j = 2 TO ll_colnum
    column_name = ls_objs[j]
    IF adw_data.DESCRIBE(column_name + '.type') = 'column' THEN
     ls_value = adw_data.DESCRIBE("Evaluate('LookupDisplay("+column_name+")',"+String(i - 2)+")")
    END IF
    IF adw_data.DESCRIBE(column_name + '.type') = 'compute' THEN
     ls_value = adw_data.DESCRIBE("Evaluate('" + adw_data.DESCRIBE(column_name + '.expression') + "',"+String(i - 2)+")")
    END IF
  
    ls_coltype = adw_data.DESCRIBE(column_name+'.coltype')
    IF Pos(Upper(ls_coltype),"CHAR") > 0 THEN //对字符型数据处理
     ole_object.Cells(i,j).NumberFormat = "@"
    END IF
    ole_object.Cells(i,j).Font.Bold = FALSE
    ole_object.Cells(i,j).value = ls_value
NEXT
NEXT
//
//====================================================================
// Script - gf_dw2excel ( datawindow adw_data, string as_reptitle )  
// [Reason]: 在PB中保存EXCEL文件
//--------------------------------------------------------------------
// [MODIFIED By]: DoItNow    Date: 2003.05.28
//====================================================================
string sFileName, sFile
integer value
value = GetFileSaveName("另存为",sFileName, sFile,"xls","Excel文件 (*.xls),*.xls" )
IF value = 1 THEN
ole_object.ActiveWorkbook.saveas(sFileName)
ole_object.Displayalerts = FALSE //关闭在退出EXCEL时的保存提示
ole_object.Quit()                  //退出EXCEL
ELSE
messagebox("错误","保存文件出错,请手动保存")
ole_object.Visible = TRUE          //显示ole应用服务
END IF
//-------MODIFIED END-------------------------------------------------
//

SetPointer(oldpointer)
ole_object.DisconnectObject()
DESTROY ole_object
RETURN 1


//九行代码实现表达式计算!
//===========================================================================
//函数功能:返回计算表达式的值
//参数:    string     thestr      计算表达式,如 2 * (3+5)
//返回值:string     retVal      计算表达式的结果值,如 2 * (3+5)的结果值为 16
//        如果是一个不正确的表达式,则返回 false.
//===========================================================================
//作者:饶家洪           时间:2002年11月19日
//===========================================================================
string retVal
datastore lds_evaluate
lds_evaluate = create datastore
lds_evaluate.create('release 8;~r~ntable()')
retVal = lds_evaluate.describe("evaluate('" + thestr + "', 1)")
destroy lds_evaluate
return retVal


//字符串转为数组
/**************************************************************
Powerbuilder 6.5 / 7.0
long StringToArray( readonly string sString,
                 readonly string sSeparator,
                 reference string sOutputArray[] )
This function parses string to array depending on the
string separator. The count of items parsed is returned.
****************************************************************/
LONG lPosEnd, lPosStart = 1, lSeparatorLen, lCounter = 1
IF UpperBound(sOutputArray) > 0 THEN sOutputArray = {""}
lSeparatorLen = len(sSeparator)
lPosEnd = Pos (sString, sSeparator, 1)
DO WHILE lPosEnd > 0
       sOutputArray[lCounter] = Mid (sString, lPosStart, lPosEnd - lPosStart)
       lPosStart = lPosEnd + lSeparatorLen
       lPosEnd = Pos (sString, sSeparator, lPosStart)
       lCounter++
LOOP
sOutputArray[lCounter] = Right (sString, Len(sString) - lPosStart + 1)
RETURN lCounter


//PB中TreeView控件使用技巧(扫肓)
PowerBuilder中的TreeView 控件为树状游览,类似于WINDOWS的资源管理器,其特点是信息项呈树状层次
结构,能更清晰地表现主、细目关系 ,操作非常方便。在应用中可将其与DataWindow 配合使用, 一个
提供信息的分类体系,一个提供具体信息,达到珠连碧合的奇妙效果。它特别适用于多级信息的分类检
索, 是多级菜单所无法比似的,它的表现形式深受程序设计人员和广大用户的喜爱,在许多应用软件中
都能看到她的英姿。
在PowerBuilder下,TreeView 控件的应用较其它控件要复杂得多,刚接触它时往往有些不知所措。但如
果将它的机理搞清楚,掌握它也不是很难的事。下面我结合长白公司图书分类检索的实例,把TreeView
控 件的使用方法和大家探讨一下。
  一、应用TreeView 控件的一般步骤
  1、 建立一个应用,并设好与数据库的接口,这是操作数据库的前提。
  2、 在应用中建一应用窗口W_1,在其上加入二个名为dw_3和dw_4的datawindow控制对象和一个名为
TV_1的TreeView对象。
  3、 修改DW_3属性
  General:把Datawindow object name填写一个已存在的名为DW_date的datawindow(注意:它与
datawindow控制对象是不同的),用于生成树视图项,将其Visible项设为不可见。
  4、 修改DW_4属性
  General:把Datawindow object name填写一个已存在的名为DW_TS的datawindow对象,用于显示查询出
的具体内容。
  5、 编辑TV_1的属性
  TreeView的树视图项不能直接编辑,必须在Script中编写程序。
  Picture:在Picture Name中加入四个不同的图标,用于代表树视图中的两个层次(一、二级)、两种
状态(未选、选中)。
  General:可根据具体应用设定是否选中,其中:
  Delete Items:运行中是否允许删除表项。
  Disable PragDrog: 运行中是否允许拖放表项。
  Edit Labels: 运行中是否允许单击表项来改变表项的标题。   Show Buttons:是否在表项放显示
+-按钮,有示相对的扩展和收缩。
  Hide Selection:当该控件失去焦点时,选中项是否以高亮度显示。
  Show Line:表项间是否加一竖线。
  Lines At Root:所有根层表项是否用竖线连接。
  Indentation:子表项相对于父表项的向右缩进度。
  6、 编写TV_1的Script
  这里是TreeView控件的关键,也是难点。
  二、TreeView 控件的信息构成及创建
  树视图项TreeViewItem是TreeView 控件的基本信息单位,树视图项的生成一般有二种方法,一种是
先生成根层视图项,再在应用中动态生成下级视图项,另一种是把全部树视图项一次和成。两种方法各
有优点,请根据具体情况选用,本例中采用后一种方法。
  1、 树视图项TreeViewItem的主要属性
  Label:String 型,树视图项的显示信息。
  Data:Any型,树视图项的内部值。
  Level:Integer型,树视图项在树视图中级别。
  Children:Boolean 型,它决定该项是否有下一层(如图中书名)。
  PictureIndex:Integer 型,该项非选中时所用的图标在图标队列中的编号。
  SelectedPictureIndex:Integer型,该项选中时所用的图标在图标队列中的编号。  
          2、 生成TreeViewItem项用到的函数
  InsertItemFirst():将加入项作为第一项
  InsertItemLast():将加入项作为最后一项
  InsertItem():将加入项插入到指定项的后面
  InsertItemSort():按顺序放置。
  3、 TreeView的常用事件
  Constructor: 该事件在控件创建时触发,可在这里构造TreeViewItem。
  Click:单击TreeViewItem项时,执行查询程序。
  Double Click: 双击TreeViewItem项时,执行查询程序。
  ItemPopulate 事件: 该事件在某TreeViewItem项首次展开时触发, 触发的同时系统会将 该
TreeViewItem项的句柄通过参数handle 传递过来。它主要用来生成对应项的下层信息项。主要用于第一
种方法。
  三、 事件代码
  1、树视图控件TV_1的constructor事件代码 wanqi 1999.6.28
integer li_rowcount,li_row
string li_current_dn,li_last_dn,li_current_ei,li_last_ei
//声明二个树视图的实例变量
treeviewitem itvi_level_one,itvi_level_two
//long ii_h_l_one
//long ii_h_l_two
dw_3.settransobject(sqlca)//dw_3
为隐含的数据窗口,存有生成树的数据
li_rowcount=dw_3.retrieve()//行数
dw_3.setsort("lb,pm")
dw_3.sort()
//生成树视图的各级树视图项
for li_row=1 to li_rowcount
li_current_dn=dw_3.object.lb[li_row]
//DW_3对象中"LB类别"
li_current_ei=dw_3.object.pm[li_row]
//DW_3对象中"PM品名"
if isnull (li_current_ei) then
li_current_ei=""
end if
if li_current_dn< >li_last_dn then
//IF LB不与一级视图项重复
//设置一级树视图项
itvi_level_one.label=dw_3.object.LB[li_row]
//视图项的显示信息
itvi_level_one.level=1 //级别
itvi_level_one.data=li_current_dn
//视图项的内部信息
itvi_level_one.pictureindex=1
//没选中时所用的图标序号
itvi_level_one.selectedpictureindex=3
//选中时使用的图标序号
itvi_level_one.children=(li_current_ei< >' ')
//树视图是否有下一级
ii_h_l_one=this.insertitemlast(0,itvi_level_one)
//将项加入到一级树的最后一项
end if
//设置二级树视图项
if li_current_dn< >li_last_ei then
if li_current_ei<>' ' then
itvi_level_two.label=dw_3.object.pm[li_row]
itvi_level_two.level=2
itvi_level_two.data=li_current_dn
itvi_level_two.pictureindex=2
itvi_level_two.selectedpictureindex=4
itvi_level_two.data=li_current_ei
itvi_level_two.children=false
ii_h_l_two=this.insertitemlast
(ii_h_l_one,itvi_level_two)
//将项加入到二级树的最后一项
end if
end if
li_last_dn=li_current_dn//设比较项
li_last_ei=li_current_ei
next
  2、tv_1控件的clicked事件代码
string s1
treeviewitem ii
this.getitem(handle,ii)
s1=string(ii.label)
choose case ii.level
case 1
//过滤类别
dw_4.setfilter("lb='"+s1+"'")
dw_4.filter()
case 2
dw_4.setfilter("pm='"+s1+"'")
dw_4.filter()
//过滤书名
end choose

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值