listviewExx扩展库

By admin at 2020-03-28 • 2人收藏 • 2410人看过

感谢: 巴克队长 分享源码

这个库主要是通过父窗体创建唯一控件,然后修改控件的父窗体为listview实现

原因是lisveiw.addCtrl创建的combobox无法正确利用tracker处理消息(因为combobox是符合控件,由editbox和listbox组成的,其他控件都可以)

//listviewExx拓展
/*这个库主要是通过父窗体创建唯一控件,然后修改控件的父窗体为listview实现
原因是lisveiw.addCtrl创建的combobox无法正确利用tracker处理消息(因为combobox是符合控件,由editbox和listbox组成的,其他控件都可以),先在这里记录,待以后有空了研究
*/
import fonts.fontAwesome;
import win.debounce
import win.imageList
import win.ui.ctrl.combobox; //对于组合控件,动态创建时必须要先导入库
import win.ui.ctrl.datetimepick;
import math
import time

class listviewExx{
    ctor( lvCtrl ){
        this=assert(lvCtrl,"请先指定listview对象");	
        this = lvCtrl;
        this.ctrlSetting={};		//定义一个公共表,用于存放combobox的值
        this.lvClr ={};				//设置背景色和字体颜色		
        this.currentRow=0;  		//当前选中的行号
        this.currentCol=0;			//当前选中的列号
        this.currentCls=false;		//当前显示的cls 
        this.bgclr135 = null;		//奇数行背景颜色
        this.bgclr246 = null;		//偶数行背景颜色
        this.fontclr135 = null;		//奇数行字体颜色
        this.fontclr246 = null;		//偶数行字体颜色
        
        //设置列标题图标
        var iml = ..win.imageList(12,12);  //排序时的小箭头,图像为w24*h12,分割宽度就是w12*h12 的整数倍
        //iml.add('GIF\56\57a \0\15\0\x80\0\0\x80\x80\x80\xff\0\xff\33\xf9\4\0\0\0\0\0\44\0\0\0\0 \0\15\0\0\2\31\x8c\x8f\xa9\xcb\xed\15\xa3\x9c\xb4N\xf0\x80\xde\56k\xbfA\\\xd7\x84 \x97Y\xea\xca\xb6\xee\11\xc7F\1\0;', 0xff00ff);	
        iml.add('\x47\x49\x46\x38\x39\x61\x18\0\x0C\0\x91\0\0\0\0\0\xFF\xFF\xFF\xFF\0\xFF\xFF\xFF\xFF\x21\xF9\x04\x01\0\0\x03\0\x2C\0\0\0\0\x18\0\x0C\0\0\x02\x2C\x94\x05\x09\xC7\x96\x7D\x94\x82\x6E\x41\x29\xE9\x6B\xF3\x4D\x6E\x31\xDB\x18\x46\xE5\x75\x82\x94\xB9\x56\x2D\x92\x92\xAE\x0A\x2E\xDE\x26\xA6\x30\xA6\xE3\xF5\x87\x6A\x65\x0E\x05\0\x3B', 0xff00ff);
        this.setColumnImageList(iml);  
                
        this.setFont(point=12;name='FontAwesome') //font=LOGFONT(h=-18;name='FontAwesome')
        this.setExtended(0x10000/*_LVS_EX_DOUBLEBUFFER*/)//启用双缓冲,避免拖动滚动条时闪烁
        this.gridLines=1
        
        var _tm	= ..time().getMilliTime();
        var _cbb = "combobox"++_tm;
        var _ddl = "ddl"++_tm;
        var _edit = "edit"++_tm;
        var _date = "date"++_tm;
        //var _ckb =  "ckb"++_tm;

        this.parent.add(
            [_cbb ] = {cls="combobox";items={};mode="dropdown";    notify = true;hide=1;vscroll=1;hscroll=1;z=1;};			//动态添加combobox类型按钮控件   
            [_ddl]  = {cls="combobox";items={};mode="dropdownlist";notify = true;hide=1;edge=1;vscroll=1;hscroll=1;z=1;};	//动态添加dropdownlist 类型按钮控件
            //[_ckb]	= {cls="checkbox";text="选定";checked=false;notify = true;hide=1;z=1;};	//动态添checkbox类型按钮控件 
            [_edit] = {cls="edit";hide=1;edge=1;notify = true;z=1;};			//新增编辑功能
            [_date]={cls="datetimepick";hide=1;edge=1;style=2;z=1}    //新增日期控件    		   				
        );
        /*将父窗口空间过继到listview下面来*/
        this.parent[_cbb].setParent(this)
        this.parent[_ddl].setParent(this)
        //this.parent[_ckb].setParent(this)
        this.parent[_edit].setParent(this)
        this.parent[_date].setParent(this)	
            
        /*方便操作,伪装成listview成员*/
        this.combobox = this.parent[_cbb];
        this.dropdownlist = this.parent[_ddl];
        //this.ckbox = this.parent[_ckb];
        this.editbox = this.parent[_edit];
        this.dateBox = this.parent[_date];
        
        
    /*以下处理combobox的消息回调	*/
        this.combobox.blockInnerCmd=false;	//用于控制combobox内部预制的oncommand指令,主要原因是_precommand是只读的
        //this.combobox.itemMustExist=false; //用于控制combobox的item值,当为true,则输入的值必须是item中的值,否则可以自由输入
        var cbbUpdate=..win.debounce(function(){ //延迟刷新combobox值 ;
            this.combobox.blockInnerCmd = true	
            this.combobox.showDropDown(false)
            this.combobox.show(false)
            this.currentCls = false;
            var r,c=this.getCtrlRowAndCol(this.combobox) //根据combobox的位置,计算出所在listview的位置
            var text = this.combobox.text
            try{ this.combobox.itemMustExist = this.ctrlSetting[c][r][["itemMustExist"]] : this.ctrlSetting[c][["itemMustExist"]] }
            //需要严格校验combobox中item必须存在,则修改listview前进行判断
            if(this.combobox.itemMustExist){
                if(!..table.find(this.combobox.items,text)){ //输入的值不是已经存在的值,则不修改原有的listview值
                    text = ""
                    this.combobox.blockInnerCmd = false
                    return ; 
                }
            }
            this.setItemText(text,r,c)
            this.combobox.blockInnerCmd = false
        },100)
        
        this.combobox.sortItems=..win.debounce(function(){  //根据输入值,筛选combobox原始items列表,并替换在本次显示时临时更新
            //对于特别长的列表,可定义该函数,当输入item中关键字后,会自动调用此函数排序结果
            this.combobox.blockInnerCmd = true //阻断消息
            var oItems=this.getCtrlAttr(this.currentCol,this.currentRow)    //获取原始items值
            var text= ..string.replace( this.combobox.editBox.text,"\s","")
            var items = ..table.filter( oItems, lambda(v) ..string.indexOf(v,text) ) 
            this.combobox.listBox.items=items	
            /*延时处理,防止鼠标丢失*/
            this.setTimeout(function(){ 
                this.combobox.showDropDown(text);
                this.combobox.editBox.text=text;
                this.combobox.editBox.setFocus();
                this.combobox.blockInnerCmd = false //重新启用消息				
            })

        },100)
        
        this.combobox._precommand=function(id,event){
            if(this.combobox.blockInnerCmd){return}  //防止下面处理combobox时,会产生无效的消息;这里需要做阻断消息				
            select(event) {
                case 4,9/*1,2,4,8,9,10,11*/{ ///*消息框失去焦点*/
                    cbbUpdate()
                }
                case 5 {  //长列表筛选,可根据输入的关键字筛选结果
                    if(this.combobox.sortItems){
                        this.combobox.sortItems()
                    }
                }					
            }
        };  

         this.dropdownlist._precommand=function(id,event){
            select(event) {
                case 8/*_CBN_CLOSEUP*/{ //消息框失去焦点
                    this.setItemText(this.dropdownlist.selText,this.currentRow,this.currentCol)
                    this.dropdownlist.show(false)
                    this.currentCls = false;
                }					
            }
        };  
          
          this.editbox.wndproc =..win.debounce(function(hwnd, message, wParam, lParam){ //延迟刷新edit值 ;
            var update;
            select(message) {
                case 0x101/*_WM_KEYUP*/ {
                    if( wParam == 0xD/*_VK_RETURN*/ ) update=true;
                    elseif( wParam == 0x1B/*_VK_ESC*/){
                        this.editbox.text = this.editbox.otext //重置为原始字符
                        update=true
                    }                			
                }
                case 0x8/*_WM_KILLFOCUS*/,133 {update=true}
            };
            
            if(update){
                var r,c=this.getCtrlRowAndCol(this.editbox) //根据combobox的位置,计算出所在listview的位置
                this.setItemText(this.editbox.text,r,c)
                this.editbox.show(false)
                this.currentCls = false;
            }	  		
          },50)
          
          /*dateBox回调*/
         this.dateBox._prenotify = function(id,code,ptr){
            select(code) {
                case 0xFFFFFD0F/*_DTN_CLOSEUP*/,0xFFFFFFF8/*_NM_KILLFOCUS*/{ //失去焦点或月历关闭后更新	
                    if(this.dateBox.checked){ //只有启用时间日历控件时才修改值,否则不修改
                        this.setItemText(this.dateBox.text,this.currentRow,this.currentCol)
                        this.dateBox.show(false)
                        this.currentCls = false;						
                    }
                }
            }
        }; 	 
    };
//-----------------------共用功能区部分----------------------------------    
    /*排序*/
    sortItems = function(){
        var sortColumn =this.itemSortColumn;
        var itemData = this.items;
        if(sortColumn<0){
            var i = ..math.abs(sortColumn)
            ..table.sort(itemData,lambda(a) ( owner[i]:"") > (a[i]:"") )
        }
        else {
            ..table.sort(itemData,lambda(a) ( owner[sortColumn]:"") < (a[sortColumn]:"") )
        } 
            
        this.items = itemData;	
        
        this.clearColumnImage()
        this.setColumnImage(..math.abs(sortColumn), sortColumn<0 ? 1 : 0); 
    }
    
    _prenotify = function (id,code,ptr) { //预回调,可能和标准库冲突,慎用
        select(code) {
            case 0xFFFFFF94/*_LVN_COLUMNCLICK*/ { //排序
                this.itemSortColumn := 1;
                var notifyMsg = this.getNotifyMessage(code,ptr)
                if(this.itemSortColumn = notifyMsg.iSubItem) this.itemSortColumn = -notifyMsg.iSubItem; 
                else this.itemSortColumn = notifyMsg.iSubItem; 
                this.sortItems();
            } 
            case 0xFFFFFF4C/*_LVN_BEGINSCROLL*/ { //开始滚动列表,则隐藏当前显示的控件;因为不隐藏控件会显示到别的位置上
                try{
                    this[this.currentCls].show(false)	
                    this[this.currentCls].showDropDown(false)
                }
            }  
            case 0xFFFFFFFE/*_NM_CLICK*/ { 					//单击显示控件
                try{//隐藏上个控件
                    this[this.currentCls].show(false)	
                    this[this.currentCls].showDropDown(false)
                }	
                //保存当前点击的行列号
                this.currentRow,this.currentCol = owner.hitTest()
                owner.showCtrl(this.currentRow,this.currentCol)
            };
            case 0xFFFFFFF4/*_NM_CUSTOMDRAW*/ {
                var lvcd = this.getNotifyCustomDraw(code,ptr);
                if( lvcd.nmcd.dwDrawStage == 0x10001/*_CDDS_ITEMPREPAINT*/) return 0x20/*_CDRF_NOTIFYSUBITEMDRAW*/;					
                elseif( lvcd.nmcd.dwDrawStage == 1/*_CDDS_PREPAINT*/ ) return 0x20/*_CDRF_NOTIFYITEMDRAW*/;
                elseif( lvcd.nmcd.dwDrawStage == ( 0x10001/*_CDDS_ITEMPREPAINT*/ | 0x20000/*_CDDS_SUBITEM*/) ){ 
                    //注意这里 iSubItem 的索引自0开始( 其他函数通常自1开始 )	
                    var r,c=lvcd.nmcd.dwItemSpec,lvcd.iSubItem //获得行列号						
                    if(lvcd.nmcd.rc.bottom){	//bottom底边大于0时,r,c同时加1
                        c++
                        r++		
                        
                        /*更新checkbox控件值*/
                        var value,ctrl=this.getCtrlAttr(c,r)
                        var text = this.getItemText(r,c)
                        if(ctrl=="ckbox" and !#text) this.setItemText(value,r,c)	

                        /*更新字体颜色和背景颜色*/	
                        var clr=this.getclr(r,c)	//注意每次重绘都要对每个设置,不然就是变成对整行整列设置了	
                        /*设置特定的值*/
                        lvcd.clrText = clr.textClr 
                                     : ( r%2 ? this.fontclr135 : this.fontclr246) 
                                     : this.color 
                                     : 0x000000 		
                        lvcd.clrTextBk = clr.bkClr 
                                       : ( r%2 ? this.bgclr135 : this.bgclr246) 
                                       : this.bgcolor 
                                       : 0xffffff
                        lvcd.update()
                        return 0/*_CDRF_DODEFAULT*/		
                    }
                }	
            }
        }
    };
    
    /*
    函数说明:计算控件显示位置
    函数参数:1、row行号;2、col列号;3、csl要显示的控件
    */
    calcRect=function(r,c,cls){
        var rc=this.getItemRect(r,c)
        if(c==1){ //第一列获取的是整行的宽度
            var rc2=owner.getItemRect(r,2)
            rc.right=rc2.left
        }
    
        var rcForm=owner.getRect(true)
        if(cls=="ckbox"){ //复选框需要调整位置
            rcForm.left += 7
            rcForm.top +=2
        }
        
        //计算要显示在的位置
        rc.left += rcForm.left+1
        rc.right += rcForm.left+2
        rc.top += rcForm.top
        rc.bottom += rcForm.top
        return rc; 
    };

    /*
    函数说明:计算控件位置所在的listview行列号,返回row,col
    函数参数:1、ctrlObj
    */
    getCtrlRowAndCol=function(ctrlObj){
        var rc=ctrlObj.getRect(true)		//根据combobox的位置计算出所在listview单元格位置
        return this.hitTest(rc.left+5,rc.top+5,true); 
    };    
      
    /*
    函数说明:设置指定行列的值和控件类型
    函数参数:1、row行号;2、col列号;3、控件默认值;4、控件类型;5、itemMustExist,combobox的输入值是否必须为已存在项目
    */
    setCtrlAttr=function(c,r,value,cls,itemMustExist){ //设置
        this.ctrlSetting[c] := {}
        if(r){
            this.ctrlSetting[c][r]:= {}
            this.ctrlSetting[c][r].value=value
            this.ctrlSetting[c][r]["cls"]=cls			//cls设置为当前列要显示的控件类型
            if(cls=="combobox") this.ctrlSetting[c][r]["itemMustExist"]=itemMustExist //combobox的输入值是否必须为已存在项目
        }else {
            this.ctrlSetting[c]["default"]=value		//default作为列默认值
            this.ctrlSetting[c]["cls"]=cls;				//cls设置为当前列要显示的控件类型  
            if(cls=="combobox") this.ctrlSetting[c]["itemMustExist"]=itemMustExist //combobox的输入值是否必须为已存在项目			
        }  
    };  
    
    /*
    函数说明:获取指定行列的值和控件类型
    函数参数:1、row行号;2、col列号
    函数返回:value,cls
    */
    getCtrlAttr=function(c,r){
        var value=this.ctrlSetting[[c]][[r]][["value"]]	//尝试获取特定值
                  : this.ctrlSetting[[c]][["default"]] 	//不存在时则获取默认值(如果设置过整列)
                  
           var cls =this.ctrlSetting[[c]][[r]][["cls"]]		//尝试获取特定值
                  : this.ctrlSetting[[c]][["cls"]]			//不存在时则获取默认值(如果设置过整列)
        return value,cls; 	
    }; 

    /*
    函数说明:在listview点击的位置,显示设置的控件
    函数参数:1、行号;2、列号
    */
    showCtrl=function(r,c){	
        //获取下拉选项表
        var value,cls=	this.getCtrlAttr(c,r)
        if(!cls or cls="none") return ;  	//没有控件值的,或单独设置不可用的
        this.currentCls=cls;	//记录当前显示的cls值
        var itemText=this.getItemText(this.currentRow,this.currentCol )	
        var rc = this.calcRect(r,c,cls) 	//计算要显示到的位置	
        
        select(cls) {
            case "dropdownlist", "combobox"{
                //this[cls].disabled=false
                this[cls].items=value
                this[cls].selText=itemText
                if(cls=="combobox"){this[cls].text=itemText}
            }		
            case "editbox" {
                this.editbox.otext=itemText;  			//记录原始值
                this.editbox.text=this.editbox.otext;	//设置当前值
            }
            case "ckbox"{ //切换开关状态
                if(..string.startWith( itemText,'\uF05E') ) 	itemText = ..string.replace(itemText,'^\uF05E','\uF05D');	//如果是关状态,则切换为开
                elseif(..string.startWith( itemText,'\uF05D') ) itemText = ..string.replace(itemText,'^\uF05D','\uF05E');	//如果是开状态,则切换为关
                else itemText = value;	//如果未设置过, 则设置默认值
                this.setItemText(itemText,this.currentRow,this.currentCol)
                return ; 
            }
            case "dateBox" {
                this.dateBox.time=#time ? ..time(itemText) : ..time()
                this.dateBox.checked = true //设置默认状态为选中状态
            }
        }	
        this[cls].setRect(rc,true)  	   //winform.combobox.setRect(rc,true)	
        this[cls].show(true)
        this[cls].setFocus()	
    };
    
    /*
    函数说明:设置指定的行,列位置的combobox的Items值;注意设置后,其他控件将不可用
    函数参数:1、items表;2;列号;3、[行号];设置行号则表示对单个单元格设置,否则设置整列;4、itemMustExist输入值是否必须为列表中已存在的值;5、enable=true;默认启用
    */
    setCombobox=function(items,c,r,itemMustExist,enable=true){
        var mode= enable ? "combobox" : "none"
        this.setCtrlAttr(c,r,items,mode,itemMustExist)
    };		   
    /*
    函数说明:设置指定的行,列位置的dropdownlist的Items值;注意设置后,其他控件将不可用
    函数参数:1、items表;2;列号;3、[行号];设置行号则表示对单个单元格设置,否则设置整列;4、enable=true;默认启用
    */
    setDropdownlist=function(items,c,r,enable=true){
        var mode= enable ? "dropdownlist" : "none"
        this.setCtrlAttr(c,r,items,mode)
    };	
     /*
    函数说明:设置指定的行,列位置的ckb的选中值;注意设置后,其他控件将不可用
    函数参数:	1、列号;2、[行号];设置行号则表示对单个单元格设置,否则设置整列;
                3、checked=false;4、text=“要显示的字”;默认为"选定"
                5、enable=true;默认启用
    */
    setCheckbox=function(c,r,checked=false,text="选定",enable=true){
        var value = (checked ? '\uF05D' : '\uF05E') ++ text
        var mode= enable ? "ckbox" : "none"
        this.setCtrlAttr(c,r,value,mode)  //如何修改状态
    };    	
    /*
    函数说明:设置指定的行,列位置可编辑情况;注意设置Editable,其他控件将不可用
    函数参数:1、单独的列号或列的集合;2、[行号];设置行号则表示对单个单元格设置,否则设置整列;4、enable=true;默认启用
    */
    setEditable=function(columnTab,r,enable=true){
        if(type(columnTab)!=type.table) columnTab={columnTab}  //将非tab转换成tab
        var mode= enable ? "editbox" : "none"
        for(i=1;#columnTab;1){
            var c=columnTab[i]
             this.setCtrlAttr(c,r,,mode)
        }    	
    };

    /*
    函数说明:在指定的行,列位置设置日期控件;注意设置Editable,其他控件将不可用
    函数参数:1、列号;2、[行号];设置行号则表示对单个单元格设置,否则设置整列;3、enable=true;默认启用
    */
    setDateBox=function(c,r,enable=true){
        var mode= enable ? "dateBox" : "none"
        this.setCtrlAttr(c,r,"",mode)	
    };

    /*
    函数说明:设置指定行列的文字颜色
    函数参数:1、clr颜色值;2、clrType颜色类型;3、[row行号];4、[col列号]
    */
    setclr=function(clr,clrType,r,c){
       // clrType = "textClr" : "bkClr"
        if(r and c){						//设置单个单元格颜色
            this.lvClr[c] := {}				//初始化列字体色
            this.lvClr[c][r] := {}			//初始化行字体色
            this.lvClr[c][r][clrType]=clr	//记录单元格颜色
        }
        elseif(c){								//设置整列颜色
            this.lvClr[c] := {}					//初始化列字体色
            this.lvClr[c].default := {}			//初始化行字体色
            this.lvClr[c].default[clrType]=clr	//记录单元格颜色  	
        }
        elseif(r){								//设置整行颜色
            this.lvClr.default := {}			//初始化列字体色
            this.lvClr.default[r] := {}			//初始化行字体色
            this.lvClr.default[r][clrType]=clr	//记录单元格颜色    	
        }    
    }; 
    
    /*
    函数说明:获取指定行列的文字颜色和背景颜色
    函数参数:1、row行号;2、col列号
    函数返回:clr={textClr=;bkClr=}
    */
    getclr=function(r,c){
        var clr={}
          clr.textClr = this.lvClr[[c]][[r]][["textClr"]] 			//直接获取颜色值
                      : this.lvClr[[c]][["default"]][["textClr"]]	 	//不存在则获取列默认值
                      : this.lvClr[["default"]][[r]][["textClr"]]		//不存在则获取行默认值
                      //这里有个问题,如果行和列都设置过颜色,那么只能已列的颜色为主,行颜色无效了,待解决后设置的生效
                      
          clr.bkClr = this.lvClr[[c]][[r]][["bkClr"]] 				//直接获取颜色值
                    : this.lvClr[[c]][["default"]][["bkClr"]]	 		//不存在则获取列默认值
                    : this.lvClr[["default"]][[r]][["bkClr"]]			//不存在则获取行默认值
                      //这里有个问题,如果行和列都设置过颜色,那么只能已列的颜色为主,行颜色无效了,待解决为后设置的生效
        return clr;   
    }; 
    
    /*函数说明:设置指定行列的背景颜色;函数参数:1、clr;2、[row行号];3、[col列号]*/ 
    setBkclr=function(clr,r,c){	this.setclr(clr,"bkClr",r,c)    };    
    
    /*函数说明:设置指定行列的文字颜色;函数参数:1、clr;2、[row行号];3、[col列号]*/
    setTextclr=function(clr,r,c){	this.setclr(clr,"textClr",r,c)	};	    
    
     /*函数说明:获取指定列的值;函数参数:col列号*/        
    getOneColumnText=function(c){
        var text={}
        for(i=1;#this.items;1){
            var line=this.items[i]
            ..table.push(text,line[c])
        }
         return text; 	
    };	  
     
    /*函数说明:获取指定行的值;函数参数:row列号*/    
    getOneRowText=function(r){ return this.items[[r]];}; 
     
    /*函数说明:设置标题值;函数参数:title={{t1;t2;t3};{width1;width2;width3}}*/        
    setTitle=function(titles){
        var text=titles[1]
        var widths=titles[2]
        for(i=1;#text;1){
            this.insertColumn(text[i],widths[[i]])
        }
    };
    
    /*函数说明:显示或隐藏列标题;函数参数:true|false*/        
    showHead=function(flag=true){
        if(flag) this.modifyStyle(0x4000/*_LVS_NOCOLUMNHEADER*/);
        else	this.modifyStyle(,0x4000/*_LVS_NOCOLUMNHEADER*/);	
    };
    
    /*设置行高,参数h[=15]*/   
    setRowHeight = function(h=15){
        var imageList = ..win.imageList(1, h);//行高
        this.setImageList( imageList, 1/*_LVSIL_SMALL*/);
    };
    
    /*设置文本大小,参数h[=15]*/   
    setFontSize = function(s=15){
        this.setFont({point=s});
        this.redraw()
    };		
}


/**intellisense()
listviewExx=listview拓展库
listviewExx(__listview)=包装一个listview,为其增加各种控件\n参数listview控件
listviewExx()=!lvEx.
listviewExx=!listview.
end intellisense**/

/**intellisense(!lvEx.)
currentRow=当前显示控件在listview中的行号,设置后
currentCol=当前显示控件在listview中的列号
combobox=listview的combobox控件文本编辑框\n!combobox.
dropdownlist=listview的dropdownlist控件文本编辑框\n!combobox.
editbox=listview的文本编辑框\n!edit.
ckbox=listview的复选框\n!checkbox.
dateBox=listview的日期时间控件\n!datetimepick.
showCtrl(.(r,c)=在listview点击的位置,显示设置的控件,一般情况下不用调用此函数\n函数参数:1、行号;2、列号
setCombobox(.(items,c,r,itemMustExist,enable)=设置或修改指定的行,列位置的combobox的Items值;注意设置后,其他控件将不可用\n1、items表;\n2;列号;\n3、行号[可选],使用则表示对单个单元格设置,否则设置整列;\n4、itemMustExist输入的列表值必须已经存在(相当于一个可以输入值进行筛选的ddl用了);\n5、enable=true;默认启用
setDropdownlist(.(items,c,r,enable)=设置或修改指定的行,列位置的dropdownlist的Items值;注意设置后,其他控件将不可用\n1、items表;2;列号;3、行号[可选],使用则表示对单个单元格设置,否则设置整列;4、enable=true;默认启用
setEditable(.(columnTab,r,enable)=设置指定的行,列位置可编辑情况;注意设置Editable,其他控件将不可用\n函数参数:1、单独的列号或列的集合;2、[行号];设置行号则表示对单个单元格设置,否则设置整列;4、enable=true;默认启用
setCheckbox(.(c,r,checked,text,enable) = 设置指定的行,列位置的ckb的选中值;注意设置后,其他控件将不可用\n参数1、列号;\n参数2、[行号];设置行号则表示对单个单元格设置,否则设置整列;\n3、checked=false;\n4、text=“要显示的字”;默认为"选定"\n5、enable=true;默认启用
setDateBox(.(c,r,enable)=在指定的行,列位置设置日期控件;注意设置Editable,其他控件将不可用\n参数:1、列号;\n参数2、[行号];设置行号则表示对单个单元格设置,否则设置整列;\参数3、enable=true;默认启用
setBkclr(.(clr,r,c)=设置指定行列的背景颜色\n函数参数:1、clr;2、[row行号];3、[col列号]\n同时使用行列则设置指定单元格,只使用一个话,若只指定行或列则表示整行或整列
setTextclr(.(clr,r,c)=设置指定行列的文字颜色\n函数参数:1、clr;2、[row行号];3、[col列号]\n同时使用行列则设置指定单元格,只使用一个话;若只指定行或列则表示整行或整列
getOneColumnText(__c)=获取指定列的值;参数:col列序号\n即使无效的列序号也会返回空表
getOneRowText(__r)=获取指定行的值;参数:row行序号\n无效的行序号也会返回null
getCtrlAttr(.(c,r)=获取指定行列的值(value|items)和控件类型(cls)\n函数参数:1、row行号;2、col列号\n函数返回:value,cls
setCtrlAttr(.(c,r,value,cls)=设置指定行列的值和控件类型\n函数参数:1、row行号;2、col列号;3、控件默认值;4、控件类型;\n5、itemMustExist,combobox的输入值是否必须为已存在项目,仅对cbb有效
showHead(__true)=添加或移除列标题,true=移除;false=添加
setRowHeight(__15)=设置行高,参数h[=15]
setFontSize(__15)=设置文本大小,参数s[=15]
sortItems() = @.sortItems=function(){/*自定义点击列标题时的排序函数,默认按ansi大小排序*/\n}

end intellisense**/

/**intellisense()
!lvEx.setTitle(title)=@.setTitle({/*设置标题值*/\n{"序号";"姓名";"性别"};\n{200;200;-1}\n})
!lvEx.bgclr135 =  @.bgclr135 = 0xeecc66;/*奇数行颜色*/
!lvEx.bgclr246 =  @.bgclr246 = 0x66ccee;/*偶数行颜色*/
!lvEx.fontclr135 =  @.fontclr135 = 0xff4400;/*奇数行字体颜色*/
!lvEx.fontclr246 =  @.fontclr246 = 0x0044ff;/*偶数行字体颜色*/
!lvEx.combobox.blockInnerCmd=用于控制combobox内部预制的oncommand指令,如果需要额外写listview.combobox.oncommand,请将此项设为true
!lvEx.combobox.itemMustExist=用于控制combobox的item值,当为true,则输入的值必须是item中的值,否则可以自由输入
!lvEx.combobox.sortItems() = @.sortItems=/*删除这个大括号->->*/{
    win.debounce(function(){
        /*对于有特别多的item的combobox,可定义该函数,当输入值发生变化(_CBN_EDITCHANGE)时会自动调用此函数排序结果*/
        owner.blockInnerCmd = true /*阻断消息*/
        var oItems=owner.parent.getCtrlAttr(owner.parent.currentCol,owner.parent.currentRow)    /*获取原始items值*/
        var text= string.replace( owner.editBox.text,"\s","")
        if(!#text){ /*输入内容被清空*/
            owner.items=oItems
        }else {
            var items = {}
            for(i=1;#oItems;1){
                if(string.indexOf(oItems[i],text)){
                    table.push(items,oItems[i])
                }
            }
            owner.items=items
        }
        owner.showDropDown(text);
        owner.blockInnerCmd = false /*重新启用消息*/
    },200)
    /*删除这个大括号->->*/}
end intellisense**/


使用简单示例:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
listview={cls="listview";left=95;top=69;right=643;bottom=352;edge=1;z=1}
)
/*}}*/

import listviewExx;
var lst = listviewExx(winform.listview)

lst.setTitle({/*设置标题值*/
{"序号";"姓名";"性别"};
{200;200;-1}
})


lst.addItem( { 
	text={"第一行内容";"1";"1,2"} 
} )
lst.addItem( { 
	text={"第二行内容";"2";"2,2"} 
} )
lst.addItem( { 
	text={"第三行内容";"3";"3,2"} 
} )

lst.setTextclr(0x0000FF,1,2)
lst.bgclr246 = 0x66ccee;/*偶数行颜色*/
lst.bgclr135 = 0xFFF0E6;/*奇数行颜色*/
lst.setCheckbox(2,1,true,"checkbox");



winform.show();
win.loopMessage();
return winform;

image.png

3 个回复 | 最后更新于 2021-08-22
2020-09-02   #1

你好,排序部分,对于数字的排序比如:1,16,6,60这种有问题,能够修改一下吗?谢谢

2021-08-06   #2

zan

2021-09-05   #3

使用控件后窗口最大化、改变窗口大小时回出现控件抖动问题

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...