表更改时自动更新数据网格

时间:2018-07-03 14:08:43

标签: c# wpf entity-framework-6

别对我投掷石头-我在编程方面是个新手。

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

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

part of my application

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

<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表中的元素(context.VariableAssignments)填充此 VariableAssignment

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并将其放入datagrid的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;
}

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

那么你能给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

不仅将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