首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel VSTO C# -创建ListObject的VSTO对应断点重命名

Excel VSTO C# -创建ListObject的VSTO对应断点重命名
EN

Stack Overflow用户
提问于 2020-09-09 19:39:54
回答 1查看 216关注 0票数 1

我正在使用C#为Excel编写一个VSTO插件,需要将元数据绑定到在工作表中创建的表,当工作表中的表被复制时,这些表不能暴露给用户或被复制。为此,我使用了ListObject's Tag property,它工作得很好,似乎就是为这个用例而设计的。为了设置Tag属性,我创建了ListObject的VSTO对象,因为该属性在互操作对象中不可用:

代码语言:javascript
复制
foreach (Microsoft.Office.Interop.Excel.Worksheet worksheet in Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets)
{
    foreach (Microsoft.Office.Interop.Excel.ListObject table in worksheet.ListObjects)
    {
        Microsoft.Office.Tools.Excel.ListObject vstoTable = Globals.Factory.GetVstoObject(table);
        vstoTable.Tag = new Tag { Identifier = 123 };
    }
}

但是,一旦我为ListObject创建了VSTO对象,我就不能再更改表的名称。我仍然可以在表选项UI中对其进行编辑,但是保存工作簿将自动将其名称恢复为创建VSTO对象时的名称。我尝试处理VSTO对象,但没有成功。即使我没有设置Tag,这个问题仍然存在,仅仅创建VSTO对象似乎就足以触发这个问题。有趣的是,我还为工作表创建了VSTO对象副本,并设置了它们的Tag属性,但即使在创建了对象和设置了标记之后,我仍然可以重命名它们。

为了验证我的其他代码都没有影响到这一点,我创建了一个新的外接程序项目,其中只有上面的代码片段放在功能区按钮上,同样的问题也发生了。我还尝试使用互操作中提供的其他几个属性,以避免创建VSTO对象,但它们要么向用户公开,要么与表一起复制,要么两者兼而有之。

很明显,我不是错误地使用了对象,就是这是Excel中的一个问题。有没有人知道如何设置Tag而不失去重命名表的能力,或者是否有其他方法可以用来将元数据附加到表中?

EN

回答 1

Stack Overflow用户

发布于 2021-01-23 05:38:25

您可能希望尝试删除并重新创建每次都具有您想要的名称的列表对象,如此扩展方法所示。这在您的解决方案中可能不起作用,或者您可能必须修改参数以创建具有“新”名称的旧列表对象。每次重新创建列表对象时,我都会对其进行数据绑定,因此这适用于我的情况。

代码语言:javascript
复制
    /// <summary>
    /// Creates a VSTO list object by searching for a native list object by name
    /// If the list object is found it will cast it to a 
    /// VSTO list object and remove it from the worksheet
    /// Once removed (or not found) it will create a VSTO list object
    /// and add it to the worksheet
    /// </summary>
    /// <param name="worksheet"> The worksheet to add the list object to</param>
    /// <param name="name"> The name of the list object to re-create </param>
    /// <returns> The VSTO list object </returns>
    public static ExcelVSTO.ListObject RecreateVSTOListObject(this ExcelVSTO.Worksheet worksheet, string name)
    {
        Excel.ListObject listObject = Globals.ThisAddIn.GetListObjectByName(worksheet, name);

        if (listObject != null)
        {
            Microsoft.Office.Tools.Excel.ListObject vstoListObject = Globals.Factory.GetVstoObject(listObject);
            worksheet.Controls.Remove(name);
        }

        return worksheet.Controls.AddListObject(Globals.ThisAddIn.Application.Selection, name);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63810894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档