2017-07-02 7 views
0

私は自分のDataGridをリフレッシュする際に問題があります。 Entity Frameworkに接続された新しいクライアントを作成する簡単なアプリケーションを用意してください。 新しいボタンを作成し、変更を保存して削除する3つのボタンがあります。最初の2つはうまくいっていますが、選択した行を削除することで問題はほとんどありません。 削除ボタンをクリックすると、オブジェクトはデータベースから削除されますが、DataGridは更新されません。 .Items.Resfresh()を使用しようとしました。先頭からItemSourceをロードし、選択した行を削除しましたが、いくつかの例外がキャッチされました。データベースからデータを削除しますが、データグリッドからは削除しません。 WPF

f.e. (ItemsSourceが使用されている間、操作は無効です。)代わりにItemsControl.ItemsSourceを使用して要素にアクセスして変更してください。

ObservableCollectionを実装する必要がありますか?

C#

private void UserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    _isLoading = true; 
    clientDataGrid.ItemsSource = _repo.ClientsListInMemory(); 
    _clientViewSource = (ObjectDataProvider)FindResource("clientViewSource"); 
    _isLoading = false; 
    clientDataGrid.SelectedIndex = 0; 
} 

private void deleteBtn_Click(object sender, RoutedEventArgs e) 
{ 
    HotelContext db = new HotelContext(); 
    Client client = clientDataGrid.SelectedItem as Client; 
    try 
    { 
     _currentClient = db.Clients.Where(c => c.Id == client.Id).Single(); 
     db.Clients.Remove(_currentClient); 
     db.SaveChanges(); 
    // refreshFunction()? 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

XAML

<UserControl.Resources> 
    <ObjectDataProvider x:Key="clientViewSource"/> 
</UserControl.Resources> 
<DataGrid x:Name="clientDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" IsReadOnly="True" ItemsSource="{Binding Source={StaticResource clientViewSource}}" Margin="0,10,323,0" RowDetailsVisibilityMode="VisibleWhenSelected" SelectionChanged="clientDataGrid_SelectionChanged" SelectedValuePath="Id" Height="200" VerticalAlignment="Top"> 
    <DataGrid.Columns> 
     <DataGridTextColumn x:Name="Id" Binding="{Binding Id}" Header="Id" Width="SizeToHeader"/> 
     <DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding FirstName}" Header="First Name" Width="SizeToHeader"/> 
     <DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding LastName}" Header="Last Name" Width="SizeToHeader"/> 
     <DataGridTextColumn x:Name="phoneNumberColumn" Binding="{Binding PhoneNumber}" Header="Phone Number" Width="SizeToHeader"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

基本コレクションから手動で削除できます。 '((List )clientDataGrid.ItemsSource).Remove(_currentClient);' – Fabio

答えて

0

あなたの項目を削除した後、あなたのデータグリッドのソースを更新することがあります。

あなたはここに適用される可能性が次です:

private void deleteBtn_Click(object sender, RoutedEventArgs e) 
{ 
    HotelContext db = new HotelContext(); 
    Client client = clientDataGrid.SelectedItem as Client; 
    try 
    { 
     _currentClient = db.Clients.Where(c => c.Id == client.Id).Single(); 
     db.Clients.Remove(_currentClient); 
     db.SaveChanges(); 
     clientDataGrid.ItemsSource = null; 
     clientDataGrid.ItemsSource = GETYOURCLIENTSFROMDATABASE(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

あなたが見ることができるように私は、コメントを追加しました:あなたのメソッドを書くことができ

これは、
clientDataGrid.ItemsSource = null; 
clientDataGrid.ItemsSource = GETYOURCLIENTSFROMDATABASE(); 

、あなたのグリッドソースをリセットおよびd GETYOURCLIENTSFROMDATABASEあなたのinstedました現在のデータをデータベースから取得し、LINQまたはストアドプロシージャなどを使用して、必要なものを使用すると、UI(グリッド)が更新されます。

しかし、一般的にあなたにお勧めしたいのは、グリッドをリアルタイムで更新し続けるINotifyPropertyChanged Interfaceを使用することです。つまり、データグリッド内の値を変更すると、アイテムが削除されます。データグリッドから削除されています。それは実装が簡単で、それはあなたが探索すべきものです。

しかし今のところ、私はあなたに仕事を与えてくれました。

関連する問題