2013-03-16 5 views
5

Aggiungo dinamicamente colonne a una tabella di dati statici in! IsPostBack.System.Data.DuplicateNameException in DataTable

static DataTable dtflow = new DataTable(); 

protected void Page_Load(object sender, EventArgs e) 
    { 

     if (!IsPostBack) 
     { 
      dtp.Columns.Add("slno"); 
      dtp.Columns.Add("portname"); 
      dtp.Columns.Add("type"); 
      dtp.Columns.Add("portid"); 
      dtp.Columns.Add("longitude"); 
      dtp.Columns.Add("latitude"); 
      dtp.Columns.Add("add1"); 
      dtp.Columns.Add("add2"); 
      dtp.Columns.Add("dist"); 
      dtp.Columns.Add("state"); 
      dtp.Columns.Add("country"); 
     } 
    } 

Ma quando eseguo il mio sito web per la seconda volta si vede un'eccezione come questo

Dettagli eccezione: System.Data.DuplicateNameException: una colonna denominata 'slno' appartiene già a questo DataTable.

Qualcuno può dirmi come risolvere questo problema

risposta

2

Un datatable statico indica che sarà sempre presente indipendentemente dalle istanze delle pagine Web. Pertanto, quando esegui la pagina Web per la prima volta, il tuo Page_Load crea il datatable e tutto è buono.

Ma quando si carica quella pagina una seconda volta o se qualcun altro prova a caricare la pagina, il datatable è ancora lì poiché è statico, quindi si sta tentando di aggiungere colonne al datatable quando già esistono.

3 modi si potrebbe ottenere intorno a questo:
1. rimuovere e quindi aggiungere di nuovo le colonne. Non farlo mai, è un codice ridondante e cattivo in ogni aspetto.
2. Aggiungere un'istruzione if attorno a dtp.Columns.Adds per assicurarsi che venga eseguita solo la prima volta che viene caricata la pagina. Puoi controllare se esistono i columnd, puoi creare un flag bool o un altro significa che tu pensi.
3. Rimuovi statico dalla dichiarazione della variabile in modo che ogni volta che la pagina carichi venga creato un nuovo datatable. Se si esegue questa operazione, probabilmente si desidera basare il datatable su un'origine dati statica.

3

static a ASP.NET (multi-threaded) significa per tutte le richieste, quindi, anche un altro utente che sta andando a questa pagina è utilizzando la stessa istanza di il DataTable. Quindi questa era già la ragione.

La soluzione è quella di non renderlo statico.

È necessario utilizzare un altro modo per mantenerlo tra i postback (ad esempio, Session, ViewState, ecc.).

Nine Options for Managing Persistent User State in Your ASP.NET Application

Nota: non avrei nemmeno usarlo come campo, ma come una variabile locale in un metodo che restituisce. In questo modo puoi usare questo metodo ovunque ti servano quei dati. Normalmente lo si associa a un controllo WebDatabound come GridView che mantiene i valori attraverso i postback tramite ViewState. Quindi non è necessario mantenere il tavolo stesso.