2017-01-26 20 views
1

Ich habe ein Problem auf Visual Studio (WPF) mit der Listbox. Wenn ich einige Daten aus der Datenbank einfügen oder löschen möchte, funktionieren sie, aber die Listbox wird nur aktualisiert, wenn ich einmal auf den Menüpunkt klicke. Ich denke, das liegt an der Lade-Methode, aber warum werden die Daten nicht aktualisiert?ListBox wird nicht aktualisiert?

Das ist mein XAML-Code:

<UserControl x:Class="WpfApplication1.AutorenBearbeiten" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:WpfApplication1" 
      mc:Ignorable="d" 
      d:DesignHeight="400" d:DesignWidth="300" Loaded="UserControl_Loaded"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="28*" /> 
      <ColumnDefinition Width="36*" /> 
     </Grid.ColumnDefinitions> 
     <TextBlock Text="Medien" Grid.ColumnSpan="2" 
        FontSize="16" /> 





     <ListBox x:Name="box" Grid.Row="1"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Path=at_nachname}" /> 



       </DataTemplate> 

      </ListBox.ItemTemplate> 
     </ListBox> 

     <StackPanel DataContext="{Binding ElementName=box,Path=SelectedItem}" Grid.Column="1" Grid.Row="1" > 
      <TextBlock Text="Autoren_id" /> 
      <TextBox Text="{Binding Path=at_id}" MaxLength="5"/> 
      <TextBlock Text="Vorname" /> 
      <TextBox Text="{Binding Path=at_vorname}" MaxLength="30"/> 
      <TextBlock Text="Nachname" /> 
      <TextBox Text="{Binding Path=at_nachname}" MaxLength="30"/> 
      <TextBlock Text="Geburtsdatum" /> 
      <TextBox MaxLength="30" Text="{Binding Path=at_gebDatum, StringFormat=dd.MM.yyyy}" /> 
      <Button Name="speichern" Height="23" Margin="4" Click="speichern_Click">Änderungen speichern</Button> 
      <Button Name="loeschen" Height="23" Margin="4" Click="loeschen_Click">Löschen</Button> 

      <StackPanel DataContext="{Binding ElementName=box}" Grid.Column="1" Grid.Row="1" > 
       <TextBlock Text="Autoren_id" /> 
       <TextBox x:Name="id" MaxLength="5"/> 
       <TextBlock Text="Vorname" /> 
       <TextBox x:Name="vorname" MaxLength="30"/> 
       <TextBlock Text="Nachname" /> 
       <TextBox x:Name="nachname" MaxLength="30"/> 
       <TextBlock Text="Geburtsdatum" /> 
       <TextBox x:Name="datum" MaxLength="30"/> 
       <Button x:Name="neubutton" Height="23" Margin="4" Click="neu_Click">Neu</Button> 
       <TextBlock Name="submitfehler" FontWeight="Bold" Foreground="Red" /> 
      </StackPanel> 

     </StackPanel> 

    </Grid> 
</UserControl> 

Und das ist die xaml.cs Datei:

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for AutorenBearbeiten.xaml 
    /// </summary> 
    public partial class AutorenBearbeiten : UserControl 
    { 
     libraryEntities6 db = new libraryEntities6(); 
     public AutorenBearbeiten() 
     { 
      InitializeComponent(); 
     } 

     private void UserControl_Loaded(object sender, RoutedEventArgs e) 
     { 
      var erg = db.a_autor; 

      erg.Load(); 
      box.ItemsSource = erg.Local.OrderBy(m => m.at_id); 

      box.ItemsSource = 
       (from m in db.a_autor 
       orderby m.at_id 
       select m).ToList(); 


    } 

     private void speichern_Click(object sender, RoutedEventArgs e) 
     { 
      try 
      { 
       db.SaveChanges(); 
      } 
      catch(Exception e1) 
      { 
       submitfehler.Text = e1.Message; 
      } 
     } 

     private void loeschen_Click(object sender, RoutedEventArgs e) 
     { 

      a_autor am = (a_autor)box.SelectedItem; 
      if (am != null) 
      { 

       db.a_autor.Remove(am); 
       db.SaveChanges(); 
       box.Items.Refresh(); 
      } 

     } 

     private void neu_Click(object sender, RoutedEventArgs e) 
     { 


      a_autor autor = new a_autor(); 
      autor.at_id = id.Text; 
      autor.at_vorname = vorname.Text; 
      autor.at_nachname = nachname.Text; 
      autor.at_gebDatum = Convert.ToDateTime(datum.Text); 


      //s1.s_k_klasse = liklassen.SelectedValue.ToString() setzt die Klasse via foreign key 
      //db.schuelers.AddObject(s1); 


      db.a_autor.Add(autor); 
      box.Items.Refresh(); 



      /* 
      ((klassen))liklassen.SelectedItem).schuelers.Add(s1); //setzt die klasse durch zuweisen zum nav.Property 
      lischueler.Items.Refresh(); //nötig weil das navigational seit ER 5 nicht observable ist 
      */ 

     } 
    } 
} 

Ein Bild aus dem Fenster ist unten:

Window

Antwort

1

versuchen Es gibt keine magische Verbindung zwischen der List-Box und die Datenbank so, wenn Sie das Add rufen oder entfernen Methode Der DbContext der ListBox ist nicht betroffen.

Was Sie tun sollen, ist die Itemssource-Eigenschaft der List-Box auf ein ObservableCollection<a_autor> zu setzen und dann das Add rufen/entfernen Methode von diesem neben dem Add Aufruf/Entfernen Methode des DbContext:

System.Collections.ObjectModel.ObservableCollection<a_autor> _sourceCollection; 
private void UserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    var erg = db.a_autor; 
    erg.Load(); 

    _sourceCollection = new System.Collections.ObjectModel.ObservableCollection<a_autor>((from m in db.a_autor 
                          orderby m.at_id 
                          select m).ToList()); 
    box.ItemsSource = _sourceCollection; 
} 

private void loeschen_Click(object sender, RoutedEventArgs e) 
{ 
    a_autor am = (a_autor)box.SelectedItem; 
    if (am != null) 
    { 
     _sourceCollection.Remove(am); 
     db.a_autor.Remove(am); 
     db.SaveChanges(); 
     box.Items.Refresh(); 
    } 

} 

private void neu_Click(object sender, RoutedEventArgs e) 
{ 
    a_autor autor = new a_autor(); 
    autor.at_id = id.Text; 
    autor.at_vorname = vorname.Text; 
    autor.at_nachname = nachname.Text; 
    autor.at_gebDatum = Convert.ToDateTime(datum.Text); 

    _sourceCollection.Add(autor); 
    db.a_autor.Add(autor); 
    box.Items.Refresh(); 
} 
1

Sie können eine ObservableCollection erstellen, anstatt auf die List zu binden. ObservableCollection implementiert INotifyPropertyChanged, sodass eine Benachrichtigung gesendet werden kann, wenn sich im Container etwas ändert.

Außerdem würde ich vorschlagen, dass Sie

public void RefreshListBox() 
{ 
    box.ItemsSource = 
       (from m in db.a_autor 
       orderby m.at_id 
       select m).ToList(); 

} 

und nennen dies nach db.SaveChanges()

Verwandte Themen