旧版本

2012年分享过XPTable的一个版本源码,其中包含了我对其若干bug的修正。链接在此:.Net强大的列表控件XPTable

Github上别人的更新

Github最新源码地址:https://github.com/schoetbi/XPTable

我的最新修改

之前根据1.1修改的版本虽然部分bug得到了解决,但仍有不尽人意的地方,比如依然有隐藏的bug、不支持多级列表展开、不支持皮肤换色、不支持ProgressBarColumn自定颜色、不支持滚动条风格修改、不支持列拖动等。后来2013年下载了一个1.2.2版本源码,有了二级列表即分组功能(Group),但问题多多,包括我之前修正的bug依然存在。没办法,动手术吧。刚统计了一下,前后陆陆续续修改带添加文件共18个,有修改注释的定位有191处,最终达成如下:

  • 修正“遇到”的所有bug
  • .Net2.0及以上各版本均可用
  • 完善修正Group功能(此新功能也bug重重)
  • 支持皮肤换色
  • 支持ProgressBarColumn自定颜色
  • 支持滚动条风格修改并指定滚动条颜色
  • 支持列拖动调整顺序

现在这个XPTable已基本可用。Github上的1.6版本,不知解决了哪些问题增加了哪些新功能,我已不想去探究,因为在改代码的路上走得太远,已无力合并新版版了。

下面给一个示例,设置如下深色风格,进度条颜色可自定,并且group那一行的完成率可以不显示(实际是0%)

拖动列调整顺序:

源码

源码及示例代码下载链接:XPTable_Fixed源码及示例代码
示例实现代码如下,展示了如何利用TableCtrl方便使用XPTable,如添加列表头、Group行及其子行、删除行、设置Cell的前景和背景色、高效更新列表等。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions;using XPTable;
using XPTable.Models;
using XPTable.Editors;
using XPTable.Renderers;namespace Test
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){var tbl = table1;TableCtrl.InitTable(ref table1);table1.AllowMoveHeader = true;                  //允许拖动列表头改变列顺序table1.ProgressBarColor = Color.DarkOrange;     //设置ProgressBarColumn进度条的颜色/**********设置XPTable颜色风格**********/table1.BackColor = Color.FromArgb(50, 50, 70);table1.ForeColor = Color.WhiteSmoke;table1.AlternatingRowColor = Color.FromArgb(50, 60, 90);//表头背景色用渐变风格var header = new GradientHeaderRenderer();table1.HeaderRenderer = header;header.ForeColor = Color.WhiteSmoke;header.StartColor = Color.FromArgb(100, 100, 120);header.EndColor = table1.BackColor;//添加ColumnTableCtrl.AddGroupColumn(ref table1, new GroupColumn("", 20));      //添加GroupColumn,parent row会出现一个+号,展开为-号TableCtrl.AddColumn(ref table1, new TextColumn("姓名", 90), false, true, ColumnAlignment.Center);TableCtrl.AddColumn(ref table1, new TextColumn("性别", 90), false, true, ColumnAlignment.Center);TableCtrl.AddNumColumn(ref table1, new NumberColumn("年龄", 60), true, true, false, 0, 100, "#0", ColumnAlignment.Center);TableCtrl.AddColumn(ref table1, new TextColumn("院系", 90), false, true, ColumnAlignment.Center);TableCtrl.AddNumColumn(ref table1, new NumberColumn("分数", 60), false, true, false, 0, 100, "###,##0.00", ColumnAlignment.Right);var pbcol = new ProgressBarColumn("完成率%", 200, true, false); //后俩参数表示显示百分比,但当值为0时不显示TableCtrl.AddColumn(ref table1, pbcol, false, true, ColumnAlignment.Center);ShowData();}private void ShowData(){table1.BeginUpdate(); //BeginUpdate()和EndUpdate()可以提高列表更新效率,数据更新完后,最后刷新一次,否则每一个数据修改都会触发列表刷新,效率低下。var key = "group1";var rowGroup = TableCtrl.AddNewRow(ref table1, key);TableCtrl.SetTableValue(ref table1, rowGroup, "姓名", "组1");for (int i = 1; i < 4; i++){AddChildRow(table1, rowGroup, "小强" + i, "男", 25, "数学系", 50.896 + i * 3, 45.9 + i * 3);AddChildRow(table1, rowGroup, "婷婷" + i, "女", 22, "英语系", 98.656, 99 + i);}rowGroup.ExpandSubRows = true;  //展开Groupkey = "group2";rowGroup = TableCtrl.AddNewRow(ref table1, key);TableCtrl.SetTableValue(ref table1, rowGroup, "姓名", "组2");for (int i = 1; i < 10; i++){AddChildRow(table1, rowGroup, "大熊" + i, "男", 26, "法律系", 70.666 - i * 7, 25 + i);AddChildRow(table1, rowGroup, "芳芳" + i, "女", 21, "哲学系", 97.888, 65 + i);}rowGroup.ExpandSubRows = true;  //展开Grouptable1.EndUpdate();}private void AddChildRow(Table tbl, Row rowGroup, string name, string gender, int age, string department, double score, double ratio){var key = name;var rowChild = TableCtrl.AddNewRow(ref tbl, rowGroup, key);TableCtrl.SetTableValue(ref tbl, rowChild, "姓名", name);TableCtrl.SetTableValue(ref tbl, rowChild, "性别", gender);TableCtrl.SetTableValue(ref tbl, rowChild, "年龄", age);TableCtrl.SetTableValue(ref tbl, rowChild, "院系", department);TableCtrl.SetTableValue(ref tbl, rowChild, "分数", score);TableCtrl.SetTableValue(ref tbl, rowChild, "完成率%", Convert.ToInt32(ratio)); //ProgressBarColumn只支持int型数据if (gender == "男")TableCtrl.SetCellBackColor(ref tbl, rowChild.Index, "性别", Color.DarkGreen); //设置Cell的背景色elseTableCtrl.SetCellBackColor(ref tbl, rowChild.Index, "性别", Color.DarkRed);   //设置Cell的背景色if (score < 60)TableCtrl.SetCellForeColor(ref tbl, rowChild.Index, "分数", Color.Red);       //设置Cell的前景色}private bool IsExist(string name, List<string> names){foreach (var s in names){var r = Regex.Match(name, string.Format(@"^{0}\d+.*", s));if (r.Success)return true;}return false;}private void button1_Click(object sender, EventArgs e){table1.BeginUpdate();//演示如何更新某些行,并删除没更新的行,适用于全量更新列表,删除不再需要的行TableCtrl.SetDeleteTag(table1);     //这会改变row.Tag,如果你的row.Tag有他用,则不便这么使用var names = new List<string>() { "小强", "芳芳" };  //保留小强和芳芳所在行foreach (Row row in table1.TableModel.Rows){var name = TableCtrl.GetTableValueString(table1, row.Index, "姓名");if (IsExist(name, names) || name.IndexOf("组") == 0){//TODO:根据更新此行数据TableCtrl.RemoveDeleteTag(table1, row.Index);  //避免此行被删除, 也可以直接修改row.Tag,比如row.Tag = name;}}TableCtrl.DeleteRowsByTag(table1); //删除所有要删除的行table1.EndUpdate();}private void button2_Click(object sender, EventArgs e){var key = "婷婷2";var row = TableCtrl.GetTableRowByKey(ref table1, key);if (row != null){TableCtrl.RemoveRow(ref table1, row);}}private void button3_Click(object sender, EventArgs e){TableCtrl.RemoveRowAll(ref table1);}}
}

.Net强大的列表控件XPTable【进阶版】相关推荐

  1. 安卓进阶系列-05列表控件(RecyclerView)的使用

    RecyclerView的使用 前言 在之前的博客中我介绍了ListView如何使用,当然那部分博客由于没有考虑基础的问题,写的跨度太大,后面我会全部重构的. ListView是一个滑动列表控件,随着 ...

  2. Android ExpandableListView 展开列表控件(手机QQ好友列表)

    你是否觉得手机QQ上的好友列表那个控件非常棒?  不是.....   那也没关系, 学多一点知识对自己也有益无害. 那么我们就开始吧. 展开型列表控件, 原名ExpandableListView 是普 ...

  3. Android列表控件选项中添加进度框ProgressBar实现

        今天有时间就学习了下在ListView.GridView列表项中清加ProgressBar,小马用最简单的代码实现可以通用的功能,人人都能看懂,哈哈,直接说下,如果你的适配器getView方法 ...

  4. 免费超高速卡片式病人基本信息列表控件

    C#写的免费超高速卡片式病人基本信息列表控件,以卡片的方式列出病人基本信息.性能卓越,瞬间填充上千个项目. 下载地址http://files.cnblogs.com/xdesigner/Patient ...

  5. 确定多重选择列表控件 (List Control) 中的选定内容

    确定多重选择列表控件 (List Control) 中的选定内容 依次通过控件的 Items 集合,分别测试每一项的 Selected 属性. 下面的示例显示如何测试多重选择 ListBox 控件(名 ...

  6. [翻译]Chameleon介绍(3) : 列表控件

    [原文]http://getben.com/archive/2007/01/11/introduction-to-chameleon-list-base-controls.aspx 这篇文章属于我的文 ...

  7. MFC列表控件ListControl和树控件TreeControl

    列表控件 列表相关的类:CListCtrl-父类是CWnd,本质是一个控件: CListView-父类是CView,本质是一个视图.相当于在视图中嵌入了一个CListCtrl控件 列表控件的使用 1. ...

  8. 虚拟列表控件---加载大数据行

    平常所用到的列ListView/ListCtrl控件,都是只有行至几百行数据,直至今日,在项目中遇到了上10W量级数据条,终于感觉到普通加载的艰辛,遂到网上乱找一通,发现大同小异,转载了这篇比较详细的 ...

  9. android tv 开发布局,Android TV开发总结(七)构建一个TV app中的剧集列表控件

    前言:剧集类控件,在TV app中非常常见,今天将介绍构建一个TV app中的剧集列表控件,此控件上传到我的Github:https://github.com/hejunlin2013/Episode ...

最新文章

  1. hibernate 第三天
  2. js用.和[]获取属性的区别
  3. 【unity】简要分析yield及协同程序的用法
  4. Guava之FluentIterable使用示例
  5. oracle10g 学习 方向DBA三
  6. Mac 技术篇-Oracle数据库连接工具SQL Developer启用、关闭自动提交事务,设置自动commit
  7. FineReport——JS二次开发(局部刷新)
  8. 机器学习(Machine Learning)- 吴恩达(Andrew Ng)-学习笔记
  9. 医生为什么总是说生理性玻璃体混浊不用治
  10. Magicodes.IE 2.5.4.2发布
  11. java锁_Java锁
  12. 使用SDL打造游戏世界之入门篇 - 5
  13. ubuntu下软件中心闪退问题解决
  14. 利用WPF建立自己的3d gis软件(非axhost方式)(九)SDK自带部分面板的调用
  15. phpmyadmin在nginx环境下配置错误
  16. 【必收藏】台大李宏毅老师课程 | 资源汇总、笔记总结与索引
  17. jQuery 的 ajax 请求方法
  18. hive中的集合操作函数
  19. Linux二进制保护(文末福利)
  20. Yolov3 Keras版本训练详细教程

热门文章

  1. VMware虚拟机 安装 macOS High Sierra 10.13
  2. ei计算机投稿 知乎,知乎热议:科研有很水的idea应该发表出来吗?
  3. Android7.0调用系统相机拍照、访问相册问题。
  4. 通过换手率来发现大庄股
  5. 计算机信息处理员ppt,信息处理技术员考试指南.ppt
  6. Agilent安捷伦34972A数据采集器
  7. Spring 注解 @Qualifier和@Primary 详细解析
  8. ASI与AFN网络请求的的比较
  9. java获取当前的年月日日期
  10. 按键精灵执行sql语句,获取返回值