本帖最后由 ivccav 于 2018-7-16 20:09 编辑
个人偏爱于使用Listview,因为其美观易用,但Listview的缺点也很明显,即其内容无法直接编辑,多数人只能用Listview来呈现数据,而使用子窗体来实现编辑的功能。用子窗体编辑数据当然也是一个不错的方法,但如果能直接在Listview上面编辑数据,会更方便些。
本帖使用Listview+InkEdit两个控件实现Listview的功能如下(程序和窗体在办公室的XP系统+Excel2003完成,在家用Win7+Excel2007打开,无版本问题,能顺利运行程序):
1.单击(或设定双击)Listview控件的数据区域,可直接编辑数据(已在代码中同步到Excel数据源);
2. InkEdit控件处于编辑状态时,滚动鼠标滚轮,或拖动Listview的水平或垂直滚动条,能自动隐藏InkEdit控件,并保存已编辑内容;
3. InkEdit控件处于编辑状态时,点击窗体上Textbox等控件时,能自动隐藏InkEdit控件,并保存已编辑内容;
3.实现InkEdit控件的键盘功能。按回车键,保存修改并退出;按ESC键,不保存修改并退出;按上下左右方向键,能自动移动到同一列的上下行位置,或同一行的左右位置,并处于编辑状态,当控件处于Listview边框位置,能确保InkEdit完全可见;
4.可设置Listview指定列是否可编辑。
程序使用了极少量的API,光都是看名字就知道函数用途的API,绝对不会影响对程序的理解和使用。
本帖的方法很简单,代码量很少,但对于我这样的非资深使用者而言,只能在实践中慢慢琢磨,哪天灵光乍现,就完善一下功能。不久前看过一本关于Win32 API的书籍,对本帖问题的解答有很大帮助。阅读是能扩展视野的,哪怕只看过一遍,你一点也不精通那些知识,但在遇到问题时,曾经学习过的知识也能给你提供思路,让你能更容易地找到解答方法。
一些说明:
1.计算InkEdit的位置 Listview标题和Listitem项目的Left不是相同的坐标系,在水平滚动条滚动到右边时,标题的Left是正值,而Listitem的Left是负值。在水平滚动条未滚动时,Listitem的第一列的Left是1.5磅,而不是0,因此计算InkEdit的Left时要加1.5。水平滚动条的值可不用API获取,直接用Abs(Listview1 .SelectedItem.Left-1.5)即可获得。 Listitem项目的Top值跟鼠标事件中的Y值一样,只是所选项目上边到Listview边缘的距离,不包括垂直滚动条已经“卷起来”的数值。
2.指定可编辑的列 在窗体初始化过程中,使用strAllowEditCol = "7/8/9" '即可指定Listview的7至9列可编辑,而不指定该参数时则所有列可编辑。
3. 'InkEdit1的MultiLine,BackColor和.BorderStyle在代码中设置时提示只读属性,只可在设计窗体时设置。如果需要设置的话请在窗体设计时设置好。
4.InkEdit控件在窗体设计时要点击右键——上移一层,不然可能会被Listview覆盖。可在窗体初始化时加一句:InkEdit1.ZOrder 0,这样InkEdit就会在最上一层。
更新说明 2018/7/9 11:17:
1.移除1句漏删的语句,点其他控件时完美切换; 2.增加了模糊匹配的DEMO,可直接使用于实际。
之前下载过的朋友可重新下载。
更新说明 2018/7/16 20:09
1.更正了计算InkEdit的Left的算法错误;
2.增加了新增和删除行功能,实现完全的增删改查;
3.应部分网友要求,增加了数据库版本。
补充内容 (2023-3-25 13:29):
使用纯代码实现Listview控件网格线颜色、行高和选中行高亮颜色的设置
https://club.excelhome.net/thread-1657761-1-1.html |