2009-01-09 33 views
0

我有一個帶有按鈕的頁面,當我點擊它時,它從數據庫中檢索數據並將其存儲到數據表中並將其綁定到GridView。該數據表存儲在Session變量中。我也有一個按鈕,可以將數據表中的指定列導出到excel文件,但是當我第二次單擊導出按鈕時,出現以下錯誤:爲什麼我在這裏失去了Session?

未將對象引用設置爲對象的實例。

似乎在這條線的情況發生:

dtExport.Columns [ 「業務」]的ColumnName = 「許可」;我想我知道爲什麼,原來的列被稱爲「業務」,但是當我導出時,我想導出列標題作爲被許可方,所以我將ColumnName更改爲「被許可方」;但是,但是,當我第二次調用Export時,它再次查找dtExport.Columns [「Business」],因此它會引發錯誤。我是否需要檢查列是否已被重命名爲解決此問題還是有其他方法?

這裏是做出口的代碼:

private void ExportExcel() 
{ 
    DataTable dtExport = Session["dtSearchResults"] as DataTable; 

    dtExport.Columns["Business"].ColumnName = "Licensee"; 

    List<int> columnSelect = new List<int>(); 

    columnSelect.Add(dtExport.Columns["Licensee"].Ordinal); 
    columnSelect.Add(dtExport.Columns["Name"].Ordinal); 
    columnSelect.Add(dtExport.Columns["Address"].Ordinal); 
    columnSelect.Add(dtExport.Columns["City"].Ordinal); 
    columnSelect.Add(dtExport.Columns["State"].Ordinal); 
    columnSelect.Add(dtExport.Columns["Zip"].Ordinal); 

    int[] ColList = columnSelect.ToArray(); 

    GridViewExportUtil.ExportDetails(dtExport, 
            ColList, 
            GridViewExportUtil.ExportFormat.Excel, 
            string.Format("{0}_{1}-{2}-{3}{4}", 
            "SearchResults", 
            DateTime.Now.Month, 
            DateTime.Now.Day, 
            DateTime.Now.Year, 
            ".xls")); 
    } 

當您更改的ColumnName,它persit,即使你從會話中獲取一個新的DataTable一遍嗎?

回答

3

我猜的價值是通過引用,並且當您更改業務列名稱它也在會話中更改。我會試試這個:

DataTable dtExport = (Session["dtSearchResults"] as DataTable).Copy(); 
+0

這是否有任何性能或開銷的打擊? – Xaisoft 2009-01-09 15:43:03

+0

當然,但只有下載的按鈕點擊才能出色,這是相對罕見的。取決於數據表的大小。 – Shawn 2009-01-09 15:47:51

1

你沒有得到一個新的DataTable,你得到的是你最初生成的一個新的DataTable。您對它做出的任何更改將會在後續使用中看到。

在這種情況下,我會在導出後將列重命名爲原始名稱。

1

這是一個可怕的解決方案,但是......添加

dtExport.Columns["Licensee"].ColumnName = "Business"; 

在你的方法結束,恢復初始狀態。 並添加一些錯誤/存在檢查。

相關問題