数据区域中的行操作

集算表支持在数据区域中显示行操作按钮,方便用户快速编辑、删除或重置数据记录。本示例展示了如何在普通工作表中渲染集算表,并启用删除、保存和重置三种内置行操作,让用户能够直接在数据区域中管理数据。

概述 本 Demo 展示了如何将集算表以数据区域的形式渲染到普通工作表中,并为每行数据配置行操作按钮。Demo 实现了三个内置行操作:删除行、保存行和重置行,使用户可以直接在数据区域中编辑数据记录。 实现思路 创建数据管理器,添加三个数据表并设置表关系 创建集算表并配置行操作选项 创建视图并绑定到集算表 将集算表注册为工作表的数据区域 美化工作表显示效果 代码解析 配置行操作选项 这段代码配置了集算表的行操作。首先通过 BuiltInRowActions 获取内置行操作对象,然后使用 rowActionOptions() 方法获取当前选项,将删除行(removeRow)、保存行(saveRow)和重置行(resetRow)三种操作添加到选项中,最后通过 rowActionOptions(options) 应用配置。 注册数据区域 这段代码将集算表注册到工作表的数据区域。使用 sheet.dataRanges.add() 方法,传入数据区域名称、集算表名称和位置范围。Range(row, col, -1, -1) 中的 -1 表示自动扩展到数据的实际行列数。 运行效果 工作表中显示产品数据表,每行的行头有三个操作按钮 点击删除按钮可以删除该行数据 点击保存按钮可以保存对该行的修改 点击重置按钮可以撤销对该行的修改 所有操作都会自动同步到远程数据源 API 参考 rowActionOptions 方法 options: 可选参数,行操作选项数组 返回值: 当前的行操作选项数组 BuiltInRowActions 内置行操作 removeRow: 删除行操作 saveRow: 保存行数据变化 resetRow: 重置行数据变化 pinRow: 固定行操作 dirtyStatus: 显示行脏值状态 warningInfo: 显示行错误提示 dataRanges.add 方法 name: 数据区域名称 dataSource: 数据源(可以是集算表名称) range: 单元格范围,使用 -1 表示自动扩展 options: 可选配置项(如粘性表头)
/*REPLACE_MARKER*/ /*DO NOT DELETE THESE COMMENTS*/ window.onload = function() { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 1 }); initSpread(spread); }; function initSpread(spread) { spread.suspendPaint(); var sheet = spread.getActiveSheet(); initTableSheet(spread, function(tableSheet) { spread.setActiveSheet(sheet.name()); var dataRange = registerTableSheetIntoWorksheet(tableSheet, sheet); beautifySheet(sheet, dataRange); spread.undoManager().clear(); }); spread.resumePaint(); } async function initTableSheet(spread, callback) { spread.options.autoFitType = GC.Spread.Sheets.AutoFitType.cellWithHeader; //init a data manager var dataManager = spread.dataManager(); var categoryAPI = getBaseApiUrl() + "/Category"; var categoryTable = dataManager.addTable("categoryTable", { remote: { read: { url: categoryAPI } } }); var supplierAPI = getBaseApiUrl() + "/Supplier"; var supplierTable = dataManager.addTable("supplierTable", { remote: { read: { url: supplierAPI } } }); var productAPI = getBaseApiUrl() + "/Product"; var productTable = dataManager.addTable("productTable", { autoSync: true, remote: { read: { url: productAPI }, update: { url: productAPI, method: "PUT" }, create: { url: productAPI }, delete: { url: productAPI } }, schema: { columns: { CategoryId: { lookup: { name: "category", columns: [ { value: "Id", width: 100 }, { value: "CategoryName", width: 160 }, { value: "Description", width: 400 } ] } }, SupplierId: { lookup: { name: "supplier", columns: [ { value: "Id", width: 100 }, { value: "CompanyName", width: 180 }, { value: "ContactName", width: 140 }, { value: "ContactTitle", width: 140 }, { value: "ContactTitle", width: 140 }, { value: "City", width: 100 }, { value: "Address", width: 140 }, { value: "Phone", width: 100 } ] } } } } }); dataManager.addRelationship(productTable, "CategoryId", "category", categoryTable, "Id", "product"); dataManager.addRelationship(productTable, "SupplierId", "supplier", supplierTable, "Id", "product"); //init a table sheet var tableSheet = spread.addSheetTab(0, "MyTableSheet", GC.Spread.Sheets.SheetType.tableSheet); //row actions var rowActions = GC.Spread.Sheets.TableSheet.BuiltInRowActions; let options = tableSheet.rowActionOptions(); options.push( rowActions.removeRow, rowActions.saveRow, rowActions.resetRow, ); tableSheet.rowActionOptions(options); //bind a view to the table sheet await categoryTable.fetch(); await supplierTable.fetch(); await productTable.fetch(); var nameStyle = { fontWeight: "bold" }; var relationStyle = { foreColor: "#818181" }; var formulaRule = { ruleType: "formulaRule", formula: "@>1000", style: { foreColor: "orange" } }; var myView = productTable.addView("myView", [ { value: "ProductName", caption: "Name", width: 250, style: nameStyle }, { value: "QuantityPerUnit", caption: "Quantity Per Unit", width: 140 }, { value: "SupplierId", caption: "Supplier Id", width: 140 }, { value: "supplier.CompanyName", caption: "Supplier Company", width: 200, style: relationStyle, headerStyle: relationStyle }, { value: "CategoryId", caption: "Category Id", width: 140 }, { value: "category.CategoryName", caption: "Category Name", width: 140, style: relationStyle, headerStyle: relationStyle }, { value: "UnitPrice", caption: "Unit Price", width: 140 }, { value: "UnitsInStock", caption: "Units In Stock", width: 140 }, { value: "=[@UnitPrice]*[@UnitsInStock]", caption: "Total Price", conditionalFormats: [formulaRule] } ]); tableSheet.setDataView(myView); spread.suspendPaint(); callback && callback(tableSheet); spread.resumePaint(); return tableSheet; } function registerTableSheetIntoWorksheet (tableSheet, sheet) { var name = tableSheet.name() + "_DataRange"; var row = 1; var col = 1; var dataRange = sheet.dataRanges.add(name, tableSheet.name(), new GC.Spread.Sheets.Range(row, col, -1, -1)); return dataRange; } function beautifySheet(sheet, dataRange) { var range = dataRange.range(); for (var i = range.row; i < range.row + range.rowCount; i++) { sheet.autoFitRow(i); } for (var i = range.col; i < range.col + range.colCount; i++) { sheet.autoFitColumn(i); } sheet.setColumnWidth(1, 30); sheet.setColumnWidth(2, 30); sheet.setColumnWidth(3, 30); sheet.setColumnWidth(4, 30); } function getBaseApiUrl() { return window.location.href.match(/http.+spreadjs\/SpreadJSTutorial\//)[0] + 'server/api'; }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="spreadjs culture" content="zh-cn"/> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- Promise Polyfill for IE, https://www.npmjs.com/package/promise-polyfill --> <script src="https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js"></script> <script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets-tablesheet/dist/gc.spread.sheets.tablesheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets-resources-zh/dist/gc.spread.sheets.resources.zh.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div id="ss"></div> </html>
body, html { width: 100%; height: 100%; position: relative; overflow: hidden; margin: 0; padding: 0; } #ss { width: 100%; height: 100%; }