2012-03-23 72 views
0

我有一些现有的自定义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的数据源(大概告诉它自己刷新)。

谢谢!任何帮助是极大的赞赏。

+0

'Application.ActiveWorkbook.Worksheets [3] .Table2.DataSource'不工作吗? – Aprillion 2012-03-23 20:40:32

+0

为了让Visual Studio与此一起工作,我必须执行如下操作:'((Sheet4)Application.ActiveWorkbook.Worksheets [3])。Table2.DataSource = results;',但是在运行时抛出'Can not将类型'System .__ ComObject'转换为'ContractStatementClient.Sheet4'。 – Egahn 2012-03-23 20:56:27

+0

我应该说在这一点上,我已经通过在工作簿级别为我的所有工作表创建一个静态容器,并且在工作表启动时将工作表添加到该容器中来解决此问题。所以我可以通过我的容器直接访问每个工作表,并绕过所有的COM业务(我不赞同)。我仍然很好奇,如果有人有更直接的答案来获得这些对象! – Egahn 2012-03-23 20:58:08

回答

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; 
} 

每个工作表知道哪个从零开始的索引它落入,所以这个特定表使用索引== 0,而第二片将使用索引== 1。

现在,当我想访问另一个工作表中的特定成员在我的客户在任何地方,我引用相应的指数,转换为适当的类型我想要的片,和去镇:

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

我确定有一种更直接的方式来使用COM后端来做到这一点,但如果我能弄明白的话,我会很沮丧。希望这可以帮助别人节省一些时间!

相关问题