找回密码
 立即注册

QQ登录

只需一步,快速开始

Lynn.Dou 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-10-9 15:04  /   查看:2613  /  回复:0
本帖最后由 lynn512 于 2020-10-9 15:04 编辑

背景:用户有这样一个需求:创建一个表格,给表格某一列设置组合框ComboBox。
思路:目前有两种方案,我们以具体的demo为例来详细介绍这两种方案:
方案1:在设计器里设计好模板,然后绑定数据源。
我们先在设计器里设计好一个表格模板,给最后一列设置组合框。如下图:
image.png580591430.png
image.png449801940.png
将模板导出为js文件,引入到demo中,绑定数据源。
  1. var dataSource = {
  2.     person: [
  3.         {name: 'lily', age: '15', girl: '1'},
  4.         {name: 'mary', age: '12', girl: '1'},
  5.         {name: 'tom', age: '17', girl: '0'},
  6.         {name: 'dong', age: '14', girl: '0'},
  7.         {name: 'luna', age: '15', girl: '1'},
  8.         {name: 'aimi', age: '12', girl: '1'}
  9.     ]
  10. }
  11. var datasource = new GC.Spread.Sheets.Bindings.CellBindingSource(dataSource);
  12. sheet.setDataSource(datasource);
复制代码
这个时候我们会发现,ComboBox所在表格列显示的 0 或 1,并不是我们期待的 ”是或否“。
image.png729145812.png
这是因为使用了setDataSource,会更新这个模板的内容,原先的设置就没有了,所以我们要给表格这列重新设置ComboBox
  1. var table = sheet.tables.all()[0];
  2. var row = table.dataRange().row;
  3. var col = table.dataRange().col;
  4. var rowCount = table.dataRange().rowCount;
  5. var colCount = table.dataRange().colCount;

  6. var combo = sheet.getCellType(row,colCount-1);
  7. combo.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
  8. //给表格最后一列设置组合框
  9. sheet.getRange(row,colCount-1,rowCount,1).cellType(combo);
复制代码
好了,现在就可以正常显示ComboBox的值了。
image.png588265380.png
这个时候又出现了新的问题,当我们给表格插入/删除行时会发现ComboBox所在列显示不正常。
image.png35620116.png
有一个解决方式,那就是监听TableRowsChanged事件,当表格行数改变时,重新给组合框列设置ComboBox。
  1. spread.bind(GC.Spread.Sheets.Events.TableRowsChanged, function (e, data) {
  2.     var newTable = sheet.tables.all()[0];
  3.     var newRow = table.dataRange().row;
  4.     var newCol = table.dataRange().col;
  5.     var newRowCount = table.dataRange().rowCount;
  6.     var newColCount = table.dataRange().colCount;
  7.     if (newRowCount > rowCount) {
  8.         //增加表格行时,重新给表格列设置组合框
  9.         sheet.getRange(newRow, newCol + newColCount - 1, newRowCount, 1).cellType(combo);
  10.     } else {
  11.         //删除表格行时,删除表格外组合框
  12.         sheet.getRange(newRow, newCol + newColCount - 1, newRowCount, 1).cellType(combo);
  13.         sheet.getRange(newRow + newRowCount, newCol + newColCount - 1, rowCount - newRowCount , 1).cellType(null);
  14.     }
  15. });
复制代码
现在插入/删除表格行就没有问题了。附件有本例demo,可以查看具体的代码。
方案2:不通过模板设计,通过代码绑定表格字段。
  1. var dataSource = {
  2.     person: [
  3.         {name: 'lily', age: '15', girl: '1'},
  4.         {name: 'mary', age: '12', girl: '1'},
  5.         {name: 'tom', age: '17', girl: '0'},
  6.         {name: 'dong', age: '14', girl: '0'},
  7.         {name: 'luna', age: '15', girl: '1'},
  8.         {name: 'aimi', age: '12', girl: '1'}
  9.     ]
  10. }
  11. var combo = new GC.Spread.Sheets.CellTypes.ComboBox();
  12. combo.items([
  13.     { text: '是', value: '1' },
  14.     { text: '否', value: '0' }
  15. ]).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);

  16. var table = sheet.tables.add('person', 0, 0, 2, 3);
  17. var tableColumn1 = new GC.Spread.Sheets.Tables.TableColumn(1, "name", "NAME");
  18. var tableColumn2 = new GC.Spread.Sheets.Tables.TableColumn(2, "age", "AGE");
  19. var tableColumn3 = new GC.Spread.Sheets.Tables.TableColumn(3, "girl", "GIRL",null,combo);//在这里绑定了ComboBox

  20. table.autoGenerateColumns(false);
  21. table.bind([tableColumn1, tableColumn2, tableColumn3], 'person', dataSource);
复制代码
这种方式因为是直接将ComboBox设置在表格列上,所以可以正常的插入/删除行。
不过这种方式下表格字段只能通过代码绑定,所以当字段过多时没有模板设计来的方便。
大家可以根据需要自行选择。


表格绑定数据源组合框.zip

2.05 MB, 下载次数: 32

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部