【问题标题】:How to get selected rows and column index and count in Word JS如何在 Word JS 中获取选定的行和列的索引和计数
【发布时间】:2016-09-20 18:41:04
【问题描述】:

我有一个 Word 插件 (API 1.3) 项目,我可以在其中插入表格并使其成为内容控件。我使用以下代码来识别用户是否在表格内单击或选择了其中的任何单元格。

Office.context.document.addHandlerAsync(Office.EventType.DocumentSelectionChanged,
  function() {
    Word.run(function(ctx) {
      var ctrl = ctx.document.getSelection().parentContentControl;

      return ctx.sync()
        .then(function() {
          if (!ctrl.isNull) { // found - clicked inside the control
            // ... load some properties, ...
            ctrl.load('tag'); // How to get startRow, startCol, rowCount, colCount?

            ctx.sync()
              .then(function() {
                console.log(ctrl.tag);
              }).catch(function(err) {
                console.log(err);
              });
          }
        }).catch(function(err) {
          console.log(err);
        });
    });
  });

有没有办法从这里获取 startRow、startCol、rowCount、colCount,就像在 selectionChanged 的​​绑定事件处理程序中一样?

【问题讨论】:

    标签: javascript office365 office-js word-addins


    【解决方案1】:

    感谢您分享这个问题。您的代码有 2 个问题:

    1. 您正在订阅文档选择更改,但您确实想要进行绑定选择更改。请注意,坐标仅在 Table Bindings 上返回。
    2. 一旦您有一个表绑定并订阅了正确类型的事件,您需要在处理程序上添加事件参数以访问您需要的值。

    查看以下代码以了解如何创建表绑定以及如何使用处理程序上的 eventArgs 来获取您需要的信息(另请注意,如果您有,您将在充当标题的行上获得未定义表中定义的标题):

     Office.context.document.bindings.addFromSelectionAsync(Office.BindingType.Table, function (result) {
                if (result.status == Office.AsyncResultStatus.Succeeded) {
                    // after creating the binding i am adding the handler for the BindingSelectionChanged, check out eventArgs usage....
                    var binding = result.value;
                    binding.addHandlerAsync(Office.EventType.BindingSelectionChanged, function (eventArgs) {
                        app.showNotification('Selection Coordinates: ' + eventArgs.startColumn + " " + eventArgs.columnCount + " " + eventArgs.startRow + " " + eventArgs.rowCount);
                    });
                }
            });

    希望这能让您朝着正确的方向前进。谢谢! 胡安。

    【讨论】:

    • 我对表格使用内容控件,但我没有对它们进行绑定。这是否意味着如果用户在表格内单击,我需要找到附加到表格的内容控件,选择整个表格,从中进行绑定,然后要求用户再次选择单元格以便我可以得到列和行?同时在桌面上进行绑定和内容控制听起来有点过头了。
    • 如果你想获取事件,你需要创建一个绑定,在Word中这意味着创建一个内容控件。请注意,绑定是您只需要执行一次的操作,在这种情况下,似乎是您在文档中实际插入表格的时间。创建绑定和事件处理程序后,事件将触发,您无需告诉用户重新选择单元格。
    • 我用var table = ctx.document.body.insertTable(value.length, value[0].length, "end", value); var myContentControl = table.insertContentControl(); ctx.sync()添加表格。然后用doc.bindings.getAllAsync 在文档中查找绑定,我没有。我是否需要在创建内容控件时使用doc.bindings.addFromSelectionAsync 以便您建议的工作方式?
    • 在这种情况下,我建议您为内容控件添加标题,因此在您执行 var myContentControl = table.insertContentControl();做一个 myContentControl.title="Foo";然后您可以实际使用 doc.bindings.addFromNamedItemAsync("foo","table"...) 这样您就可以更可靠地创建绑定。请在此处查看文档dev.office.com/reference/add-ins/shared/…
    • 谢谢你,胡安!我会稍微定制您的建议并实施。
    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2016-06-20
    • 2012-08-03
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多