首页 > 解决方案 > 表格更改时自动更新数据网格

问题描述

不要向我扔石头——我是编程新手。

主要问题是如何在该表的每次更改后自动更新通过Enity Framework表示SQL表的datagrid?

我使用 WPF 创建了一个简单的应用程序,用于通过 Entity Framework 6 处理 SQL 表。这个应用程序的一部分有图像:

我的应用程序的一部分

所以有数据网格,看起来像这样:

<DataGrid CanUserAddRows="False" AutoGenerateColumns="False" x:Name="variableAssignmentDataGrid" ItemsSource="{Binding VariableAssignment,UpdateSourceTrigger=PropertyChanged}" Margin="30" >
    <DataGrid.Columns>
        <DataGridTextColumn Width="1*" Binding="{Binding Id}" Header="Id" IsReadOnly="True"  />
        <DataGridTextColumn Width="1*" Binding="{Binding IdMachine}" Header="IdMachine"/>
        <DataGridTextColumn Width="1*" Binding="{Binding IdVariable}" Header="IdVariable"/>
        <DataGridTextColumn Width="1*" Binding="{Binding IdUser}" Header="Id User"/>
        <DataGridTextColumn Width="1*" Binding="{Binding Variable.Name}" Header="Name"/>
        <DataGridTextColumn Width="1*" Binding="{Binding Subscription}" Header="Subscription"/>
        <DataGridTextColumn Width="1*" Binding="{Binding Frequency}" Header="Frequency"/>
        <DataGridCheckBoxColumn Width="1*" Binding="{Binding Enable,Mode=TwoWay}" Header="Enable"/>
        <DataGridTextColumn Width="1.75*" Binding="{Binding Time}" Header="Time" FontSize="8"/>
        <DataGridTemplateColumn Width="1*" Header="Modify" />
    </DataGrid.Columns>
</DataGrid>

用于绑定的 VariableAssignment 如下所示:

public class DataManager : INotifyPropertyChanged
{
    public Entities context = new Entities();
    private ObservableCollection<VariableAssignment> variableAssignment;
    public ObservableCollection<VariableAssignment> VariableAssignment
    {
        get { return variableAssignment; }
        set { variableAssignment = value; OnPropertyChanged("VariableAssignment"); }
    }
  ..}

在这个类的构造函数中,我用 SQL 表中的元素填充这个VariableAssignment (context.VariableAssignments)

public DataManager()
{
    VariableAssignment = new ObservableCollection<VariableAssignment>(context.VariableAssignments);
    newVariableAssignment = new VariableAssignment();
}

如您所见,在这个构造函数中,我定义了 newVariableAssignment = new VariableAssignment(); - 我需要这个来在我的 SQL 表中添加新行。

添加方法在这里

public void addNewVariableAssignment(..)
{
    context.VariableAssignments.Add(newVariableAssignment); 


    newVariableAssignment.IdVariable = //adding values

    context.SaveChanges(); 
}

单击添加按钮后,此方法有效。

private void addVariableButton_Click(object sender, RoutedEventArgs e)
{
    dataManager.addNewVariable(..);
}

单击添加按钮后 - 行被添加到 SQL 表中,但我的数据网格没有更新。如您所见,我尝试了 UpdateSourceTrigger,但由于某种原因它不起作用。我找到了更新我的数据网格的唯一方法-单击按钮后创建表的新 ObservableCollection 并将其放入数据网格的 ItemsSource 中(见下文)

private void addVariableButton_Click(object sender, RoutedEventArgs e)
{
    dataManager.addNewVariable(addNameVariableTextBox.Text, addAddressTexBox.Text, addVariableTypeComboBox.Text, addSourceTypeAddComboBox.Text);

    var varAssignSource = new ObservableCollection<VariableAssignment>(dataManager.context.VariableAssignments);
    variableAssignmentDataGrid.ItemsSource = varAssignSource;
}

但这是不对的,对吧?我的意思是......现在为了更新数据网格,我需要在某些方法/按钮/所有内容中手动编写代码,这会改变我的表格。但我希望数据网格在从任何地方更改后自动更新。

那你能给我一些建议吗?

标签: c#wpfentity-framework-6

解决方案


不仅将 Assignment 对象添加到 db 上下文,而且同时添加到 ObservableCollection。

public void addNewVariableAssignment()
{
    newVariableAssignment = new VariableAssignment();
    newVariableAssignment.IdVariable = //adding values

    context.VariableAssignments.Add(newVariableAssignment); 

    context.SaveChanges(); 

    VariableAssignments.Add(newVariableAssignment);
}

DataGrid 将收到有关添加的新项目的通知,因为 ObservableCollection 实现了 INotifyCollectionChanged。无需重复重置 ItemsSource


推荐阅读