如何對(duì)ComponentOne FlexGrid的DataMap列進(jìn)行自定義排序?
在使用C1Flexgrid的DataMap屬性時(shí),我們可以將列設(shè)置單元格的值和展示值相關(guān)聯(lián),并對(duì)其進(jìn)行排序。但有些客戶需要基于展示值對(duì)列進(jìn)行排序,本文就介紹了如何實(shí)現(xiàn)這個(gè)需求。1. 綁定數(shù)據(jù)源首先,我
在使用C1Flexgrid的DataMap屬性時(shí),我們可以將列設(shè)置單元格的值和展示值相關(guān)聯(lián),并對(duì)其進(jìn)行排序。但有些客戶需要基于展示值對(duì)列進(jìn)行排序,本文就介紹了如何實(shí)現(xiàn)這個(gè)需求。
1. 綁定數(shù)據(jù)源
首先,我們需要將C1Flexgrid綁定到數(shù)據(jù)源。假設(shè)我們保存了Northwind數(shù)據(jù)源的Products數(shù)據(jù)表,然后創(chuàng)建兩個(gè)Dictionary對(duì)象,分別用來(lái)設(shè)置SupplierID列和CategoryID列的DataMap屬性。下面代碼展示CompanyName替代SupplierID,CategoryName替代CategoryID。
// 加載數(shù)據(jù)
var dtProducts GetDataTable("Products");
var dtCategories GetDataTable("Categories");
var dtSuppliers GetDataTable("Suppliers");
// 創(chuàng)建兩個(gè)數(shù)據(jù)映射
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到數(shù)據(jù)源
grid_ dtProducts;
// 添加數(shù)據(jù)映射
["CategoryID"].DataMap mapCat;
["SupplierID"].DataMap mapSup;
如果運(yùn)行上述代碼并嘗試對(duì)CategoryID/SupplierID列進(jìn)行排序,它們會(huì)按照關(guān)鍵值進(jìn)行排序。
2. 添加排序代碼
為了根據(jù)展示的值進(jìn)行排序,我們需要添加如下代碼。主要是處理BeforeSort事件,將新列添加到數(shù)據(jù)表中,這個(gè)新列是隱藏的,由mapped值填充。表格會(huì)基于該新列進(jìn)行排序,而不是單擊的列。這樣就會(huì)根據(jù)展示的值排序而不是關(guān)鍵值。代碼如下:
// 用于執(zhí)行實(shí)際排序的隱藏列名
const string SORT_COL_NAME "_dtSort";
// 正在用作隱藏源列的列
_sourceColumn;
// 自定義排序(使用映射值而不是原始值)
void _flex_BeforeSort(object sender, e)
{
// 如果該列包含數(shù)據(jù)映射
_sourceColumn _[];
if (_ ! null)
{
// 為排序添加一個(gè)隱藏列
var dt _ as DataTable;
if (!(SORT_COL_NAME))
{
var dcol (SORT_COL_NAME);
_[SORT_COL_NAME].Visible false;
}
// 刪除當(dāng)前排序(如果有的話)
string.Empty;
// 填充排序列
foreach (DataRow dr in )
{
var key dr[_];
dr[SORT_COL_NAME] _[key];
}
// 應(yīng)用新排序
var sort SORT_COL_NAME;
if ((e.Order ) ! 0)
{
sort " DESC";
}
sort;
// 已處理
e.Handled true;
}
}
3. 更新排序內(nèi)容
最后一個(gè)問(wèn)題是如何處理AfterEdit事件,在編輯包含數(shù)據(jù)映射的列時(shí),自動(dòng)更新排序。代碼如下:
// 當(dāng)用戶編輯正在進(jìn)行排序的列時(shí),更新排序列
void _flex_AfterEdit(object sender, e)
{
if (_[] _sourceColumn)
{
// 刷新排序列內(nèi)容
var dt _ as DataTable;
foreach (DataRow dr in )
{
var key dr[_];
dr[SORT_COL_NAME] _[key];
}
}
}
通過(guò)以上步驟,我們就可以實(shí)現(xiàn)基于展示值對(duì)C1Flexgrid的DataMap列進(jìn)行自定義排序的功能了。