2011-03-13 148 views
4

我與數據綁定在WPF保持同步數據網格與MySQL數據庫

我有這樣的DataGrid綁定到一個MySQL的看法,這會是隻讀的嘗試,但我想自動喜歡它在對數據庫進行更改時刷新。
在google上找不到任何有用的東西,我不知道從哪裏開始。

這是dataprovider類。

class ConDataProvider 
{ 
    private MySqlDataAdapter adapter; 
    private Data data; 
    private DataTable table; 

    public ConDataProvider(string query) 
    { 
     data = new Data(); 
     table = new DataTable("con_FullGrid"); 
     adapter = data.getAdapter(query); 
     adapter.Fill(table); 
    } 
    public DataView GetDView() 
    { 
      dv = new DataView(); 
      dv.Table = table; 
      return dv; 
    } 
} 

而XAML的窗口

<Window x:Class="HelioWPF_Alpha01.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:local="clr-namespace:HelioWPF_Alpha01" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="676" Width="924" MinHeight="300" MinWidth="463" Background="{x:Null}"> 
<Window.Resources> 
    <ObjectDataProvider x:Key="ConDataProvider" ObjectType="{x:Type local:ConDataProvider}"> 
     <ObjectDataProvider.ConstructorParameters> 
      <sys:String>SELECT * FROM con_FullGrid</sys:String> 
     </ObjectDataProvider.ConstructorParameters> 
    </ObjectDataProvider> 
    <ObjectDataProvider x:Key="btable" ObjectInstance="{StaticResource ConDataProvider}" 
         MethodName="GetDView"/> 

</Window.Resources> 
<Grid Name="mainGrid" DataContext="{Binding Source={StaticResource btable}" KeyDown="mainGrid_KeyDown" FlowDirection="LeftToRight" > 
    <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding}" Name="dataGrid1" FrozenColumnCount="20" RowHeight="25" Grid.ColumnSpan="4" ColumnWidth="*" MouseDoubleClick="dataGrid1_MouseDoubleClick" SelectionMode="Single" Grid.Row="2" Grid.Column="1" TabIndex="1" GotKeyboardFocus="dataGrid1_GotKeyboardFocus"> 
     <DataGrid.AlternatingRowBackground> 
      <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5"> 
       <GradientStop Color="Black" Offset="0" /> 
       <GradientStop Color="#16436DF8" Offset="0" /> 
      </LinearGradientBrush> 
     </DataGrid.AlternatingRowBackground></DataGrid> 
</Grid> 

我一直在做的是什麼樣的在後面的代碼重新初始化ConDataProvider類,並重新綁定各種事件的DataGrid中作假的。 但這是一個醜陋的黑客。
我不介意重新設計整個事情,如果我必須。

數據類只包含連接字符串和一些方法來與數據庫進行交互。 你可以在這裏看到:提前http://pastebin.com/m9HLfwEQ

感謝。
希望得到一些好的提示。

+0

不知道有關MySQL,但微軟SQL具有服務代理具有通知服務.. – 2011-03-13 16:23:18

回答

1

怎麼樣,如果你連線了一些Reactive Extensions

你可以做的是創造一個可觀察,可輪詢您的數據庫每隔X秒。然後讓你的觀察者連接到那個觀察者。在Observer的OnNext事件中,您可以將數據添加到您的網格或重新綁定。

從本質上講,你會創造一些您的數據庫和應用程序,偵聽變化,並推動這些變化對你坐在之間。

+0

感謝我得看看這個。 Noob問題:我可以使這個運行服務器端,只是看數據庫,然後報告給應用程序,如果有一些新的數據,而不是客戶端不斷從數據庫中獲取? – 2011-03-14 01:45:42

+0

服務器端在數據庫服務器?從來沒聽說過。至少不是本地的。您可以編寫一個位於同一個框中的服務並通知您的客戶端應用程序。但它不會是MySql本地的。 – taylonr 2011-03-14 11:32:42

0

只要數據庫中的數據發生更改,MySQL就會在Log中追加信息。此功能可能必須打開,不確定它是否默認打開。

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

有了這個,你可以運行在服務器端的服務將偵聽MySQL表的變化,如果表被更新的事件發送到客戶端。

客戶需要實現的代碼刷新從服務器接收此類事件的網格。

要掃描bin日誌以進行更改,可以使用bin-log實用程序。

http://dev.mysql.com/doc/refman/5.0/en/mysqlbinlog.html

我會用這種方法,而不是掃描表中數據的變化,如果數據量或交易量的是高的。否則,輪詢數據庫的方法應該可以正常工作。

相關問題