0

私のプログラムは2つの部分に分かれています。

  1. Windowsフォームのクライアント。
  2. リモートWebサーバー(IIS)上のWCFで作成されたサーバー。

クライアントは、私の多くの異なるユーザーに同時に使用されます。

クライアントに多くのDataGridViewがあります。これらのDataGridViewは、Webサービスによって提供されるオブジェクトの(異なる)汎用リストにバインドされます。

これらのDataGridViewのコンテンツを頻繁に更新する必要があります。リフレッシュメソッドを呼び出すクライアントのタイマーを使用します。

しかし、私の問題は次のとおりです。Invalidate()を使用すると、現在表示されている行のコンテンツだけが更新されます。別の使用法で新しいオブジェクト(行)を削除または追加した場合、現在のユーザーには表示されません。データを再バインドしてデータを更新すると、現在の選択が失われます...ユーザーがデータを更新している場合の悪夢を想像してください...(はい、ユーザーがセルを編集するときにタイマーを停止し、ユーザーがセルを編集したときに再起動できます変更されますが、より良い方法を見つけたいと思います!)。

誰かがそのような問題を見たことがありますか?誰か提案がありますか?

ありがとうございました

4

2 に答える 2

1

あなたが説明しているのは分散システムです。この種のソフトウェアには、ロックと同期を実装する必要があります。確かにあなたはそれを省くことができます、しかしあなたの結果はがらくたになります。

  1. Datagridviewは、読むためだけに存在する必要があります。
  2. 行の編集はDGVの外部で行う必要があります。(すべてのオブジェクトが異なる場合は、楽しんでください)
  3. ロックメッセージは、これを追跡するサーバーに送信する必要があります。
  4. ロックされたオブジェクトは、他のユーザーが読み取れるようにする必要があります。書いていません。
  5. ロックされたオブジェクトのティモウトが存在する必要があります。

これをあなたに捨てて申し訳ありませんが、あなたの問題はあなたが思っているよりもはるかに大きいです。

于 2012-10-04T20:10:23.277 に答える
0

@WozzeCの答えに同意します。データベースロックが推奨されるソリューションです。

ただし、ロックを使用できず、データベースへのアクセスを増やしてもかまわない場合は、更新するテーブルに列を追加し、各行の列を一意のセッションIDに設定することで、ロックをシミュレートできます。または、そのユーザーがその行を更新/変更しようとしたときのユーザーID。

これには、ユーザーが変更する行を選択した時点でデータベースアクセスが必要ですが、その行がデータベースにまだ存在することを確認するという追加の利点があります(つまり、数秒前に別のユーザーによって削除されなかった)。

もちろん、これは真のデータベースロックではないため、変更している行を解放せずに終了する(つまり、PCがクラッシュする)ユーザーセッションについて心配する必要があります。テーブルに「チェックアウト」タイムスタンプ列を追加すると、ユーザーのロックがある程度の時間(たとえば、20分)後にタイムアウトするようにすることができます。

繰り返しになりますが、このアプローチには問題がないわけではありませんが、達成しようとしていることを十分に理解できる可能性があります。

補遺

変更するテーブルに列を追加できない場合は、ユーザーの疑似ロックを格納するまったく新しいテーブルを追加する必要がある場合があります。もちろん、これは、テーブルを変更するすべてのアプリが連携し、疑似ロックテーブルも使用する必要があることを意味します。

于 2012-10-04T23:49:15.377 に答える