2013-03-16 10 views
5

!IsPostBack内の静的なデータテーブルに列を動的に追加します。DataTableのSystem.Data.DuplicateNameException

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

しかし、私は二度目の私のウェブサイトを実行するときには、この

例外の詳細のような例外を示しています。System.Data.DuplicateNameExceptionは:「SLNO」という名前の列は既にこのデータテーブルに属しています。

誰がどのようにASP.NETでこの問題に

答えて

2

スタティックデータテーブルとは、Webページのインスタンスに関係なく常に存在することを意味します。したがって、初めてWebページを実行すると、Page_Loadによってデータテーブルが作成され、すべてが良好です。

しかし、そのページをもう一度読み込んだり、誰かがあなたのページを読み込もうとすると、静的なのでデータテーブルはまだそこにあります。あなたがこの問題を回避でき

3つの方法:
1.削除し、再度列を追加します。これをやってはいけません。あらゆる面で冗長で悪いコードです。
2. dtp.Columns.Addsの周りにifステートメントを追加して、ページが初めて読み込まれるときにのみ実行するようにします。あなたは列車が存在するかどうかを確認することができます、あなたはブール旗を作成することができますか、またはあなたが考える別の手段。
3.変数宣言から静的を削除し、ページが読み込まれるたびに新しいデータテーブルが作成されるようにします。これを行う場合は、おそらくデータテーブルを静的なデータソースの基にする必要があります。

3

staticを解決するに教えてもらえますが(マルチスレッド)すべての要求ためを意味するので、このページに起こっても、別のユーザーが同じインスタンスを使用していますDataTable。だからすでにそれが理由だった。

解決策は静的にしないことです。

ポストバック(セッション、ViewStateなど)をまたいで維持するには、別の方法を使用する必要があります。

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

注:私は偶数フィールドとしてではなく、それを返すメソッド内のローカル変数としてそれを使用することはありません。この方法で、データを必要とする場合はいつでもこのメソッドを使用できます。通常、GridViewのようなWebdataboundコントロールにバインドします。GridViewは、ViewStateでポストバック間の値を保持します。したがって、テーブル自体を維持する必要はありません。