0

質問のリストをユーザーに表示するユーザーコントロールを設計しました。この「質問リスト」コントロールには、リピーターが含まれています。質問に回答するために使用する必要のある質問およびフォームフィールドにはさまざまな種類があるため、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)は正しいですが、更新された質問の後のオブジェクトでは、他のプロパティは前のレコードから取得されます。

4

1 に答える 1

0

まず、更新時や回答時にレコードの一意のIDを変更するデータベースを設計した人は別の業界に属しています。私は彼らがファンタジー作家か四分体物理学者になることを提案しますが、後者を試みると、一度に 3 つの状態で記録を保存しようとすることになるかもしれません。おそらく彼らは、-123 と 123 は同じ ID の異なる状態であると主張するでしょうが、それは誤りです。それらは異なる番号であり、私が認識しているすべてのコンピューター システムでそのように扱われます。IsAnswered などと呼ばれるブール値のフラグが必要でした。しかし、あなたはこれを変更できないと言っているので、あなたの質問に答えるにはもっと情報が必要です.

基本的に、あなたが示唆しているように、IDはおそらくあなたの問題の根本です。コントロールのコードビハインドを投稿できますか? DBの更新方法を知りたいです。

于 2010-07-11T17:34:46.093 に答える