2016 - 2024

感恩一路有你

如何对ComponentOne FlexGrid的DataMap列进行自定义排序?

浏览量:2859 时间:2024-06-25 18:53:43 作者:采采

在使用C1Flexgrid的DataMap属性时,我们可以将列设置单元格的值和展示值相关联,并对其进行排序。但有些客户需要基于展示值对列进行排序,本文就介绍了如何实现这个需求。

1. 绑定数据源

首先,我们需要将C1Flexgrid绑定到数据源。假设我们保存了Northwind数据源的Products数据表,然后创建两个Dictionary对象,分别用来设置SupplierID列和CategoryID列的DataMap属性。下面代码展示CompanyName替代SupplierID,CategoryName替代CategoryID。

// 加载数据

var dtProducts GetDataTable("Products");

var dtCategories GetDataTable("Categories");

var dtSuppliers GetDataTable("Suppliers");

// 创建两个数据映射

var mapCat new Dictionary();

foreach (DataRow row in )

{

var key (int)row["CategoryID"];

var val (string)row["CategoryName"];

mapCat[key] val;

}

var mapSup new Dictionary();

foreach (DataRow row in )

{

var key (int)row["SupplierID"];

var val (string)row["CompanyName"];

mapSup[key] val;

}

// 绑定C1Flexgrid到数据源

grid_ dtProducts;

// 添加数据映射

["CategoryID"].DataMap mapCat;

["SupplierID"].DataMap mapSup;

如果运行上述代码并尝试对CategoryID/SupplierID列进行排序,它们会按照关键值进行排序。

2. 添加排序代码

为了根据展示的值进行排序,我们需要添加如下代码。主要是处理BeforeSort事件,将新列添加到数据表中,这个新列是隐藏的,由mapped值填充。表格会基于该新列进行排序,而不是单击的列。这样就会根据展示的值排序而不是关键值。代码如下:

// 用于执行实际排序的隐藏列名

const string SORT_COL_NAME "_dtSort";

// 正在用作隐藏源列的列

_sourceColumn;

// 自定义排序(使用映射值而不是原始值)

void _flex_BeforeSort(object sender, e)

{

// 如果该列包含数据映射

_sourceColumn _[];

if (_ ! null)

{

// 为排序添加一个隐藏列

var dt _ as DataTable;

if (!(SORT_COL_NAME))

{

var dcol (SORT_COL_NAME);

_[SORT_COL_NAME].Visible false;

}

// 删除当前排序(如果有的话)

string.Empty;

// 填充排序列

foreach (DataRow dr in )

{

var key dr[_];

dr[SORT_COL_NAME] _[key];

}

// 应用新排序

var sort SORT_COL_NAME;

if ((e.Order ) ! 0)

{

sort " DESC";

}

sort;

// 已处理

e.Handled true;

}

}

3. 更新排序内容

最后一个问题是如何处理AfterEdit事件,在编辑包含数据映射的列时,自动更新排序。代码如下:

// 当用户编辑正在进行排序的列时,更新排序列

void _flex_AfterEdit(object sender, e)

{

if (_[] _sourceColumn)

{

// 刷新排序列内容

var dt _ as DataTable;

foreach (DataRow dr in )

{

var key dr[_];

dr[SORT_COL_NAME] _[key];

}

}

}

通过以上步骤,我们就可以实现基于展示值对C1Flexgrid的DataMap列进行自定义排序的功能了。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。