2009-01-09 11 views
0

J'ai une page avec un bouton que lorsque je clique, il récupère les données d'une base de données et les stocke dans un datatable et le lie à un GridView. Cette donnée est stockée dans une variable de session. J'ai aussi un bouton qui exporte les colonnes spécifiées du datatable vers un fichier Excel, mais lorsque je clique une seconde fois sur le bouton d'export, j'obtiens l'erreur suivante:Pourquoi est-ce que je perds la session ici?

La référence d'objet n'est pas définie sur une instance d'un objet.

Il semble se produire à cette ligne.

dtExport.Columns [ "affaires"] = NomColonne "Licencié"; Je pense que je sais pourquoi, la colonne d'origine s'appelle "Business", mais quand j'exporte, je veux exporter l'en-tête de la colonne en tant que Licencié, donc je change le nom de la Colonne en "Licencié"; Toutefois, lorsque j'appelle Export une seconde fois, il recherche à nouveau dtExport.Columns ["Business"], qu'il ne trouve pas, ce qui provoque une erreur. Ai-je juste besoin de vérifier si la colonne a déjà été renommée pour résoudre ce problème ou existe-t-il un autre moyen?

Voici le code qui fait l'exportation:

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")); 
    } 

Lorsque vous modifiez un NomColonne, est-il Persit, même si vous obtenez une nouvelle DataTable de session à nouveau?

Répondre

3

Je suppose que la valeur est par référence, et lorsque vous modifiez le nom de la colonne Business, elle est également modifiée dans Session. Je voudrais essayer ceci:

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

Est-ce que cela a des performances ou une surcharge? – Xaisoft

+0

Bien sûr, mais seulement sur le bouton cliquez sur le téléchargement pour exceller, ce qui est relativement peu fréquent. Dépend de la taille de la datatable. – Shawn

+0

C'était la meilleure solution. Je suppose que parce que je copie, je garde intacts les noms de colonnes d'origine, mais dans l'autre sens, je les changeais en mémoire, est-ce une bonne façon d'y penser? – Xaisoft

1

Vous n'êtes pas obtenir un nouveau DataTable que vous obtenez le même que celui que vous avez initialement généré. Tout changement que vous y apporterez restera à voir par les utilisations ultérieures.

Dans ce cas, je renommerais la colonne à son nom d'origine après l'exportation.

+0

N'est-il pas plus simple de vérifier si la colonne existe? – Xaisoft

+0

C'est plus facile mais que faire si vous avez d'autres utilisations pour cet objet dans sa forme originale. Il semble que le changement se produise uniquement pour répondre aux besoins de l'exportation Excel. Si le changement doit être permanent, il doit se produire à la source. – AnthonyWJones

1

C'est une solution terrible, mais ... ajouter

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

à la fin de votre méthode pour rétablir la situation initiale. Et ajouter un contrôle d'erreur/existence.

Questions connexes