2010-11-22 18 views
3

私は変更がデータベーステーブル(更新/に行われたときに、私は、データベース(MySQLの)テーブルにバインドさましたが、私は自動的にリストビューを持ってする方法を見つけ出すように見えることはできませんリストビューのWinForms-C#は結果を表示していなどbutton_click、timer_tick、すなわちイベントを発生させ、ユーザなし)を挿入...データベーステーブルが更新/挿入された場合、自動的に更新するWindows C#コントロールを取得するにはどうすればよいですか?

誰かが正しい方向に私をポイントしてくださいことができます。どんなアドバイス/解決策も大変ありがとう!

おかげで、 -Donald

+0

何かがその構造に変化したら、あなたがイベントを送信するためにMySQLのDBを期待している/あなたのコードにトリガ? –

+0

アプリケーションによって変更が行われましたか?そうでない場合、アプリケーションは変更が発生したことをどのように知っていますか? – Fosco

答えて

0

はあなたのデータソースは更新が発生したとき、トリガ、それにイベントを持っている必要があります。おそらく、そのイベントにアタッチし、ユーザーの介入なしにその火にリフレッシュを持つことができます - それはイベントトリガーから発射ますので、あなたはおそらく、UIを更新するために、デリゲートを使用する必要がありますけれども。

わかりやすく言えば、私はSQLに変更のフラグを立てる方法がないことを知っています。私は彼らにバインドしていたCRUD操作を実装したライブラリがあるという印象を受けていました。と述べた。解説以下だったしたので、私は今示唆した上記のPieterとして、より多くの情報に基づいた意思決定

EDITバージョン2

私はタイマーを作成することをお勧めを行い、変更のためのデータベースをポーリングすることができます。データベースの値をカウンタとして使用して、いつ更新を取得する必要があるかを知る(つまり、テーブルに主キーがある場合はWHERE key > last_key_receievedをチェックしてください)

また、別のスレッドで作業するので、 UIを安全に更新するメソッドを作成する必要があります。リストビューで持っているどのように多くの列によっては、プロトタイプは異なりますが、前提は同じです:

Timer updateScoresTimer = new Timer(); 
updateScoresTimer.Tick += delegate 
{ 
    // 1. grab the database info 
    // 2. filter for post-worthy changes 
    // 3. iterate over changes, passing the UI info to AddScore(...) 
}; 
updateScoresTimer.Interval = 30000; 
updateScoresTimer.Start(); 

public delegate void AddScoreHandler(String arg1, String arg2, String arg3); 
public void AddScore(String arg1, String arg2, String arg3) 
{ 
    if (this.listView1.InvokeRequired) 
     this.BeginInvoke(new AddScoreHandler(this.AddScore), new object[]{ arg1, arg2, arg3 }); 
    else 
    { 
     ListViewItem lvi = new ListViewItem(arg1); 
     lvi.SubItems.AddRange(new string[]{ arg2, arg3 }); 
     this.listView1.Items.Add(lvi); 
    } 
} 
+0

OK、私はこれを明確にしておきましょう。皆さんは、テーブルに変更が加えられたらwinFormに通知するイベントを作成する必要があると言っていますか? –

+0

あなたの話題の例を教えていただけますか?または私が探しているものをカバーするリンクがあるかどうかわかっている場合。 –

+0

これは正しいです。あなたがコントロールをバインドしているものがわからなければ、ソースにバックエンドの変更を知らせるものがあると仮定して信仰を跳ね返すかもしれません。同じ前提の下で、これはユーザーが行っていることが、強制的な更新を引き起こしていると仮定しています(つまり、最初のDB情報を取得した休止中のクライアントではなく、別のユーザーがどこかに変更を加えました。変化する)。後者が真である場合は、DBを定期的にポーリングして必要に応じて定期的に更新することをお勧めします。 –

1

SQLは、クライアントにデータベースからの変更イベントの送信をサポートしていません。 DataTable

イベントは、データベースからの変更を通知しません。彼らはDataTableへの変更を通知します。

  1. 定期的にクエリを実行することで変更を検出する簡単な方法は、毎分または5分ごとに言うと、検出:あなたは、実際のデータベースへの変更を確認したい場合は

    は、次の2つの選択肢がありデータベースへの変更。あなたがリアルタイムで変更が必要な場合

  2. 、代替は、メッセージングサービスを持つことです。データベースを変更すると、信号を送信するWCFサービスを実装できます。その後、他のプロセス(独自のものを含む)がコールバックインターフェイスを使用してこのWCFサービスに接続し、発生したときにこれらの変更を受け取ることができます。ただし、これはデータベースの変更を完全に制御できる場合にのみ有効です。

最初のメカニズムは、古いPOP3に通知するような定期的な更新を行います。 2番目のメカニズムは、リアルタイムの更新を提供します。

関連する問題