【问题标题】:Why am I losing the Session here?为什么我会在这里失去会话?
【发布时间】:2009-01-09 23:44:44
【问题描述】:

我有一个带有按钮的页面,当我单击该按钮时,它会从数据库中检索数据并将其存储到数据表中并将其绑定到 GridView。此数据表存储在 Session 变量中。我还有一个将指定列从数据表导出到 excel 文件的按钮,但是当我第二次单击导出按钮时,出现以下错误:

对象引用未设置为对象的实例。

似乎发生在这一行:

dtExport.Columns["Business"].ColumnName = "被许可人";

我想我知道为什么了,原来的列叫“Business”,但是我导出的时候,想把列标题导出为Licensee,所以我把ColumnName改成了“Licensee”;但是,当我第二次调用 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,它是否仍然存在?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    我猜该值是通过引用,当您更改业务列名称时,它也会在会话中更改。我会试试这个:

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

    【讨论】:

    • 可以,但只是在下载到excel的按钮上,这种情况比较少见。取决于数据表的大小。
    • 这是最好的解决方案。我猜是因为我在复制,所以我保持原始列名不变,但另一方面,我实际上是在内存中更改它们,这是一个很好的思考方式吗?
    【解决方案2】:

    你得到的不是一个新的 DataTable,你得到的是你最初生成的那个。您对其所做的任何更改都将留待后续使用。

    在这种情况下,我会将列重命名为导出后的原始名称。

    【讨论】:

    • 只检查列是否存在不是更简单吗?
    • 它更容易,但是如果您对该对象的原始形式有其他用途怎么办。似乎重命名纯粹是为了满足 excel 导出的需要。如果更改应该是永久性的,那么它应该发生在源头上。
    【解决方案3】:

    这是一个糟糕的解决方案,但是......添加

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

    在你的方法结束时恢复初始状态。 并添加一些错误/存在检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2012-03-13
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多