简体   繁体   中英

Automatic update of data grid when table changes

Don't throw stones at me - I am quite new in programming.

The main question is how to automatically update datagrid, which represents SQL table by means of Enity Framework, after every change in this table?

I create a simple application with WPF for working with SQL tables by means of Entity Framework 6. There is image a part of this application :

我申请的一部分

So there is datagrid, that looks like this:

<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, which is used for binding looks like this:

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"); }
    }
  ..}

In constructor of this class I fill this VariableAssignment by elements from SQL table (context.VariableAssignments)

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

As you can see, in this constructor I defined newVariableAssignment = new VariableAssignment(); - I need this for adding new rows in my SQL tables.

Adding method is here

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


    newVariableAssignment.IdVariable = //adding values

    context.SaveChanges(); 
}

This method is worked after clicking on add button.

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

After clicking on ADD button - Row is added to SQL table, but my datagrid doesn't update. As you see, I tried UpdateSourceTrigger, but for some reason it doesn't work. I found the only way, that updates my datagrid - create new ObservableCollection of my Table and put it into ItemsSource of datagrid after clicking button (See below)

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;
}

But it isn't right, right? I mean... Now for updating the datagrid I need to write code manually in some methods/buttons/everything, that changes my table. But I want a datagrid to update automatically after changing from anywhere.

So can you give me some advices?

add Assignment object not only to db context, but also to ObservableCollection at the same time.

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

    context.VariableAssignments.Add(newVariableAssignment); 

    context.SaveChanges(); 

    VariableAssignments.Add(newVariableAssignment);
}

DataGrid will be notified about new items added, because ObservableCollection implements INotifyCollectionChanged. There is no need to reset ItemsSource repeatedly

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM