我有一些现有的自定义Excel工作簿/应用程序与代码隐藏的C#,它工作正常。他们做的事情就像引用在活动工作表中定义的表格,将他们的数据源设置为IEnumerables等。如何获得不是活动的标签/工作表中的表的引用
但是,现在我需要引用一个不在活动工作表中的表。基本上,活动工作表有一个触发一些C#代码隐藏的按钮,我需要弄清楚如何在工作簿的第四个选项卡/工作表中获取对表的引用,同时在第一个选项卡/工作表(活动的)。
在我现有的代码(工作),我可以的工作表上做到这一点:
this.Table1.DataSource = results;
this.Table1.RefreshDataRows();
...这样的“表1”的参考是那里,我可以很容易地访问它。
但是,试图获得对其他表中的表的引用,我遇到了ComObject错误。例如,我希望这(或类似的东西)会工作:
((Sheet4)Application.Worksheets[3]).Table2.DataSource = results;
((Sheet4)Application.Worksheets[3]).Table2.RefreshDataRows();
...但抛出的错误:“无法将类型‘系统.__ ComObject’到ContractStatementClient.Sheet4' ”。编写这些行允许Visual Studio使用IntelliSense查找表(表2),但在执行时,它会因我提到的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的数据源(大概告诉它自己刷新)。
谢谢!任何帮助是极大的赞赏。
'Application.ActiveWorkbook.Worksheets [3] .Table2.DataSource'不工作吗? – Aprillion 2012-03-23 20:40:32
为了让Visual Studio与此一起工作,我必须执行如下操作:'((Sheet4)Application.ActiveWorkbook.Worksheets [3])。Table2.DataSource = results;',但是在运行时抛出'Can not将类型'System .__ ComObject'转换为'ContractStatementClient.Sheet4'。 – Egahn 2012-03-23 20:56:27
我应该说在这一点上,我已经通过在工作簿级别为我的所有工作表创建一个静态容器,并且在工作表启动时将工作表添加到该容器中来解决此问题。所以我可以通过我的容器直接访问每个工作表,并绕过所有的COM业务(我不赞同)。我仍然很好奇,如果有人有更直接的答案来获得这些对象! – Egahn 2012-03-23 20:58:08