一直以來winform的listview都只是作為數(shù)據(jù)輸出顯示來用, 想要實現(xiàn)數(shù)據(jù)的雙向操作比較難
之前都需要用其他表格類控件實現(xiàn)這個雙擊編輯文本,雙擊實現(xiàn)下拉列表框選擇文本功能, 而且其中有很大一部分是ocx組件,
那么就需要在客戶電腦上regsvr32 注冊它, 這樣就需要管理員權(quán)限, 這樣操作并不是很好,
于是考慮著手動改造listview使其滿足我的需求.
還好, aardio范例里有個數(shù)據(jù)視圖win.ui.grid的庫可供參考, 我就是根據(jù)這個庫內(nèi)的實現(xiàn)方法來升級改造的.
下面我在原listview grid基礎(chǔ)上增加了, 雙擊指定列 可直接編輯文本 / 彈出下拉框選擇文本 功能.

文章插圖
listviewEX.aardio 庫代碼如下:
//listview 擴(kuò)展import win.ui.ctrl.edit;import win.ui.ctrl.combobox;namespace win.ui;class listviewEx{ctor( listview ){this = listview;this.fullRow = 1;this.gridLines = 1;this.columnsEditbox = {};//記錄編輯框列號this.columnsCombobox = {};//記錄下拉框列號和列表值//添加下拉框模板this.addCtrl(combobox = {cls="combobox";font = LOGFONT( h = -19 );left = 0;top = 0;right = 50;bottom = 50;autoResize = false ;hide = 1;edge = 1;mode="dropdownlist";wndproc = function( hwnd, message, wParam, lParam ){var update;var event = owner.event;if( message == 308 ) {update = true;}if( update ){owner.show(false);var t = this.getItemText(event.iItem,event.iSubItem );if( t!= owner.text ){if( this.onEditChanged ) {if( false === this.onEditChanged(owner.text, event.iItem, event.iSubItem))return;}this.setItemText( owner.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;top = 0;right = 50;bottom = 50;autoResize = false ;hide = 1;edge = 1;wndproc = function( hwnd, message, wParam, lParam ){var update;var event = owner.event;if( ( message = 0x8/*_WM_KILLFOCUS*/)|| (message == 0x101/*_WM_KEYUP*/ && wParam == 0xD/*_VK_RETURN*/ ) ) {update = true;}elseif(message == 0x201/*_WM_LBUTTONDOWN*/ ){var x,y = ..win.getMessagePos(lParam)var rc = this.editBox.getClientRect();if( ! ::PtInRect(rc,x,y) ) update = true;this.editBox.capture = !update;}elseif(message == 0x101/*_WM_KEYUP*/){if( wParam == 0xD/*_VK_RETURN*/ ) update = true;elseif( wParam == 0x1B/*_VK_ESC*/){owner.text = this.getItemText(event.iItem,event.iSubItem );update = true;}}if( update ){owner.show(false);var t = this.getItemText(event.iItem,event.iSubItem );if( t!= owner.text ){if( this.onEditChanged ) {if( false === this.onEditChanged(owner.text, event.iItem, event.iSubItem))return;}this.setItemText( owner.text, event.iItem, event.iSubItem );}if(this.onEditEnd){this.onEditEnd(event.iItem, event.iSubItem);}}}})};//繪制下拉框beginCombobox = function(iItem,iSubItem){var combobox = this.combobox;if( ..win.isVisible(combobox.hwnd) ) return;var event = this.combobox.event;if(iItem===null && iSubItem===null) {iItem = event.iItem;iSubItem = event.iSubItem;}else {event = {iItem = iItem;iSubItem = iSubItem;};combobox.event = event;}combobox.items = this.columnsCombobox[iSubItem];combobox.selText=this.getItemText(iItem,iSubItem);var rc=this.getItemRect(iItem,iSubItem,,2/*_LVIR_LABEL*/ );rc.inflate(2,2);combobox.setRect(rc);combobox.showDropDown();return true;};//繪制編輯框beginEdit = function(iItem,iSubItem){var edit = this.editBox;if( ..win.isVisible(edit.hwnd) ) return;var event = 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);var rc=this.getItemRect(iItem,iSubItem,,2/*_LVIR_LABEL*/ );rc.inflate(2,2);edit.setRect(rc);edit.show();edit.setFocus();edit.capture = true;return true;};//設(shè)置下拉框模式 列號/下拉值setcolumnsCombobox = function(iSubItem,tab,...){var c = type(tab) === "table" ? tab : {tab,...}this.columnsCombobox[iSubItem] = c;};//設(shè)置編輯框模式 列號setcolumnsEditbox = function(...){var c = type(...) === "table" ? ... : {...}for(i,idx in c) this.columnsEditbox[idx] = 1;};prenotify = {[0xFFFFFFFD/*_NM_DBLCLK*/] = function(id,code,ptr){var event = 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.combobox.event = event;this.beginCombobox();};};} }/**intellisense()win.ui.listviewEx(__) = 參數(shù)必須指定一個listview控件對象\n返回一個可編輯單元格的列表視圖對象,\n\n鼠標(biāo)左鍵單擊單元格、或者按空格鍵開始編輯,\n回車完成編輯,ESC鍵撤消編輯,回車+上下方向鍵快速移動到其他項,\n用戶完成編輯后會觸發(fā)onEditChanged事件.\n!listview.win.ui.listviewEx() = !win_ui_listviewEx.!win_ui_listviewEx.edit = 實現(xiàn)編輯功能的edit控件\n此功能需要擴(kuò)展listview并實現(xiàn)了編輯功能的的控件才能支持\n!edit.!win_ui_listviewEx.combobox = 實現(xiàn)編輯功能的edit控件\n此功能需要擴(kuò)展listview并實現(xiàn)了編輯功能的的控件才能支持\n!combobox.!win_ui_listviewEx.onEditChanged(text,iItem,iSubItem) = @.onEditChanged = function(text,iItem,iSubItem){__/*控件完成編輯,并且文本已變更,\ntext為改變后的文本,iItem為行號,iSubItem為列號\n此功能需要擴(kuò)展listview并實現(xiàn)了編輯功能的的控件才能支持\n返回false可中止更新顯示文本*/}!win_ui_listviewEx.onEditEnd(iItem,iSubItem) = @.onEditEnd = function(iItem,iSubItem){__/*控件完成編輯*/}!win_ui_listviewEx.setTable(__) = 用listview控件顯示數(shù)據(jù)表\n此函數(shù)會自動清空控件之前的所有項,\n如果沒有創(chuàng)建任何列,則自動創(chuàng)建列\(zhòng)n\n數(shù)據(jù)表應(yīng)當(dāng)包含行組成的數(shù)組,\n每行的數(shù)據(jù)列必須是由列名和列值組成的鍵值對\n數(shù)據(jù)表應(yīng)使用fields包含需要顯示的列名稱數(shù)組\n可以通過fields控制要顯的列、以及要顯示的順序\n\n使用sqlite,access,sqlServer等數(shù)據(jù)庫對象提供的getTable函數(shù)可獲取符合此規(guī)格的數(shù)據(jù)表 !win_ui_listviewEx.setColumns(__) = 用一個字符串?dāng)?shù)組指定要顯示的列\(zhòng)n如果參數(shù)為空則清空所有列!win_ui_listviewEx.setcolumnsCombobox(__) = 可以使用一個或多個參數(shù)指定要禁止編輯的列序號,\n也可以用一個數(shù)組參數(shù)指定多個列序號!win_ui_listviewEx.setcolumnsEditbox(__) = 可以使用一個或多個參數(shù)指定要編輯的列序號,\n也可以用一個數(shù)組參數(shù)指定多個列序號!win_ui_listviewEx.clear() = 清空所有行!win_ui_listviewEx.clear(true) = 清空所有行,并且清空所有列end intellisense**/使用的時候也很簡單, 直接指定哪一列是需要文本編輯, 哪一列需要下拉框編輯即可.還可以指定下拉框內(nèi)容哦【外網(wǎng)使用winform應(yīng)用程序 winform下拉框控件叫什么】
import win.ui;/*DSG{{*/mainForm = win.form(text="testListviewEx";right=740;bottom=315;bgcolor=16777215)mainForm.add(listview={cls="listview";left=13;top=8;right=729;bottom=309;border=1;db=1;dl=1;dr=1;dt=1;font=LOGFONT(h=-13);fullRow=1;gridLines=1;msel=false;vscroll=1;z=1})/*}}*/import consoleconsole.open()import win.ui.listviewEx;var grid = win.ui.listviewEx(mainForm.listview);grid.setcolumnsEditbox(2);grid.setcolumnsCombobox(3,"10","1000","2000","5000");grid.setcolumnsCombobox(4,{"Z+","Z-","ZNP+","ZNP-"});grid.setcolumnsCombobox(5,{"急停","減速停"});grid.onEditChanged = function(text,iItem,iSubItem){console.log("onEditChanged",text,iItem,iSubItem)}import win.imageList;var iml = win.imageList(1,30);mainForm.listview.setImageList( iml,1/*_LVSIL_NORMAL*/ );mainForm.listview.setColumns({"軸號","加減速時間","單脈沖運動量","找零方式","停止方式"},{60,120,120,100,100},{2,2,2,2,2},);var axisData = http://www.wokk.cn/{};for(i=1;20;1){axisData[ i ]={};axisData[ i ][1] ="軸"++i;axisData[ i ][2] = "0.1";axisData[ i ][3] = "1";axisData[ i ][4] = "Z+";axisData[ i ][5] = "急停";}mainForm.listview.items = axisData;mainForm.show();return win.loopMessage();
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 如何使用GoldWave剪裁音樂制作個性鈴聲
- Excel表格自動換行設(shè)置技巧
- 如何靈活調(diào)整路徑
- 讓你的圖片更出彩:PS凸出功能使用指南
- PR軟件中的“橢圓形蒙版”使用指南
- Excel巧操作:如何使用Excel中的時間計算器
- 如何在Word中選擇并使用保持格式跟蹤功能
- Word中如何插入數(shù)學(xué)分式
- 使用IDEA中的RestClient測試接口發(fā)送HTTP請求
- 如何使用PS保存為帶有透明背景的圖片
