我有一个带有按钮的页面,当我单击它时,它会从数据库中检索数据并将其存储到数据表中并将其绑定到GridView。该数据表存储在Session变量中。我还有一个按钮,用于将指定列从数据表导出到excel文件,但是当我再次单击导出按钮时,出现以下错误:
对象引用未设置为对象的实例。
这似乎发生在这一行:
dtExport.Columns [“Business”]。ColumnName =“被许可人”;
我想我知道为什么,原始列名为“Business”,但是当我导出时,我想将列标题导出为被许可方,因此我将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时,即使您再次从Session获取新的DataTable,它是否仍然存在?
答案 0 :(得分:3)
我猜测该值是通过引用,当您更改业务列名称时,它也会在Session中更改。我会试试这个:
DataTable dtExport = (Session["dtSearchResults"] as DataTable).Copy();
答案 1 :(得分:1)
您没有获得新的DataTable,而是获得最初生成的DataTable。您对其所做的任何更改仍有待后续使用。
在这种情况下,我会在导出后将列重命名为其原始名称。
答案 2 :(得分:1)
这是一个糟糕的解决方案,但是......添加
dtExport.Columns["Licensee"].ColumnName = "Business";
在您的方法结束时恢复初始状态。 并添加一些错误/存在检查。