質問のリストをユーザーに表示するユーザーコントロールを設計しました。この「質問リスト」コントロールには、リピーターが含まれています。質問に回答するために使用する必要のある質問およびフォームフィールドにはさまざまな種類があるため、ItemTemplateに動的にロードされる一連の「質問入力」コントロールとして実装されます。各質問入力コントロールには、その質問への回答を送信するためのボタンが含まれています。送信された回答は質問のリストを変更することが多いため、回答が送信されてDBに保存された後、質問リストをリバウンドしたいと思います。
上記のすべてが機能していますが、回答が送信された後に質問リストがリバウンドされると、新しいリストに重複した行が含まれ、次のように行が失われます。
元のリスト:
Q1
Q2 <---- Save button clicked on this question
Q3
Q4
新しいリスト(Q2が重複し、Q4が欠落):
Q1
Q2
Q2
Q3
質問リストを再バインドするために動的にロードされた質問入力コントロールで回答の送信を取得する方法は次のとおりです。
質問リストコントロールのPage_Loadで、Page.IsPostBackがtrueの場合、Repeater.DataBind()を呼び出します。これにより、質問入力コントロールが再作成され、ボタンクリックイベントが発生します。最初の課題は、親コントロールのPage_Loadが完了した後にこれらのイベントが発生するという事実でしたが、質問入力コントロールがボタンクリックイベントでTrueに設定できる「ForceReload」プロパティを親コントロールに作成する方法を見つけました。したがって、質問リストコントロールのPage_PreRenderで、ForceReload = trueかどうかを確認し、そうである場合は、Repeater.DataBind()をもう一度呼び出します。
ストレンジネスが発生するのは、この2番目のデータバインドです。コードをステップスルーすると、送信された質問に対応するDataItemが2回表示されます。ただし、2回目に実行されるSQLクエリは、1回目に実行されたものと同じであり、返されるレコードは同じです(つまり、2回目の結果に重複はありません)。
2回目のデータバインディングの前に、ある種のリピーターの「リセット」を実行する必要があると思いますが、それを実行するための関数が表示されません。
考えられる原因....質問の一意キーが1番目のデータバインドと2番目のデータバインドの間で変更されます。奇妙に聞こえるかもしれませんが、それがDBの仕組みです。qivenの質問には、「未回答」状態の「-123」と「回答済み」状態の「123」の一意のIDが含まれる場合があります。IDに同じ状態を強制しても、問題は発生しません。IDの変更は、データソースがテーブルではなくビューであるという事実と関係があり、とにかく私はそれについて何もできません。そして、一意のIDが何であるかわからないのに、なぜリピーターは気にするのでしょうか?
更新:さらにテストを行った後、リピーターやSQLの問題ではなく、間違いなくLINQの問題になりました。簡単な例を次に示します。
最初のバインディングで取得されたデータ:
QuestionID QuestionNumber Answer
---------- -------------- ------
-1 1 null
-2 2 null
-3 3 null
-4 4 null
次に、質問#2が送信され、リストがリバウンドします。2番目のバインディングで取得されたデータ:
QuestionID QuestionNumber Answer
---------- -------------- ------
-1 1 null
2 2 My answer
-3 3 null
-4 4 null
したがって、データは正確に正しいです。ただし、これはLINQによって次のプロパティを持つ4つのオブジェクトに変換されます。
QuestionID QuestionNumber Answer
---------- -------------- ------
-1 (OK) 1 (OK) null (OK)
2 (OK) 2 (OK) My answer (OK)
-3 (OK) 2 (wrong) My answer (wrong)
-4 (OK) 3 (wrong) null (OK)
したがって、各オブジェクトのキープロパティ(QuestionID)は正しいですが、更新された質問の後のオブジェクトでは、他のプロパティは前のレコードから取得されます。