1

ページに asp プレースホルダーがあり、そこに「行」を動的に挿入します。各行はユーザー コントロールです。

リクエストが GET リクエストの場合、データベースからデータをロードし、必要な数のユーザー コントロールを設定します。また、コントロール インスタンスをセッション コンテンツに追加します。

リクエストが POST リクエストの場合、最初に Page_Load() 内のセッションの内容を確認してコントロールを再作成します。その後、各ボタンのハンドラーは、新しい行を (プレースホルダー、セッション、および DB に) 追加する、行を削除する (プレースホルダー、セッション、および DB から)、または更新するなど、必要な追加作業を実行できます。既存の行。

ここでいくつかの問題に直面しています:

  1. 行を削除すると、正しい行が削除されたにもかかわらず、削除後に間違ったデータが画面に表示されることがあります。これ以上の削除では、どの行が影響を受けるかわからないため、これは危険です。
  2. 新しい行を追加すると、既存の行の 1 つに間違ったデータが含まれることがあります (特に、別の既存の行からのデータ)。

これらの問題を解決するにはどうすればよいですか? 問題を診断することさえ困難です。これらは一般的な問題ですか?私はこれを完全に間違っていますか?これを達成するためのより良い方法は何ですか?

4

1 に答える 1

1

私は以前にこのような問題を抱えていました。私はそれらを修正しました:

  • ユーザーコントロールをプレースホルダーに入れる前にインスタンス化する場合、ポストバック前 (つまり、最初に作成したとき) と同じ ID が必要です。のようなことをします"usr_" + <db record id>。これにより、ロードされる順序や削除されるレコードなどに関係なく、同じ ID が保証されます。ID を割り当てないと、.NET が ID を割り当てるため、これはおそらく最も重要なことです。コントロールコレクションに表示される順序で割り当てられます。つまり、間違ったユーザーコントロールに間違った情報が含まれる可能性があります(質問で説明しました)。
  • ページに関する情報を保存するためにセッションを使用しない。ID の問題が修正された後も、同じページの 2 つのタブを開いた場合に問題が発生していました。

これらの行に沿ったもの:

using (SqlConnection c = new SqlConnection(DB_STRING))
{
    c.Open();
    String sql = @"
        SELECT *
        FROM yourTable
        ORDER BY ID;";
    using (SqlCommand cmd = new SqlCommand(sql, c))
    {
        using (SqlDataReader d = cmd.ExecuteReader())
        {
            while (d.Read())
            {
                UserControl uc = (UserControl)new UserControl().LoadControl("~/path/to-your-control/YourControl.ascx");
                uc.ID = "usr_" + d["ID"];
                plcHolderRows.Controls.Add(uc);
            }
        }
    }
}
于 2013-09-26T21:20:20.933 に答える