改造winform的listview实现双击修改数据editbox和下拉框选择数据combobox功能

这篇具有很好参考价值的文章主要介绍了改造winform的listview实现双击修改数据editbox和下拉框选择数据combobox功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一直以来winform的listview都只是作为数据输出显示来用, 想要实现数据的双向操作比较难

之前都需要用其他表格类控件实现这个双击编辑文本,双击实现下拉列表框选择文本功能, 而且其中有很大一部分是ocx组件, 

那么就需要在客户电脑上regsvr32 注册它, 这样就需要管理员权限, 这样操作并不是很好, 

于是考虑着手动改造listview使其满足我的需求.

还好, aardio范例里有个数据视图win.ui.grid的库可供参考, 我就是根据这个库内的实现方法来升级改造的.

下面我在原listview grid基础上增加了, 双击指定列 可直接编辑文本  / 弹出下拉框选择文本 功能.

改造winform的listview实现双击修改数据editbox和下拉框选择数据combobox功能

 listviewEX.aardio 库代码如下:

//listview 扩展
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;   
    };
    //设置下拉框模式 列号/下拉值
    setcolumnsCombobox = function(iSubItem,tab,...){
        var c = type(tab) === "table" ? tab : {tab,...}
        this.columnsCombobox[iSubItem] = c;
    };
    //设置编辑框模式 列号
    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(__) = 参数必须指定一个listview控件对象\n返回一个可编辑单元格的列表视图对象,\n\n鼠标左键单击单元格、或者按空格键开始编辑,\n回车完成编辑,ESC键撤消编辑,回车+上下方向键快速移动到其他项,\n用户完成编辑后会触发onEditChanged事件.\n!listview.
win.ui.listviewEx() = !win_ui_listviewEx.
!win_ui_listviewEx.edit = 实现编辑功能的edit控件\n此功能需要扩展listview并实现了编辑功能的的控件才能支持\n!edit.
!win_ui_listviewEx.combobox = 实现编辑功能的edit控件\n此功能需要扩展listview并实现了编辑功能的的控件才能支持\n!combobox.
!win_ui_listviewEx.onEditChanged(text,iItem,iSubItem) = @.onEditChanged = function(text,iItem,iSubItem){
    __/*控件完成编辑,并且文本已变更,\ntext为改变后的文本,iItem为行号,iSubItem为列号\n此功能需要扩展listview并实现了编辑功能的的控件才能支持\n返回false可中止更新显示文本*/
}
!win_ui_listviewEx.onEditEnd(iItem,iSubItem) = @.onEditEnd = function(iItem,iSubItem){
    __/*控件完成编辑*/
}
!win_ui_listviewEx.setTable(__) = 用listview控件显示数据表\n此函数会自动清空控件之前的所有项,\n如果没有创建任何列,则自动创建列\n\n数据表应当包含行组成的数组,\n每行的数据列必须是由列名和列值组成的键值对\n数据表应使用fields包含需要显示的列名称数组\n可以通过fields控制要显的列、以及要显示的顺序\n\n使用sqlite,access,sqlServer等数据库对象提供的getTable函数可获取符合此规格的数据表 
!win_ui_listviewEx.setColumns(__) = 用一个字符串数组指定要显示的列\n如果参数为空则清空所有列
!win_ui_listviewEx.setcolumnsCombobox(__) = 可以使用一个或多个参数指定要禁止编辑的列序号,\n也可以用一个数组参数指定多个列序号
!win_ui_listviewEx.setcolumnsEditbox(__) = 可以使用一个或多个参数指定要编辑的列序号,\n也可以用一个数组参数指定多个列序号
!win_ui_listviewEx.clear() = 清空所有行
!win_ui_listviewEx.clear(true) = 清空所有行,并且清空所有列
end intellisense**/

使用也很简单, 只需要指定哪一列是文本框模式, 哪一列是下拉框模式.

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 console
console.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 = {};
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();

主要看上面部分, 上面声明完所有的列功能, 下面还是用listview自己的功能实现代码.

完整示例工程可以去我的博客下载:

 改造listview使其实现表格内编辑框editbox和下拉列表框combobox功能 - 上位机开发笔记一直以来winform的listview都只是作为数据输出显示来用, 想要实现数据的双向操作比较难之前都需要用其他表格类控件实现这个双击编辑文本,双击实现下拉列表框选择文本功能, 而且其中有很大一部分是ocx组件, 那么就需要在客户电脑上regsvr32 注册它, 这样就需要管理员权限, 这样操作并https://aardio.com.cn/t/21395

另外, 如果有更新会在我的博客第一时间更新, 有代码方面的问题也可以去那里跟帖提问.文章来源地址https://www.toymoban.com/news/detail-455511.html

到了这里,关于改造winform的listview实现双击修改数据editbox和下拉框选择数据combobox功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 双击dataGridView控件中的数据行,弹出另一个窗体,并将数据传递到另一个窗体中的方法。实现窗体调用,并数据传输

    //实例化学生明细的窗体 public static frmStudentDetail frmsd; //主窗体双击单元格的事件 private void dgvStudent_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)//双击单元格的事件 { //通过Serverice类中的方法得到学生类 Student objectStudent = StudentService.GetStudentInfo(Convert.ToInt32( dgvStudent.Curr

    2024年02月04日
    浏览(41)
  • [C#] WinForm/WPF 实现数据库连接与操作(MySQL)

    目录 🌿前言 🌿MySQL数据库简介 🌿数据库的基本概念 🌿ADO.NET体系结构 数据提供程序(.NET Framework Data Provider) 程序数据集(DataSet) 🌿数据库的访问形式 🌿数据库的连接 🌿实现增查改删(CRUD)操作 CRUD SQL常用语句 程序实现数据读取操作 程序实现增删改操作 数据库的使用在涉及

    2024年02月09日
    浏览(44)
  • 界面控件DevExpress WinForms Gauge组件 - 实现更高级别数据可视化

    DevExpress WinForms控件包含了超过150个随时可用的仪表盘预设,包括圆形,数字,线性和状态指示器等,来帮助用户实现更高级的数据可视化。 DevExpress WinForms有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于使用的应用程序

    2024年02月06日
    浏览(62)
  • Android Studio实现简单ListView

    效果图 MainActivity PartBean 建议重新建一个软件包 PartAdapter 适配器 建议重新建一个适配器包 activity_main.xml 顶部标题和 ListView pat_manger_item ListView中数据的展示格式

    2024年02月13日
    浏览(42)
  • 【QT】重写QAbstractLIstModel,使用ListView来显示多列数据

    qt提供了几个视图来进行信息的列表显示,QListView可以用来显示继承QStractListModel的字符串列表中的字符串,默认的模型里面只包含一列的内容: 这里以qml为例子,先新建一个qml的项目,示例代码如下: 先创建一个列表的只读模型,以QAbstractListModel为基类,最基础的只用实现

    2024年02月12日
    浏览(45)
  • WPF ListView MVVM模式下数据增加自动滚动到底部

    ListView 设置SelectedIndex属性不会滚动界面,只能通过ScrollIntoView方法设置,所以使用触发器检测 SelectedIndex ,使用扩展属性定义SelectedIndex的行为 手动引入 System.Windows.Interactivity Microsoft.Expression.Interactions xmal中添加声明

    2024年02月14日
    浏览(37)
  • WPF绑定数据,增删改后实时更新TreeView/ListView

    WPF的界面的确好看,也引入了很多新功能,和winform相比更先进更强大......那么狗儿蛋,代价是什么? 代价就是WPF学起来比较费力。 数据绑定是WPF的特色之一,可以省去写代码更新UI界面的工作。这次打算做一个管理数据的小软件,自然的我也打算在界面上弄个TreeView,然后把

    2024年02月09日
    浏览(54)
  • Qt/QML编程之路:ListView实现横排图片列表的示例(40)

     ListView列表,在QML中使用非常多,排列一个行,一个列或者一个表格,都会用到ListView。 ListView显示从内置QML类型(如ListModel和XmlListModel)创建的模型中的数据,或在C++中定义的从QAbstractItemModel或QAbstract ListModel继承的自定义模型类中的数据。 ListView有一个模型和一个委托,前

    2024年01月25日
    浏览(55)
  • excel功能区(ribbonx)编程笔记--3 editbox与状态按钮togglebutton控件

    从上次发布编程笔记2后,反响还不错,短短一个星期,访问量就达到了1500,说明虽然这个只是有写古老,但是再实际的工作中,excel的编程功能还是有或多人关注的,还不是很小众,比如我就是平时的统计就是使用excle,为了更好的实现自动统计,会添加部分vba代码到里面,

    2024年02月09日
    浏览(50)
  • Flutter组件-ListView滑动到指定位置(SingleChildScrollView 实现锚点效果)

    ListView 组件默认内容比较多的时候具有延迟加载的特性。  SingleChildScrollView 不支持基于 Sliver 的延迟实例化模型,也就是使用 SingleChildScrollView  默认没有延迟加载的特性。  SingleChildScrollView 类似于 Android 中的 ScrollView,它只能接收一个子组件,由于默认没  有延迟加载

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包