2011-03-13 123 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

我会用这种方法,而不是扫描表中数据的变化,如果数据量或交易量的是高的。否则,轮询数据库的方法应该可以正常工作。