WPF组合框数据绑定到DataTable,自动刷新

问题描述:

我有一个combobox,我databindingDataTable其从数据库中获取数据,如下所示:WPF组合框数据绑定到DataTable,自动刷新

SqlDataAdapter adp = new SqlDataAdapter 
    (@"SELECT [CategoryID],[CategoryName]FROM [Northwind].[dbo].[Categories]", 
    @"Integrated Security=SSPI;Initial Catalog=Northwind;Data Source=AKSHAY-PC\SQLEXPRESS"); 

DataTable tbl = new DataTable(); 
adp.Fill(tbl); 

cmbCities.ItemsSource = ((IListSource)tbl).GetList(); 

cmbCities.DisplayMemberPath = "[CategoryName]"; 
cmbCities.SelectedValuePath = "[CategoryID]"; 

当表数据被改变(添加/移除行),则combobox不会被刷新,因为IList没有构建它的更改通知。

有什么办法可以使它成为可能吗?

如果这是不可能的,有什么办法来“刷新”数据绑定,以便datatable将再次获取数据。在这种情况下,我会做的是在窗口初始化时执行上面的代码,然后再次刷新它而不需要再次执行相同的代码。类似于cmbCities.Data.Refresh()

如何使用ObservableCollection在从数据库中获取数据后存储数据?

http://wpflog.blogspot.com/2009/04/very-simple-observablecollection.html

我也有类似的情况检查这个问题:WPF live Update from database

如果您的要求只是刷新数据绑定看看的ObservableCollection

下面的代码将清除,并填写您的SQL适配器的组合框,当您单击相应的按钮。

XAML:

<Window x:Class="TestApp.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 

    <StackPanel> 
     <ComboBox Name="cmbCities" /> 
     <Button Content="Clear" Click="OnClear"/> 
     <Button Content="Fill" Click="OnFill"/> 
    </StackPanel> 

</Window> 

后面的代码:

using System; 
using System.ComponentModel; 
using System.Data; 
using System.Data.SqlClient; 
using System.Windows; 

namespace TestApp 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      _adp.Fill(_tbl); 

      cmbCities.ItemsSource = ((IListSource)_tbl).GetList(); 

      cmbCities.DisplayMemberPath = "[CategoryName]"; 
      cmbCities.SelectedValuePath = "[CategoryID]"; 

      DataContext = this; 
     } 

     private void OnClear(object sender, RoutedEventArgs e) 
     { 
      _tbl.Clear(); 
     } 

     private void OnFill(object sender, RoutedEventArgs e) 
     { 
      _adp.Fill(_tbl); 
     } 

     private DataTable _tbl = new DataTable(); 
     private SqlDataAdapter _adp = new SqlDataAdapter(@"SELECT [CategoryID],[CategoryName]FROM [Northwind].[dbo].[Categories]", @"Integrated Security=SSPI;Initial Catalog=Northwind;Data Source=AKSHAY-PC\SQLEXPRESS"); 

    } 
} 
+0

感谢华尔街,但我仍然要点击按钮查看更新。 – 2011-02-26 04:26:29

+0

我添加了按钮,可以让您轻松查看您的数据库是否需要使用。这是示例代码,我希望你能够学习并适应你的具体需求。 所以这里是如何使用它在你的情况给你的问题:你应该在你的代码中调用_tbl.Clear()后跟_adp.Fill(_tbl)在某些函数中,当你需要刷新数据绑定时调用,因为底层数据已经改变。 – 2011-02-28 16:07:20