2

C#/ASP.NET と SQL サーバー データベースを使用して、Visual Studio 2010 で作業しています。マネージャーが従業員にさまざまなタスクを割り当てることができるようにする Web サイトを修正しようとしています。現在の問題は、2 人のマネージャーが同時に作業している場合、間違った従業員がタスクに割り当てられる可能性があることです。従業員のリストは、グリッドビューで表されます。

この問題は、ユーザーの 1 人がグリッドビューで古いデータを見ているために発生しているようです。

最初の人がリストをロードすると、GridView は次のようになります。

-従業員1

-従業員 2

-従業員 3

-従業員 4

次に、2 人目の担当者が入ってきて、従業員 2 に割り当てを行います。これにより、従業員 2 がリストから削除されます。実際のリストは次のようになります。

-従業員1

-従業員 3

-従業員 4

ただし、ページがまだ更新されていないため、最初の人にはまだこれが表示されます。

-従業員1

-従業員 2

-従業員 3

-従業員 4

次に、最初の人が従業員 3 にタスクを割り当てようとします。彼らにはまだ古いリストが表示されます。クリックして割り当てを行うと、ページがサーバーにポストバックされます (明らかに、gridview コントロールで行を選択することはサーバー側のイベントであるため、このhttp://forums.asp. net/t/1706468.aspx/1 )。ページがリロードされ、ポストバック イベントを実行しようとし、コントロールがまだ有効でないことをチェックして確認します (ポストバック イベントが処理されるはずの後にデータ バインディングが発生するため)。(ページ読み込み時のイベントの順序は次のとおりですhttp://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx ) グリッドビューがデータバインドされると、データは最新の状態になりますこのような:

-従業員1

-従業員 3

-従業員 4

その後、ポストバック イベントを処理できます。ポストバック イベントには、選択されたコントロールの行インデックスが含まれます。3 番目の行が選択されているため、ポストバック イベントは従業員 4 (現在 3 番目の行にいる) をグリッドから取得します。次に、従業員 3 の一意の ID が必要なときに、その情報を使用して従業員 4 の一意の ID を取得します。この状況で正しい従業員 ID を確実に取得するにはどうすればよいでしょうか?

問題は、データバインディングが発生してグリッドが変更された後にクリックが適用されることです。ページがポストバックしないようにするのは良いことだと思いましたが、グリッドビューの操作はすべてサーバー側であるため、それはできないと思います。ポストバックによってバインドされたデータを保持する方法がわからないため、ポストバックするたびに、新しい、潜在的に異なるデータを取得する必要があります。ほとんどのオプションを試したような気がします。私の推論に何か問題があると思いますか、または新しいことを試すための提案はありますか? ページが投稿される前に従業員 ID を取得する方法はありますか?

ページは 1 人のユーザーに対してのみ正常に機能します。問題は、複数のユーザーが同時に変更を行っている場合にのみ発生します。

4

2 に答える 2

2

ポストバック中に GridView データを再読み込みする必要がないように、コントロールのViewStateを有効にすることができます。

代わりに、コントロールは PostBack 中に最初に読み込まれたデータを記憶し、それを処理し続けます。

もちろん、それは並行性の問題を解決しません。たとえば、誰かがすでに削除されている従業員に何かをした場合などです。その場合、アクションを実行する前に実際のデータベースを再度チェックし、ユーザーが古いデータを操作している場合はエラー/警告を表示する必要があります。

于 2013-05-09T16:14:07.447 に答える
0

ObjectDataSource を使用して自動的にデータバインディングを処理するのではなく、自分でデータバインディングを処理する必要がありました。

以前は、GridView の DataSourceID を使用して、ページが更新されるたびにサーバーにデータを照会するデータ ソースにリンクしていました。ObjectDataSource により、データが自動的にバインドされました。必要な追加のコントロールを取得するために、ページの背後にあるコードですべてのデータ バインディングを処理する必要がありました。

これを行うには、gridview データをビューステートに保存し、ページが更新されるたびにビューステートからデータを読み込みます。このようにして、データベース内のデータで gridview データが更新されたタイミングを制御できました。

これらの 2 つのページは、私の答えを導き出すのに非常に役立ちました。

DataBind とポストバック

http://www.aarongoldenthal.com/post/2009/04/19/Manually-Databinding-a-GridView.aspx

于 2013-05-10T20:11:57.887 に答える