2012-03-23 73 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後端來做到這一點,但如果我能弄明白的話,我會很沮喪。希望這可以幫助別人節省一些時間!

相關問題