我有一些现有的自定义Excel工作簿/应用程序,带有代码隐藏的C#,可以正常工作。他们执行的操作包括引用活动工作表中定义的表,将其数据源设置为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的数据源(并且可能告诉它自己刷新)。
谢谢!非常感谢任何帮助。
答案 0 :(得分:0)
我最终使用了以下方法,效果很好。
在工作簿级别,我添加了一个类型为“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;
}
每个工作表都知道它属于哪个从零开始的索引,因此这个特定工作表使用index == 0,而第二个工作表将使用index == 1.
现在,当我想在我的客户端的任何地方访问另一个工作表的特定成员时,我引用相应的索引,强制转换为我想要的工作表的相应类型,然后转到城镇:
((Sheet4)ThisWorkbook.StoredWorksheets[3]).Table2.DataSource = results;
((Sheet4)ThisWorkbook.StoredWorksheets[3]).Table2.RefreshDataRows();
我确信使用COM后端有一种更简单的方法可以做到这一点,但是如果我能弄明白的话,我会感到很沮丧。希望这可以帮助别人节省一些时间!