***运行此代码需要新版本antdUI.dll(2.4.1)替换aardio扩展库的旧版本dll,附件提供dll下载。“”
官方dll下载地址:https://www.nuget.org/packages/AntdUI
AntdUI Table表格演示示例包括:
支持Pagination分页加载数据;
支持Table表头排序;
支持双击编辑单元格数据;
支持点击View,查看修改数据;
import win.ui;
import dotNet;
import dotNet.AntdUI;
dotNet.import("System.Data");
/*DSG{{*/
var winform = win.form(text="AntdUI Table";right=1280;bottom=760;border="thin")
winform.add(
custom_base={cls="custom";left=0;top=0;right=1282;bottom=760;ah=1;aw=1;db=1;disabled=1;dl=1;dr=1;dt=1;hide=1;z=1};
custom_btn_empty={cls="custom";left=472;top=68;right=582;bottom=108;dl=1;dt=1;z=5};
custom_btn_reload={cls="custom";left=348;top=68;right=458;bottom=108;dl=1;dt=1;z=4};
custom_btn_scroll={cls="custom";left=744;top=68;right=878;bottom=108;dl=1;dt=1;z=7};
custom_btn_select={cls="custom";left=596;top=68;right=730;bottom=108;dl=1;dt=1;z=6};
custom_info={cls="custom";left=900;top=18;right=1252;bottom=108;dr=1;dt=1;z=8};
custom_log={cls="custom";left=900;top=648;right=1252;bottom=728;db=1;dr=1;z=12};
custom_log_title={cls="custom";left=782;top=648;right=900;bottom=676;db=1;dr=1;z=11};
custom_pagination={cls="custom";left=24;top=656;right=760;bottom=696;db=1;dl=1;z=10};
custom_search={cls="custom";left=24;top=68;right=330;bottom=108;dl=1;dt=1;z=3};
custom_table={cls="custom";left=24;top=125;right=1252;bottom=635;ah=1;aw=1;db=1;dl=1;dr=1;dt=1;z=9};
custom_title={cls="custom";left=24;top=18;right=480;bottom=54;dl=1;dt=1;z=2}
)
/*}}*/
// Message.success needs an AntdUI form or control as owner.
var baseForm = AntdUI.BaseForm();
baseForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
baseForm.Dock = System.Windows.Forms.DockStyle.Fill;
dotNet.setParent(baseForm, winform.custom_base);
// ---------- Fonts ----------
var fontTitle = System.Drawing.Font("Microsoft YaHei", 14, System.Drawing.FontStyle.Bold);
var fontNormal = System.Drawing.Font("Microsoft YaHei", 10);
var fontHeader = System.Drawing.Font("Microsoft YaHei", 10, System.Drawing.FontStyle.Bold);
var fontTip = System.Drawing.Font("Microsoft YaHei", 9);
// ---------- Helpers ----------
var showSuccess = function(text){
AntdUI.Message.success(baseForm, text);
}
var addHostLabel = function(host,text,font){
var label = AntdUI.Label(host);
label.Text = text;
label.Font = font || fontNormal;
label.Dock = System.Windows.Forms.DockStyle.Fill;
return label;
}
var logText = "";
var lblLog;
var appendLog = function(text){
logText = time().format("%H:%M:%S") + " " + text + '\r\n' + logText;
if(lblLog) lblLog.Text = logText;
}
var color = function(r,g,b){
return System.Drawing.Color.FromArgb(255,r,g,b);
}
var toLower = function(v){
return string.lower(tostring(v || ""));
}
// ---------- Demo data ----------
var allData = [];
var statuses = ["Running","Pending","Closed","Error"];
var cities = [
"London Park",
"New York No. 1 Lake Park",
"Sydney Road",
"Tokyo Tower Street",
"Berlin Square",
"Singapore Bay"
];
for(i=1;137){
var st = statuses[(i - 1) % #statuses + 1];
table.push(allData,{
ordinal = i;
id = i;
selected = false;
name = "Edward King " ++ i;
age = 18 + (i * 7) % 45;
address = cities[(i - 1) % #cities + 1] ++ " no. " ++ i;
status = st;
progress = ((i * 13) % 100) / 100;
enabled = i % 3 != 0;
created = System.DateTime(2026,(i - 1) % 12 + 1,(i - 1) % 28 + 1);
});
}
// ---------- State ----------
var currentPage = 1;
var pageSize = 10;
var keyword = "";
var emptyMode = false;
var pagerUpdating = false;
var tableRefreshing = false;
var sortToken = 0;
var tableCtrl, pagination, lblInfo;
// ---------- Sorting ----------
var normalizeSortMode = function(mode){
var m = string.upper(tostring(mode));
if(m == "1" || m == "ASC") return "ASC";
if(m == "2" || m == "DESC") return "DESC";
return "NONE";
}
var getSortValue = function(rowData,key){
select(key) {
case "Id" {
return rowData.id;
}
case "Name" {
return toLower(rowData.name);
}
case "Age" {
return rowData.age;
}
case "Address" {
return toLower(rowData.address);
}
case "Status" {
return toLower(rowData.status);
}
case "Progress" {
return rowData.progress;
}
case "Enabled" {
return rowData.enabled ? 1 : 0;
}
case "Created" {
return rowData.created;
}
else {
return rowData.ordinal;
}
}
}
var resetSort = function(){
table.sort(allData,function(next){
return owner.ordinal < next.ordinal;
});
}
var compareSortItems = function(a,b,key,sortMode){
if(a === b) return 0;
if(!a) return 1;
if(!b) return -1;
var va = getSortValue(a,key);
var vb = getSortValue(b,key);
var c = 0;
if(key == "Created"){
c = va.CompareTo(vb);
}
else {
if(va < vb) {
c = -1;
}
elseif(va > vb) {
c = 1;
}
}
// 相等时使用原始序号稳定排序,避免比较函数前后矛盾。
if(c == 0){
if(a.ordinal < b.ordinal) return -1;
if(a.ordinal > b.ordinal) return 1;
return 0;
}
if(sortMode == "DESC") return -c;
return c;
}
var applySort = function(key,mode){
var sortMode = normalizeSortMode(mode);
if(sortMode == "NONE"){
resetSort();
return sortMode;
}
table.sort(allData,function(next){
return compareSortItems(owner,next,key,sortMode) < 0;
});
return sortMode;
}
// ---------- Cell styles ----------
var statusType = function(st){
if(st == "Running") return AntdUI.TTypeMini.Success;
if(st == "Pending") return AntdUI.TTypeMini.Warn;
if(st == "Error") return AntdUI.TTypeMini.Error;
return AntdUI.TTypeMini.Default;
}
var progressColor = function(v){
if(v >= 0.8) return color(82,196,26);
if(v >= 0.5) return color(22,119,255);
return color(250,173,20);
}
var findById = function(id){
for(i,item in allData){
if(item.id == id) return item;
}
}
// ---------- Data source ----------
var getFilteredData = function(){
if(emptyMode) return [];
var arr = [];
var q = string.trim(toLower(keyword));
for(i,item in allData){
if(!q
|| string.indexOf(toLower(item.name),q)
|| string.indexOf(toLower(item.address),q)
|| string.indexOf(toLower(item.status),q)
|| string.indexOf(tostring(item.id),q) ){
table.push(arr,item);
}
}
return arr;
}
var makeDataTable = function(page,ps){
var data = getFilteredData();
var dt = System.Data.DataTable("Orders");
dt.Columns.Add("Selected",System.Boolean);
dt.Columns.Add("Id",System.Int32);
dt.Columns.Add("Name",System.String);
dt.Columns.Add("Age",System.Int32);
dt.Columns.Add("Address",System.String);
dt.Columns.Add("Status",System.Object);
dt.Columns.Add("Progress",System.Object);
dt.Columns.Add("Enabled",System.Boolean);
dt.Columns.Add("Created",System.DateTime);
dt.Columns.Add("Action",System.Object);
var start = (page - 1) * ps + 1;
var stop = math.min(page * ps,#data);
for(i=start;stop){
var item = data[i];
var row = dt.NewRow();
row["Selected"] = item.selected;
row["Id"] = item.id;
row["Name"] = item.name;
row["Age"] = item.age;
row["Address"] = item.address;
row["Status"] = AntdUI.CellTag(item.status,statusType(item.status));
var progress = AntdUI.CellProgress(item.progress);
progress.Fill = progressColor(item.progress);
progress.Radius = 4;
row["Progress"] = progress;
row["Enabled"] = item.enabled;
row["Created"] = item.created;
row["Action"] = AntdUI.CellButton("view","View",AntdUI.TTypeMini.Primary).SetRadius(4);
dt.Rows.Add(row);
}
return dt;
}
var updateInfo = function(){
var total = #getFilteredData();
var selectedCount = 0;
for(i,item in allData){
if(item.selected) selectedCount++;
}
lblInfo.Text = "Features:" + '\r\n'
+ "• ColumnCheck / ColumnSwitch" + '\r\n'
+ "• CellTag / CellProgress / CellButton" + '\r\n'
+ "• Editable column: Name" + '\r\n'
+ "• Detail dialog: Select + InputNumber" + '\r\n'
+ "• Search + Pagination" + '\r\n\r\n'
+ "Total: " + total + " Selected: " + selectedCount;
}
var refreshTable = function(){
var total = #getFilteredData();
var maxPage = math.max(1,math.ceil(total / pageSize));
if(currentPage > maxPage) currentPage = maxPage;
if(currentPage < 1) currentPage = 1;
pagerUpdating = true;
pagination.Total = total;
pagination.PageSize = pageSize;
pagination.Current = currentPage;
pagerUpdating = false;
tableRefreshing = true;
tableCtrl.DataSource = makeDataTable(currentPage,pageSize);
tableRefreshing = false;
updateInfo();
}
// ---------- Detail dialog ----------
var showDetailDialog = function(item){
var dlg = win.form(text="Row details - ID " + tostring(item.id);right=580;bottom=500;border="thin";parent=winform);
dlg.add(
lbl_id={cls="static";text="ID";left=28;top=31;right=130;bottom=55;z=1};
host_id={cls="custom";left=140;top=24;right=530;bottom=60;z=2};
lbl_name={cls="static";text="Name";left=28;top=79;right=130;bottom=103;z=3};
host_name={cls="custom";left=140;top=72;right=530;bottom=108;z=4};
lbl_age={cls="static";text="Age";left=28;top=127;right=130;bottom=151;z=5};
host_age={cls="custom";left=140;top=120;right=530;bottom=156;z=6};
lbl_address={cls="static";text="Address";left=28;top=175;right=130;bottom=199;z=7};
host_address={cls="custom";left=140;top=168;right=530;bottom=204;z=8};
lbl_status={cls="static";text="Status";left=28;top=223;right=130;bottom=247;z=9};
host_status={cls="custom";left=140;top=216;right=530;bottom=252;z=10};
lbl_progress={cls="static";text="Progress";left=28;top=271;right=130;bottom=295;z=11};
host_progress={cls="custom";left=140;top=264;right=530;bottom=300;z=12};
lbl_enabled={cls="static";text="Enabled";left=28;top=319;right=130;bottom=343;z=13};
host_enabled={cls="custom";left=140;top=312;right=530;bottom=348;z=14};
lbl_created={cls="static";text="Created";left=28;top=367;right=130;bottom=391;z=15};
host_created={cls="custom";left=140;top=360;right=530;bottom=396;z=16};
host_cancel={cls="custom";left=310;top=425;right=410;bottom=461;z=17};
host_save={cls="custom";left=430;top=425;right=530;bottom=461;z=18}
);
var inputId = AntdUI.Input(dlg.host_id);
inputId.Dock = System.Windows.Forms.DockStyle.Fill;
inputId.Font = fontNormal;
inputId.Radius = 6;
inputId.Text = tostring(item.id);
inputId.Enabled = false;
var inputName = AntdUI.Input(dlg.host_name);
inputName.Dock = System.Windows.Forms.DockStyle.Fill;
inputName.Font = fontNormal;
inputName.Radius = 6;
inputName.Text = item.name;
var inputAge = AntdUI.InputNumber(dlg.host_age);
inputAge.Dock = System.Windows.Forms.DockStyle.Fill;
inputAge.Font = fontNormal;
inputAge.Radius = 6;
inputAge.Minimum = 0;
inputAge.Maximum = 120;
inputAge.DecimalPlaces = 0;
inputAge.Increment = 1;
inputAge.Value = item.age;
//inputAge.AlwaysShowControl = true;
var inputAddress = AntdUI.Input(dlg.host_address);
inputAddress.Dock = System.Windows.Forms.DockStyle.Fill;
inputAddress.Font = fontNormal;
inputAddress.Radius = 6;
inputAddress.Text = item.address;
var selStatus = AntdUI.Select(dlg.host_status);
selStatus.Dock = System.Windows.Forms.DockStyle.Fill;
selStatus.Font = fontNormal;
selStatus.Radius = 6;
for(i,text in statuses){
selStatus.Items.Add(AntdUI.SelectItem(text,text));
if(text == item.status){
selStatus.SelectedIndex = i - 1;
}
}
var inputProgress = AntdUI.InputNumber(dlg.host_progress);
inputProgress.Dock = System.Windows.Forms.DockStyle.Fill;
inputProgress.Font = fontNormal;
inputProgress.Radius = 6;
inputProgress.Minimum = 0;
inputProgress.Maximum = 1;
inputProgress.DecimalPlaces = 2;
inputProgress.Increment = 0.01;
inputProgress.Value = item.progress;
// inputProgress.AlwaysShowControl = true;
var selEnabled = AntdUI.Select(dlg.host_enabled);
selEnabled.Dock = System.Windows.Forms.DockStyle.Fill;
selEnabled.Font = fontNormal;
selEnabled.Radius = 6;
selEnabled.Items.Add(AntdUI.SelectItem("True","True"));
selEnabled.Items.Add(AntdUI.SelectItem("False","False"));
selEnabled.SelectedIndex = item.enabled ? 0 : 1;
var inputCreated = AntdUI.Input(dlg.host_created);
inputCreated.Dock = System.Windows.Forms.DockStyle.Fill;
inputCreated.Font = fontNormal;
inputCreated.Radius = 6;
inputCreated.Text = item.created.ToString("yyyy-MM-dd");
var saved = false;
var btnCancel = AntdUI.Button(dlg.host_cancel);
btnCancel.Dock = System.Windows.Forms.DockStyle.Fill;
btnCancel.Font = fontNormal;
btnCancel.Text = "Cancel";
btnCancel.Click = function(sender,e){
dlg.close();
}
var btnSave = AntdUI.Button(dlg.host_save);
btnSave.Dock = System.Windows.Forms.DockStyle.Fill;
btnSave.Font = fontNormal;
btnSave.Text = "Save";
btnSave.Type = AntdUI.TTypeMini.Primary;
btnSave.Click = function(sender,e){
var ok,created = call(function(){
return System.DateTime.Parse(inputCreated.Text);
});
if(!ok){
dlg.msgboxErr(created || "Invalid date. Please use yyyy-MM-dd.","Validation");
return;
}
var age = tonumber(tostring(inputAge.Value));
if(age === null) age = item.age;
var progressValue = tonumber(tostring(inputProgress.Value));
if(progressValue === null) progressValue = item.progress;
if(progressValue < 0) progressValue = 0;
if(progressValue > 1) progressValue = 1;
item.name = inputName.Text;
item.age = math.floor(age + 0.5);
item.address = inputAddress.Text;
if(selStatus.SelectedIndex >= 0){
item.status = statuses[selStatus.SelectedIndex + 1];
}
item.progress = progressValue;
item.enabled = selEnabled.SelectedIndex == 0;
item.created = created; // 这里现在是真正的 DateTime,不再是 true
saved = true;
dlg.close();
}
dlg.doModal(winform);
if(saved){
refreshTable();
appendLog("Row updated: ID=" + tostring(item.id));
showSuccess("Row updated");
}
}
// ---------- Title and toolbar ----------
addHostLabel(winform.custom_title,"Table + Pagination",fontTitle);
addHostLabel(winform.custom_log_title,"Event log",fontHeader);
var inputSearch = AntdUI.Input(winform.custom_search);
inputSearch.Dock = System.Windows.Forms.DockStyle.Fill;
inputSearch.Font = fontNormal;
inputSearch.PlaceholderText = "Search name, address, status or ID";
inputSearch.AllowClear = true;
inputSearch.PrefixText = "Search";
inputSearch.Radius = 6;
inputSearch.TextChanged = function(sender,e){
keyword = inputSearch.Text;
currentPage = 1;
emptyMode = false;
refreshTable();
}
inputSearch.ClearClick = function(sender,e){
keyword = "";
inputSearch.Text = "";
currentPage = 1;
emptyMode = false;
refreshTable();
appendLog("Search cleared");
}
var btnReload = AntdUI.Button(winform.custom_btn_reload);
btnReload.Dock = System.Windows.Forms.DockStyle.Fill;
btnReload.Font = fontNormal;
btnReload.Text = "Reload";
btnReload.Type = AntdUI.TTypeMini.Primary;
btnReload.Click = function(sender,e){
emptyMode = false;
keyword = "";
inputSearch.Text = "";
currentPage = 1;
resetSort();
refreshTable();
appendLog("Data reloaded");
showSuccess("Data reloaded");
}
var btnEmpty = AntdUI.Button(winform.custom_btn_empty);
btnEmpty.Dock = System.Windows.Forms.DockStyle.Fill;
btnEmpty.Font = fontNormal;
btnEmpty.Text = "Empty";
btnEmpty.Type = AntdUI.TTypeMini.Warn;
btnEmpty.Click = function(sender,e){
emptyMode = true;
currentPage = 1;
refreshTable();
appendLog("Empty state enabled");
}
var btnSelect = AntdUI.Button(winform.custom_btn_select);
btnSelect.Dock = System.Windows.Forms.DockStyle.Fill;
btnSelect.Font = fontNormal;
btnSelect.Text = "Select first";
btnSelect.Click = function(sender,e){
if(tableCtrl.RowCount > 0){
tableCtrl.SelectedIndex = 0;
tableCtrl.ScrollLine(0,true);
appendLog("Selected first row on current page");
}
}
var btnScroll = AntdUI.Button(winform.custom_btn_scroll);
btnScroll.Dock = System.Windows.Forms.DockStyle.Fill;
btnScroll.Font = fontNormal;
btnScroll.Text = "Scroll end";
btnScroll.Click = function(sender,e){
tableCtrl.ScrollToEnd();
appendLog("ScrollToEnd called");
}
lblInfo = AntdUI.Label(winform.custom_info);
lblInfo.Dock = System.Windows.Forms.DockStyle.Fill;
lblInfo.Font = fontTip;
lblLog = AntdUI.Label(winform.custom_log);
lblLog.Dock = System.Windows.Forms.DockStyle.Fill;
lblLog.Font = fontTip;
lblLog.Text = "";
// ---------- Table ----------
tableCtrl = AntdUI.Table(winform.custom_table);
tableCtrl.Dock = System.Windows.Forms.DockStyle.Fill;
tableCtrl.Font = fontNormal;
tableCtrl.ColumnFont = fontHeader;
//tableCtrl.Bordered = true;
tableCtrl.BorderColor = color(230,230,230);
tableCtrl.FixedHeader = true;
tableCtrl.VisibleHeader = true;
tableCtrl.EnableHeaderResizing = true;
tableCtrl.ColumnDragSort = true;
tableCtrl.MultipleRows = true;
tableCtrl.ShowTip = true;
tableCtrl.Empty = true;
tableCtrl.EmptyHeader = true;
tableCtrl.EmptyText = "No data";
tableCtrl.RowHeight = 42;
tableCtrl.RowHeightHeader = 42;
tableCtrl.CheckSize = 16;
tableCtrl.SwitchSize = 18;
tableCtrl.RowSelectedBg = color(230,247,255);
tableCtrl.RowHoverBg = color(245,245,245);
tableCtrl.CellFocusedStyle = AntdUI.TableCellFocusedStyle.Solid;
tableCtrl.CellFocusedBorder = color(22,119,255);
tableCtrl.EditMode = AntdUI.TEditMode.DoubleClick;
tableCtrl.EditSelection = AntdUI.TEditSelection.All;
tableCtrl.EditLostFocus = true;
// Columns.
tableCtrl.Columns = AntdUI.ColumnCollection();
tableCtrl.Columns.Add(AntdUI.ColumnCheck("Selected"," ").SetWidth("48"));
tableCtrl.Columns.Add(AntdUI.Column("Id","ID",AntdUI.ColumnAlign.Center).SetWidth("72").SetSortOrder(true).SetSummaryItem(AntdUI.TSummaryType.Count,"Rows: {0}"));
tableCtrl.Columns.Add(AntdUI.Column("Name","Name").SetWidth("175").SetEditable(true).SetSortOrder(true));
tableCtrl.Columns.Add(AntdUI.Column("Age","Age",AntdUI.ColumnAlign.Center).SetWidth("76").SetSortOrder(true));
tableCtrl.Columns.Add(AntdUI.Column("Address","Address").SetWidth("250").SetEllipsis(true).SetSortOrder(true));
tableCtrl.Columns.Add(AntdUI.Column("Status","Status",AntdUI.ColumnAlign.Center).SetWidth("120").SetSortOrder(true));
tableCtrl.Columns.Add(AntdUI.Column("Progress","Progress").SetWidth("145").SetSortOrder(true));
tableCtrl.Columns.Add(AntdUI.ColumnSwitch("Enabled","Enabled",AntdUI.ColumnAlign.Center).SetWidth("105").SetSortOrder(true));
tableCtrl.Columns.Add(AntdUI.Column("Created","Created",AntdUI.ColumnAlign.Center).SetWidth("130").SetDisplayFormat("yyyy-MM-dd").SetSortOrder(true));
tableCtrl.Columns.Add(AntdUI.Column("Action","Action",AntdUI.ColumnAlign.Center).SetWidth("105"));
// Zebra stripes + disabled row style.
tableCtrl.SetRowStyle = function(sender,e){
var style;
var id;
if(e.Record){
id = e.Record.Item("Id");
}
var item = id ? findById(id) : null;
if(e.Index % 2 == 0){
style = AntdUI.Table.CellStyleInfo();
style.BackColor = color(250,250,250);
}
if(item && !item.enabled){
if(!style) style = AntdUI.Table.CellStyleInfo();
style.ForeColor = color(150,150,150);
}
return style;
}
var safeGet = function(fn,defaultValue){
var ok,v = call(fn);
if(ok) return v;
return defaultValue;
}
var tableEventColumnKey = function(e){
var ok,v = call(function(){
return e.Column.Key;
});
if(ok && v) return tostring(v);
return "";
}
var tableEventRecordId = function(e){
var ok,v = call(function(){
return e.Record.Item("Id");
});
if(ok && v) return v;
return null;
}
var selectedIndexesText = function(){
var arr = [];
var ok,idxs = call(function(){
return tableCtrl.SelectedIndexs;
});
if(ok && idxs){
for _,idx in dotNet.each(idxs){
// AntdUI 里行号是 0 基,这里日志显示为 1 基更符合用户习惯。
table.push(arr,tostring(idx + 1));
}
}
if(#arr) return string.join(arr,",");
if(tableCtrl.SelectedIndex >= 0) return tostring(tableCtrl.SelectedIndex + 1);
return "(none)";
}
// ---------- Table events ----------
tableCtrl.CellClick = function(sender,e){
if(e.RowIndex >= 0 && e.Column){
var id = tableEventRecordId(e);
if(e.Button == System.Windows.Forms.MouseButtons.Right){
contextRowId = id;
tableCtrl.SelectedIndex = e.RowIndex;
appendLog("RightClick: row=" + tostring(e.RowIndex + 1)
+ ", ID=" + tostring(id)
+ ", column=" + e.Column.Key);
return;
}
appendLog("CellClick: row=" + tostring(e.RowIndex + 1)
+ ", column=" + e.Column.Key);
}
}
tableCtrl.CellDoubleClick = function(sender,e){
if(e.RowIndex >= 0 && e.Column){
appendLog("CellDoubleClick: row=" + tostring(e.RowIndex + 1) + ", column=" + e.Column.Key);
}
}
tableCtrl.CellBeginEdit = function(sender,e){
appendLog("CellBeginEdit: row=" + tostring(e.RowIndex + 1) + ", column=" + e.Column.Key);
return true;
}
tableCtrl.CellEndEdit = function(sender,e){
if(e.Column.Key == "Name"){
var id = e.Record.Item("Id");
var item = findById(id);
if(item) item.name = e.Value;
}
appendLog("CellEndEdit: " + e.Column.Key + " = " + e.Value);
updateInfo();
return true;
}
tableCtrl.CheckedChanged = function(sender,e){
var id = e.Record.Item("Id");
var item = findById(id);
if(item){
if(e.Column.Key == "Selected"){
item.selected = e.Value;
}
elseif(e.Column.Key == "Enabled"){
item.enabled = e.Value;
tableCtrl.Refresh();
}
}
appendLog("CheckedChanged: " + e.Column.Key + " row ID=" + tostring(id) + " value=" + tostring(e.Value));
updateInfo();
}
tableCtrl.CheckedOverallChanged = function(sender,e){
appendLog("CheckedOverallChanged: " + tostring(e.Value));
}
var getCellButtonId = function(btn){
var ok,v = call(function(){
return btn.ID;
});
if(ok && v) return tostring(v);
ok,v = call(function(){
return btn.Id;
});
if(ok && v) return tostring(v);
ok,v = call(function(){
return btn.Text;
});
if(ok && v) return tostring(v);
return "view";
}
tableCtrl.CellButtonClick = function(sender,e){
var id = e.Record.Item("Id");
var item = findById(id);
var btnId = getCellButtonId(e.Btn);
appendLog("CellButtonClick: " + btnId + " row ID=" + tostring(id));
if(item){
// 不在 AntdUI/.NET 回调内部直接打开模态窗口,延后到当前消息返回后执行,更稳。
winform.setTimeout(
function(){
showDetailDialog(item);
},0
);
}
}
tableCtrl.SortRows = function(sender,e){
appendLog("SortRows: column index " + tostring(e.Value));
}
tableCtrl.SortModeChanged = function(sender,e){
// Avoid refreshing DataSource synchronously inside AntdUI internal sorting.
if(tableRefreshing) return true;
if(!e.Column) return true;
var key = e.Column.Key;
var modeText = tostring(e.SortMode);
sortToken++;
var token = sortToken;
winform.setTimeout(
function(){
if(token != sortToken) return;
var mode = applySort(key,modeText);
currentPage = 1;
refreshTable();
appendLog("SortModeChanged: " + key + " -> " + mode);
},0
);
return true;
}
tableCtrl.SelectIndexChanged = function(sender,e){
appendLog("SelectIndexChanged: " + tostring(tableCtrl.SelectedIndex));
}
// ---------- Pagination ----------
pagination = AntdUI.Pagination(winform.custom_pagination);
pagination.Dock = System.Windows.Forms.DockStyle.Fill;
pagination.Font = fontNormal;
pagination.Current = currentPage;
pagination.PageSize = pageSize;
pagination.Total = #allData;
pagination.ShowSizeChanger = true;
pagination.PageSizeOptions = [10,20,50];
// Do not set TextDesc to null. It can cause COM exception in current AntdUI build.
pagination.TextDesc = "";
pagination.RecordsPerPageText = " / page";
pagination.Radius = 6;
pagination.Gap = 8;
pagination.ValueChanged = function(sender,e){
if(pagerUpdating) return;
currentPage = e.Current;
pageSize = e.PageSize;
tableRefreshing = true;
tableCtrl.DataSource = makeDataTable(currentPage,pageSize);
tableRefreshing = false;
updateInfo();
appendLog("Pagination: page=" + tostring(e.Current) + ", pageSize=" + tostring(e.PageSize));
}
pagination.ShowTotalChanged = function(sender,e){
return "Total " + tostring(e.Total) + " items";
}
// Initial load.
refreshTable();
appendLog("Table initialized");
// ---------- Dispose ----------
winform.onClose = function(){
fontTitle.Dispose();
fontNormal.Dispose();
fontHeader.Dispose();
fontTip.Dispose();
}
winform.show();
win.loopMessage();
下期预告:Slider滑动输入条控件的创建