Form Control

SpreadJS supports form controls like button, spin button, listBox, comboBox, checkBox, option button etc.

Description
app.vue
index.html
Copy to CodeMine

Add form control

// create spin button form control
let spinButton = sheet.shapes.addFormControl("spin button", GC.Spread.Sheets.Shapes.FormControlType.spinButton, 50, 50, 100, 50);

In the above example, you may have found that the form control can be linked with a cell. When the value of the form control changes, the cell will also change. This can be done using the following code.
Form controls with no value such as a button, label, group box, etc. cannot be linked to cells.

let options = spinButton.options();
options.cellLink = "A1";
spinButton.options(options);

Bind event

You can listen to the buttonClicked or valueChanged event of the form control.

// add button form control
let button = shapes.addFormControl('button', GC.Spread.Sheets.Shapes.FormControlType.button, 300, 50, 160, 100);

// set button text
button.text("Click me");

// bind event
sheet.bind(GC.Spread.Sheets.Events.FormControlButtonClicked, function (s, args) {
    alert('button clicked...');
});
// add check box form control
let checkBox = shapes.addFormControl('check box', GC.Spread.Sheets.Shapes.FormControlType.checkBox, 50, 260, 80, 30);

// set check box text
checkBox.text("check box");

// bind event
sheet.bind(GC.Spread.Sheets.Events.FormControlValueChanged, function (s, args) {
    console.log('value change...');
});

UI Behavior

Usually, a left mouse button click means interacting with the form control.
In order to select the form control for moving or resizing, you can use ctrl + left mouse click or right mouse click.

Add form control Link form control with cell In the above example, you may have found that the form control can be linked with a cell. When the value of the form control changes, the cell will also change. This can be done using the following code. Form controls with no value such as a button, label, group box, etc. cannot be linked to cells. Bind event You can listen to the buttonClicked or valueChanged event of the form control. UI Behavior Usually, a left mouse button click means interacting with the form control. In order to select the form control for moving or resizing, you can use ctrl + left mouse click or right mouse click.
<template> <div class="sample-tutorial"> <gc-spread-sheets hostClass="sample-spreadsheets" @workbookInitialized="initSpread"> <gc-worksheet></gc-worksheet> </gc-spread-sheets> </div> </template> <script setup> import GC from "@mescius/spread-sheets"; import { ref } from "vue"; import "@mescius/spread-sheets-vue"; import '@mescius/spread-sheets-shapes'; const spreadRef = ref(null); const initSpread = (spread) => { spreadRef.value = spread; spread.suspendPaint(); let sheet = spread.getSheet(0); setData(sheet); setStyle(sheet); setFormControl(sheet); spread.resumePaint(); } function setData(sheet) { let departmentData = ["Sales", "Editorial", "Research", "HR", "Finance", "Product", "Marketing", "Purchasing"]; for (let i = 0; i < departmentData.length; i++) { sheet.setValue(i, 12, departmentData[i]); } sheet.setValue(1, 2, "liming"); sheet.setArray(21, 0, [ ["name", "age", "gender", "like", null, "department"], [null, null, null, "basketball", "football", null], ]); sheet.setArray(23, 0, [["=C2", "=C3", '=CHOOSE(A20, "male", "female")', '=IF(C20,"yes","no")', '=IF(D20, "yes", "no")', "=INDEX(M1:M8,B20)"]], true); sheet.setArray(0, 13, [ ["item1", 67], ["item2", 159], ["item3", 177], ["item4", 93], ["item5", 166], ["item6", 91], ["item7", 57], ["item8", 107], ["item9", 92], ["item10", 175], ]); for (let i = 1; i <= 6; i++) { sheet.setFormula(i, 7, "=INDEX(N" + i + ":N10, P1)"); sheet.setFormula(i, 8, "=INDEX(O" + i + ":O10, P1)"); } } function setStyle(sheet) { sheet.defaults.colWidth = 70; sheet.setColumnWidth(5, 80); sheet.getRange(1, 0, 13, 5).backColor("#bdd7ee"); sheet.getRange(21, 0, 2, 6).backColor("#bdd7ee"); sheet.getRange(1, 2, 1, 2).hAlign(1); sheet.getRange(21, 0, 3, 6).hAlign(1); sheet.getRange(21, 0, 3, 6).vAlign(1); sheet.addSpan(1, 2, 1, 2); sheet.addSpan(21, 3, 1, 2); sheet.addSpan(21, 0, 2, 1); sheet.addSpan(21, 1, 2, 1); sheet.addSpan(21, 2, 2, 1); sheet.addSpan(21, 5, 2, 1); sheet.conditionalFormats.addDataBarRule( GC.Spread.Sheets.ConditionalFormatting.ScaleValueType.automin, null, GC.Spread.Sheets.ConditionalFormatting.ScaleValueType.automax, null, "green", [new GC.Spread.Sheets.Range(1, 8, 6, 1)] ); } function setFormControl(sheet) { let shapes = sheet.shapes; let nameLabel = shapes.addFormControl("name", GC.Spread.Sheets.Shapes.FormControlType.label, 84, 20, 55, 20); nameLabel.text("name:"); let ageLabel = shapes.addFormControl("age", GC.Spread.Sheets.Shapes.FormControlType.label, 96, 40, 55, 20); ageLabel.text("age:"); let ageSpinBtn = shapes.addFormControl("spin", GC.Spread.Sheets.Shapes.FormControlType.spinButton, 210, 40, 70, 26); let options = ageSpinBtn.options(); (options.cellLink = "C3"), (options.minValue = 1); options.maxValue = 120; ageSpinBtn.options(options); ageSpinBtn.value(18); let genderGroupBox = shapes.addFormControl("gender", GC.Spread.Sheets.Shapes.FormControlType.groupBox, 70, 80, 210, 60); genderGroupBox.text("gender"); let male = shapes.addFormControl("male", GC.Spread.Sheets.Shapes.FormControlType.optionButton, 90, 105, 90, 20); male.text("male"); male.value(true); let female = shapes.addFormControl("female", GC.Spread.Sheets.Shapes.FormControlType.optionButton, 180, 105, 90, 20); female.text("female"); options = female.options(); (options.cellLink = "A20"), female.options(options); let likeGroupBox = shapes.addFormControl("like", GC.Spread.Sheets.Shapes.FormControlType.groupBox, 70, 160, 210, 60); likeGroupBox.text("like"); let basketball = shapes.addFormControl("basketball", GC.Spread.Sheets.Shapes.FormControlType.checkBox, 90, 185, 90, 20); basketball.text("basketball"); options = basketball.options(); (options.cellLink = "C20"), basketball.options(options); let football = shapes.addFormControl("football", GC.Spread.Sheets.Shapes.FormControlType.checkBox, 180, 185, 90, 20); football.text("football"); options = football.options(); (options.cellLink = "D20"), football.options(options); let departmentLabel = shapes.addFormControl("department label", GC.Spread.Sheets.Shapes.FormControlType.label, 69, 240, 80, 20); departmentLabel.text("department:"); let department = shapes.addFormControl("department", GC.Spread.Sheets.Shapes.FormControlType.comboBox, 150, 240, 130, 20); options = department.options(); options.cellLink = "B20"; options.inputRange = "M1:M8"; options.dropDownLines = 5; department.options(options); department.value(1); let scrollBar = shapes.addFormControl("scroll bar", GC.Spread.Sheets.Shapes.FormControlType.scrollBar, 642, 21, 24, 116); options = scrollBar.options(); options.cellLink = "P1"; options.minValue = 1; options.maxValue = 5; scrollBar.options(options); scrollBar.value(1); let listBox = shapes.addFormControl("listBox", GC.Spread.Sheets.Shapes.FormControlType.listBox, 500, 200, 180, 100); options = listBox.options(); options.cellLink = "B20"; options.inputRange = "M1:M8"; listBox.options(options); let button = shapes.addFormControl("button", GC.Spread.Sheets.Shapes.FormControlType.button, 500, 380, 160, 100); button.text("Click me"); sheet.bind(GC.Spread.Sheets.Events.FormControlButtonClicked, function (s, args) { alert("button clicked..."); }); } </script> <style scoped> .sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: 100%; height: 100%; overflow: hidden; float: left; } input { display: inline-block; } input[type="text"] { width: 160px; } label { display: inline-block; margin-bottom: 6px; width: 200px; } select { width: 120px; height: 35px; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } #app { height: 100%; } </style>
<!DOCTYPE html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>SpreadJS VUE</title> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/vue3/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/spread/source/data/inventory-tracker.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/vue3/node_modules/systemjs/dist/system.src.js"></script> <script src="./systemjs.config.js"></script> <script src="./compiler.js" type="module"></script> <script> var System = SystemJS; System.import("./src/app.js"); System.import('$DEMOROOT$/en/lib/vue3/license.js'); </script> </head> <body> <div id="app"></div> </body> </html>
(function (global) { SystemJS.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, packageConfigPaths: [ './node_modules/*/package.json', "./node_modules/@mescius/*/package.json", "./node_modules/@babel/*/package.json", "./node_modules/@vue/*/package.json" ], map: { 'vue': "npm:vue/dist/vue.esm-browser.js", 'tiny-emitter': 'npm:tiny-emitter/index.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', "systemjs-babel-build": "npm:systemjs-plugin-babel/systemjs-babel-browser.js", '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-shapes': 'npm:@mescius/spread-sheets-shapes/index.js', '@mescius/spread-sheets-vue': 'npm:@mescius/spread-sheets-vue/index.js' }, meta: { '*.css': { loader: 'systemjs-plugin-css' }, '*.vue': { loader: "../plugin-vue/index.js" } } }); })(this);