WPF Combobox DataBound к DataTable, обновляется автоматически - PullRequest
1 голос
/ 24 февраля 2011

У меня есть один combobox, который я databinding для 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().

Ответы [ 3 ]

1 голос
/ 24 февраля 2011

Как насчет использования ObservableCollection для хранения ваших данных после извлечения их из БД?

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

0 голосов
/ 24 февраля 2011

Приведенный ниже код очистит и заполнит поле со списком вашего адаптера 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 голосов
/ 24 февраля 2011

У меня была похожая ситуация, проверьте этот вопрос: WPF live Update из базы данных .

Если вам нужно просто обновить привязку данных, взгляните на ObservableCollection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...