首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据库中删除数据,但不从数据存储中删除数据。WPF

从数据库中删除数据,但不从数据存储中删除数据。WPF
EN

Stack Overflow用户
提问于 2017-07-02 11:07:55
回答 1查看 484关注 0票数 0

我对刷新我的数据有问题。具有简单的应用程序来创建与实体框架连接的新客户端。有3个按钮来创建新的一个,保存更改和删除。前两行运行良好,但删除选中的行没有什么问题。单击“删除”按钮后,将从数据库中移除对象,但不更新数据集。我尝试使用.Items.Resfresh(),从乞讨中加载ItemSource,删除选定的行,但是有一些例外

f.e.(在使用ItemsSource时,操作无效。)使用ItemsControl.ItemsSource访问和修改元素。)

我是否应该实现ObservableCollection (我对wpf非常陌生,如果是,那么如何实现)?

C#

代码语言:javascript
复制
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

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2017-07-02 12:53:51

删除项目后,您可能会刷新DataGrid的源代码。

下面是您可能在这里应用的内容:

代码语言:javascript
复制
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);
    }
}

正如你所看到的,我补充道:

代码语言:javascript
复制
clientDataGrid.ItemsSource = null;
clientDataGrid.ItemsSource = GETYOURCLIENTSFROMDATABASE();

这意味着,重置网格源和GETYOURCLIENTSFROMDATABASE,您可以编写从数据库获取当前数据的方法,可以使用LINQ或存储过程或任何您想要的东西,这将简单地刷新UI( grid )。

但总的来说,我想向您推荐的是使用INotifyPropertyChanged接口,它将使网格实时更新,这意味着如果您更改了一个数据集中的值--例如,如果您删除它,那么它将从一个数据集中删除等等。它很容易实现,这是您应该探索的。

但就目前而言,我给你的灵魂应该工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44870144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档