6

!IsPostBackの静的データテーブルに列を動的に追加しています。

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

しかし、2回目にWebサイトを実行すると、次のような例外が表示されます。

例外の詳細:System.Data.DuplicateNameException:「slno」という名前の列はすでにこのDataTableに属しています。

誰かがこの問題を解決する方法を教えてもらえますか

4

2 に答える 2

3

staticin ASP.NET(マルチスレッド) はすべてのリクエストを意味するため、このページにアクセスしている別のユーザーでさえ、 の同じインスタンスを使用していますDataTable。それがすでに理由でした。

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

ポストバック間でそれを維持するには、別の方法を使用する必要があります (たとえば、Session、ViewState など)。

ASP.NET アプリケーションで永続的なユーザー状態を管理するための 9 つのオプション

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

于 2013-03-16T12:10:30.003 に答える
3

静的データテーブルとは、Web ページのインスタンスに関係なく、常に存在することを意味します。そのため、初めて Web ページを実行すると、Page_Load によってデータテーブルが作成され、すべて問題ありません。

しかし、そのページをもう一度ロードするとき、または他の誰かがページをロードしようとすると、データテーブルは静的であるためまだそこにあるため、列が既に存在するときにデータテーブルに列を追加しようとします.

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

于 2013-03-16T12:12:47.657 に答える