2017-01-26 39 views
1

私はリストボックスでVisual Studio(wpf)に問題があります。 データベースからデータを挿入または削除したい場合、それらは機能していますが、menuitemを一度クリックするとリストボックスが更新されます。私はこれが負荷メソッドのためだと思うが、なぜそれがデータをリフレッシュしていないのですか?ListBoxは更新されませんか?

これは私のXAML-コード:

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

そして、これがxaml.csファイルです:

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 
      */ 

     } 
    } 
} 

ピクチャーウィンドウからは以下の通りです:

Window

答えて

1

後にこれを呼び出すことをお勧めしますListBoxの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(); 
} 
:あなたは何をすべき

ObservableCollection<a_autor>へのListBoxのItemsSourceプロパティを設定し、追加を呼び出す/追加を呼び出す以外にも、この1の方法を/削除DbContextの方法を削除することです

1

代わりListへの結合のObservableCollectionを作成することができます。 ObservableCollectionはINotifyPropertyChangedを実装しているので、コンテナ内の何かが変更されたときにいつでも通知を送信できます。

また、私は

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

} 

を試してみて、あなたがの追加と削除メソッドを呼び出しているとき、リストボックスとデータベースの間には魔法の接続はそうありませんdb.SaveChanges()

関連する問題