2010-08-18 51 views
1

背景:我從數據庫中填充大量asp.net c#GridViews和ListViews,隨後用戶可能會將它們導出到Excel。我想導出爲本機Excel(不是html)。我無法使用辦公自動化,而且我使用的JET工作正常。我無法控制用戶的機器。GridView中的Typeof數據/列表視圖綁定,模板和自動生成的字段


問題:在做出口的,你得告訴噴氣什麼類型的每個字段,在我的情況下,「文本」(VARCHAR)或「數字」(雙)。不同之處在於,如果您導出數字列,則用戶可以在Excel中對數據進行求和,其中字符串使用前導撇號導出,因此在算術中用處不大。

目前我解析Grid/ListView的第一個數據行,檢查每個值是數字還是文本,並相應地爲列指定一個類型。這是有效的,除了當我有第一列中看起來數字,但實際上是一個文本字符串的東西。我不想解析每一行,以確保我有正確的數據類型,因爲其中一些導出非常大。

當我從數據庫加載Grid/ListView時,數據庫肯定知道每個字段是什麼類型。所以我的問題是...我如何提取Grid/ListView項目後面的數據庫項目的類型?我可以明確地將其編碼爲該項目的一個屬性,但這是重複我已擁有的信息,只要我能達到它。

我知道我在哪裏有DataTable,然後我可以從中獲取底層類型,但大多數情況下我沒有方便的表格,只是Grid/ListView。

- (編輯) 請注意,如果您嘗試將空字符串插入可爲空的數字列,則Jet將拋出。執行此操作的方法是從插入語句中省略該列名稱,或輸出零。

回答

0

我想你想要做的是在GridViewListView被綁定之後找出底層DataSource

如果這樣做是不可能的,因爲控件一旦綁定就不會跟蹤DataSource。它們主要用於填充列,模板等,然後只保留這些項目。

我可以提供的唯一建議是將DataSource存儲在另一個位置,以便稍後可以訪問它,然後使用它來發現用於每列的基礎數據類型。如果需要,您可以將其存儲在SessionViewState中,但這會增加開銷。另一種選擇是在綁定之前找出數據類型,然後將它們存儲在隱藏字段中,並使用稍後可用於複製正在完成的某種格式的格式。

EG(壞的榜樣,但給你一個想法)存儲在一個隱藏字段以下數據:

yourHiddenField.Text = "0,1|1,1|2,0|3,1|etc..."; 
// format "columnindex,fieldtype(0=double,1=string)" with a pipe delimiter. 

不漂亮,但說明我想到的基本思想。

+0

嗯......我試圖避免在任何地方明確地編碼數據類型,因爲數據庫知道它是什麼,我不想複製這些知識。也許沒有辦法避免編碼。 – philw 2010-08-18 19:26:28

+0

@philw你不會明確地做到這一點,你只需要捕獲這些信息並以一種可以訪問的格式進行存儲。在你需要的地方,它已經不存在了,所以你需要一種方法來獲取數據。希望有所幫助。 – Kelsey 2010-08-18 20:00:56

0

據我所知,答案是「你不能」。我的數據源只返回字符串,所以你不能有效地解析任何自動創建的列類型的DataTable。


我所做的是 ...

大多數列類型我可以從看網格/列表的第1行「嗅」。這隻有在第一列數據爲空(不會告訴你什麼)或第一列意味着數字但列數據是例如字母數字時纔會失敗。

因此,對於那些我知道存在問題的列或測試顯示的情況,我使用自定義屬性註釋這些特定的Grid或ListView項目,這會強制將項目導出爲文本或數字。我默認爲文本,所以在實踐中,我大多隻需要註釋那些我特別想渲染爲數字的條目。例外情況是一些以前導零開頭的ID號,我想以這種方式呈現,因此明確地作爲文本。我有一個數據表(例如圖表),我不能做嗅探技巧(見上文)或註釋技巧(同上),然後我將列類型的地圖傳遞給我的導出代碼。

總之,在某些情況下,我不得不在Grid/ListView模板字段或字段映射中重複列類型定義。無法贏得他們。它確實有效。

相關問題