【问题标题】:Remove data from database but not from datagrid. WPF从数据库中删除数据,但不从数据网格中删除。 WPF
【发布时间】:2017-12-05 19:29:02
【问题描述】:

我在刷新数据网格时遇到问题。 有一个简单的应用程序来创建与实体框架连接的新客户端。 有 3 个按钮来创建新的、保存更改和删除。前两个运行良好,但删除选定行几乎没有问题。 单击删除按钮后,对象从数据库中删除,但数据网格没有更新。 我尝试使用 .Items.Resfresh(),从开头加载 ItemSource,删除选定的行,但有一些异常

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

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

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>

【问题讨论】:

  • 您可以手动将其从基础集合中删除。 ((List&lt;Client&gt;)clientDataGrid.ItemsSource).Remove(_currentClient);

标签: c# wpf xaml datagrid


【解决方案1】:

您可以在删除项目后刷新 DataGrid 的源代码。

接下来你可以在这里申请:

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();

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

但总的来说,我想向您推荐的是使用 INotifyPropertyChanged 接口,这将使您的网格实时更新,这意味着如果您更改数据网格中的值,例如如果您删除它,项目将被删除从数据网格等等..它很容易实现,这就是你应该探索的。

但是现在,我给你的解决方案应该可以工作。

【讨论】:

    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    相关资源
    最近更新 更多