如何在选项卡/工作表中获得对表的引用,而该表不是';t活动的

本文关键字:活动 引用 选项 工作 | 更新日期: 2023-09-27 18:28:54

我有一些现有的带有C#代码的自定义Excel工作簿/应用程序,它们运行良好。他们做一些事情,比如引用活动工作表中定义的表,将数据源设置为IEnumerables,等等。

但是,现在我需要引用一个不在活动工作表中的表。基本上,活动工作表有一个按钮,可以触发一些C#代码隐藏,我需要弄清楚如何在工作簿的第四个选项卡/工作表(活动选项卡)的代码隐藏中引用表。

在我现有的代码(有效)中,我可以在活动表上这样做:

this.Table1.DataSource = results;
this.Table1.RefreshDataRows();

所以"Table1"引用就在那里,我可以很容易地访问它。

然而,在试图获得对另一张工作表中的表的引用时,我遇到了ComObject错误。例如,我希望这个(或类似的东西)能起作用:

((Sheet4)Application.Worksheets[3]).Table2.DataSource = results;
((Sheet4)Application.Worksheets[3]).Table2.RefreshDataRows();

但这引发了错误:"无法将类型"System.__ComObject"转换为ContractStatementClient.Sheet4"。通过写入这些行,Visual Studio可以使用IntelliSense查找表(Table2),但在执行时它会失败,并出现我提到的ComObject错误。"Sheet4"是Visual Studio在我制作新选项卡时为我创建的类的名称。

我可以通过以下操作获得工作表的参考:

Application.ActiveWorkbook.Worksheets[3]

但我似乎不知道如何从那里获得一个表(或ListObject)的句柄,我可以像过去那样设置DataSource属性。

我试过了,但它在转换过程中抛出了一个"NOINTERFACE"COM错误:

Worksheet worksheet = Application.ActiveWorkbook.Worksheets[3];
((Microsoft.Office.Tools.Excel.ListObject) (worksheet.ListObjects[1])).DataSource = results;

我是不是错过了一些显而易见的东西?我对COM几乎一无所知,所以我很难诊断出发生了什么。最后,我只需要弄清楚如何在另一个选项卡/工作表中为Table/ListObject设置数据源(大概是告诉它刷新自己)。

谢谢!非常感谢您的帮助。

如何在选项卡/工作表中获得对表的引用,而该表不是';t活动的

我最终使用了以下方法,效果非常好。

在工作簿级别,我添加了一个类型为"WorksheetBase"的静态数组,并在"工作簿的启动方法"中对其进行了实例化,如下所示:

public static WorksheetBase[] StoredWorksheets;
private void ThisWorkbook_Startup(object sender, System.EventArgs e)
{
    StoredWorksheets = new WorksheetBase[5];
}

然后,在每个单独的工作表中,我将其添加到"启动"方法中:

private void Sheet1_Startup(object sender, EventArgs e)
{
    ThisWorkbook.StoredWorksheets[0] = this;
}

每个工作表都知道它属于哪个从零开始的索引,所以这个特定的工作表使用索引==0,而第二个工作表则使用索引==1。

现在,当我想在我的客户的任何地方访问另一个工作表的特定成员时,我会引用适当的索引,转换为我想要的工作表的适当类型,然后转到镇上:

((Sheet4)ThisWorkbook.StoredWorksheets[3]).Table2.DataSource = results;
((Sheet4)ThisWorkbook.StoredWorksheets[3]).Table2.RefreshDataRows();

我相信有一种更直接的方法可以使用COM后端来实现这一点,但如果我能弄清楚的话,那就太棒了。希望这能帮助其他人节省一些时间!