winform 下拉框(改造winform的listview控件内置下拉框
操作系统 2023-07-23 16:25www.caominkang.comlinux操作系统
一直以来inform的listvie都只是作为数据输出显示来用, 想要实现数据的双向操作比较难
之前都需要用其他表格类控件实现这个双击编辑文本,双击实现下拉列表框选择文本功能, 而且其中有很大一部分是ocx组件,
那么就需要在客户电脑上regsvr32 注册它, 这样就需要管理员权限, 这样操作并不是很好,
于是考虑着手动改造listvie使其满足我的需求.
还好, aardio范例里有个数据视图in.ui.grid的库可供参考, 我就是根据这个库内的实现方法来升级改造的.
下面我在原listvie grid基础上增加了, 双击指定列 可直接编辑文本 / 弹出下拉框选择文本功能.
listvieEX.aardio 库代码如下:
//listvie 扩展importin.ui.ctrl.edit; importin.ui.ctrl.bobox; namespace in.ui; classlistvieEx{ ctor( listvie ){ this= listvie; this.fullRo = 1; this.gridLines = 1; this.columnsEditbox = {};//记录编辑框列号this.columnsCombobox = {};//记录下拉框列号和列表值//添加下拉框模板this.addCtrl( bobox = { cls="bobox";font = LOGFONT( h = -19);left = 0; = 0; right = 50;bottom = 50;autoResize = false;hide = 1;edge = 1;mode="dropdonlist"; ndproc = function( hnd, message, Param, lParam ){ varupdate; varevent = oner.event; if( message == 308) { update = true; } if( update ){ oner.sho(false); vart = this.getItemText(event.iItem,event.iSubItem ); if( t!= oner.text ){ if( this.onEditChanged ) { if( false=== this.onEditChanged(oner.text, event.iItem, event.iSubItem)) return; } this.setItemText( oner.text, event.iItem, event.iSubItem ); } if(this.onEditEnd){ this.onEditEnd(event.iItem, event.iSubItem); } } } } ); //添加编辑框模板this.addCtrl( editBox = { cls="edit";font = LOGFONT( h = -19);left = 0; = 0; right = 50;bottom = 50;autoResize = false;hide = 1;edge = 1; ndproc = function( hnd, message, Param, lParam ){ varupdate; varevent = oner.event; if( ( message = 0x8/_WM_KILLFOCUS/) || (message == 0x101/_WM_KEYUP/&& Param == 0xD/_VK_RETURN/) ) { update = true; } elseif(message == 0x201/_WM_LBUTTONDOWN/){ varx,y = ..in.getMessagePos(lParam) varrc = this.editBox.getClientRect(); if( ! ::PtInRect(rc,x,y) ) update = true; this.editBox.capture = !update; } elseif(message == 0x101/_WM_KEYUP/){ if( Param == 0xD/_VK_RETURN/) update = true; elseif( Param == 0x1B/_VK_ESC/){ oner.text = this.getItemText(event.iItem,event.iSubItem ); update = true; } } if( update ){ oner.sho(false); vart = this.getItemText(event.iItem,event.iSubItem ); if( t!= oner.text ){ if( this.onEditChanged ) { if( false=== this.onEditChanged(oner.text, event.iItem, event.iSubItem)) return; } this.setItemText( oner.text, event.iItem, event.iSubItem ); } if(this.onEditEnd){ this.onEditEnd(event.iItem, event.iSubItem); } } } } ) }; //绘制下拉框beginCombobox = function(iItem,iSubItem){ varbobox = this.bobox; if( ..in.isVisible(bobox.hnd) ) return; varevent = this.bobox.event; if(iItem===null&& iSubItem===null) { iItem = event.iItem; iSubItem = event.iSubItem; } else{ event = { iItem = iItem; iSubItem = iSubItem; }; bobox.event = event; } bobox.items = this.columnsCombobox[iSubItem]; bobox.selText=this.getItemText(iItem,iSubItem); varrc=this.getItemRect(iItem,iSubItem,,2/_LVIR_LABEL/); rc.inflate(2,2); bobox.setRect(rc); bobox.shoDropDon(); returntrue; }; //绘制编辑框beginEdit = function(iItem,iSubItem){ varedit = this.editBox; if( ..in.isVisible(edit.hnd) ) return; varevent = this.editBox.event; if(iItem===null&& iSubItem===null) { iItem = event.iItem; iSubItem = event.iSubItem; } else{ event = { iItem = iItem; iSubItem = iSubItem; }; edit.event = event; } edit.text=this.getItemText(iItem,iSubItem); varrc=this.getItemRect(iItem,iSubItem,,2/_LVIR_LABEL/); rc.inflate(2,2); edit.setRect(rc); edit.sho(); edit.setFocus(); edit.capture = true; returntrue; }; //设置下拉框模式 列号/下拉值setcolumnsCombobox = function(iSubItem,tab,...){ varc = type(tab) === "table"? tab : {tab,...} this.columnsCombobox[iSubItem] = c; }; //设置编辑框模式 列号setcolumnsEditbox = function(...){ varc = type(...) === "table"? ... : {...} for(i,idx inc) this.columnsEditbox[idx] = 1; }; prenotify = { [0xFFFFFFFD/_NM_DBLCLK/] = function(id,code,ptr){ varevent = this.getNotifyMessage(code,ptr); if( ! event.iItem && event.iSubItem ) return; //启用 编辑框if( this.columnsEditbox[event.iSubItem] ){ this.editBox.event = event; this.beginEdit(); }; //启用 下拉框if( this.columnsCombobox[event.iSubItem] ){ this.bobox.event = event; this.beginCombobox(); }; }; } } /intellisense() in.ui.listvieEx(__) = 参数必须指定一个listvie控件对象\n返回一个可编辑单元格的列表视图对象,\n\n鼠标左键单击单元格、或者按空格键开始编辑,\n回车完成编辑,ESC键撤消编辑,回车+上下方向键快速移动到其他项,\n用户完成编辑后会触发onEditChanged事件.\n!listvie. in.ui.listvieEx() = !in_ui_listvieEx. !in_ui_listvieEx.edit = 实现编辑功能的edit控件\n此功能需要扩展listvie并实现了编辑功能的的控件才能支持\n!edit. !in_ui_listvieEx.bobox = 实现编辑功能的edit控件\n此功能需要扩展listvie并实现了编辑功能的的控件才能支持\n!bobox. !in_ui_listvieEx.onEditChanged(text,iItem,iSubItem) = @.onEditChanged = function(text,iItem,iSubItem){ __/控件完成编辑,并且文本已变更,\ntext为改变后的文本,iItem为行号,iSubItem为列号\n此功能需要扩展listvie并实现了编辑功能的的控件才能支持\n返回false可中止更新显示文本
电脑操作系统
- 电脑系统一键重装 电脑系统一键重装软件排行榜
- win10一键还原和重装系统 win10一键还原和重装系统
- 开机按f12怎么重装系统 电脑按f12怎么重装系统
- 大白菜一键重装系统 大白菜一键重装系统怎么样
- u盘重装win10系统步骤 u盘重装win10步骤知乎
- win7官方纯净版系统 win7纯净版系统哪个最好
- win10系统安装教程 win10系统安装教程u盘怎么制作
- 电脑系统坏了怎么修复 电脑系统坏了怎么修复
- 最干净的一键重装系统 一键重装系统哪个好知乎
- 新手自己用u盘怎么装系统 怎样从u盘安装系统到
- win7怎么升级到win10系统 win7怎么升级到win10系统不
- u盘启动盘怎么装系统 u盘启动盘怎么装系统dell
- 电脑死机 电脑死机重启无法开机
- 电脑数据恢复 电脑数据恢复软件免费版破解版
- 怎么看电脑型号 怎么看电脑型号配置
- 手机怎么连接电脑 手机怎么连接电脑热点共享网