Excel任务窗格绑定数据更改事件永远不会结束
Excel Task Pane - bindingDataChanged event never ends
我正在Excel任务窗格应用程序上工作。基本上它所做的是在用户键入时更改具有无效格式(邮政编码r1243)的单元格的背景颜色。我创建了一个绑定,并添加了一个事件处理程序bindingdatachchanged,用于侦听数据更改。如果有任何更改,请验证格式并更改背景颜色。代码如下:
代码是一种工作,但问题是,onbindingdatachchanges似乎永远不会结束,即使没有数据上的任何变化。会出什么问题呢?
function listenChanges() {
Office.select("bindings#customerTableBinding").addHandlerAsync(Office.EventType.BindingDataChanged, onBindingDataChanged, function (asyncResult) {
if (asyncResult.status === "failed") {
app.showNotification('Error: ' + asyncResult.error.message);
} else {
app.showNotification('New event handler added for binding.');
}
});
}
function onBindingDataChanged(eventArgs) {
eventArgs.binding.getDataAsync({coercionType: 'table'},
function (asyncResult) {
if (asyncResult.status == 'succeeded') {
var table = new Office.TableData();
table.headers = asyncResult.value.headers;
table.rows = asyncResult.value.rows;
var column = getColumns(table);
var rows = getRows(table, column);
eventArgs.binding.setFormatsAsync([{ cells: Office.Table.Data, format: { backgroundColor: "white" } }], function (asyncResult) { });
for (var i = 0; i < rows.length; i++) {
eventArgs.binding.setFormatsAsync([{ cells: { row: rows[i], column: column }, format: { backgroundColor: "red", fontStyle: "bold" } }], function (asyncResult) { });
}
}
else
app.showNotification("The error message is " + asyncResult.error.message);
});
}
function getColumns(table) {
var column;
for (var i = 0; i < table.headers.length; i++) {
for (var j = 0; j < table.headers[i].length; j++) {
if (table.headers[i][j] == "PostalCode") {
column = j;
}
}
}
return column;
}
function getRows(table, column) {
var rows = new Array();
for (var i = 0; i < table.rows.length; i++) {
if (!isValidUSZip(table.rows[i][column])) {
rows.push(i);
}
}
return rows;
}
function isValidUSZip(zip) {
return /^'d{5}(-'d{4})?$/.test(zip);
}
eventArgs.binding。setFormatsAsync([{cells: Office.Table.]数据,格式:{backgroundColor: "white"}}],函数(asyncResult) {});
每次更改事件触发时,将背景设置为白色。这将再次触发change事件(导致无限循环)。要解决这个问题,您可以在触发数据事件操作时删除处理程序,然后在进行更新后将其添加回来。
function addHandlerChanged() {
if (selfBinding) {
selfBinding.addHandlerAsync(
Office.EventType.BindingDataChanged, dataChangeEvent);
}
}
function removeHandlerChanged() {
if (selfBinding) {
selfBinding.removeHandlerAsync(
Office.EventType.BindingDataChanged, { handler: dataChangeEvent }, function (result) {
});
}
};
function dataChangeEvent(eventArgs) {
//remove handler
removeHandlerChanged();
// do you're table format update here
//then add the handler back
addHandlerChanged();
}
相关文章:
- 分派点击事件并保留击键修饰符
- 模糊事件的Javascript测试
- keyup事件处理程序更改焦点不适用于快速键入
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 如何使Javascript动态html表及其上的事件
- 使用类从一个标记中双击事件
- 如何在未直接触发的情况下停止事件
- 我的链接按钮的OnClick事件永远不会被触发
- Watchify 更新事件永远不会在 Virtualbox 中触发
- ios CordovaJavaScript焦点事件永远不会到来
- Touchstart 事件永远不会在网页加载的首次加载时在 Android Chrome 上触发
- IE8:提交事件永远不会被Extjs 4捕获
- jQuery事件方法:如何更改javascript'单击'事件到'永远开火;
- Jquery+IE10-附加到提交按钮的onclick事件永远不会触发
- FileReader'的onloadend事件永远不会被触发
- iOS Safari似乎永远不会触发滚动事件,如果鼠标下的元素只有"overflow-y: scroll&qu
- 加载数据事件永远不会触发
- Chrome扩展事件页面w/音频永远不会停止
- Excel任务窗格绑定数据更改事件永远不会结束
- 动态创建iframe的onload事件在IE中永远不会触发