SQL Hin und zurück button funktioniert aber die Textboxen aktualisieren sie nicht.

AirForce

Lt. Junior Grade
Registriert
Okt. 2010
Beiträge
296
Ich habe einen Button Next und einen Previous gemacht, damit man im Programm hin und her die Daten auslesen kann. Habe auch einen Label für das ausgeben eines zähler gemacht. Die funktion seht das es 9 einträge in der Datenbank gibt, ich kann vor und zurücl gehen ohne probleme und wenn ich am ende angekommen bin gibt es die meldung das es am ende ist. So weit alles gut, nur habe ich ein problem wieso sehe ich die neuen werte nicht? Es blebit immer bei der letzten Daten stehen also der 9-ten. Obwohl ich hin und her kann. Wie könnte ich die Textboxen aktualiesieren?
Code:
public MainWindow()
        {
            InitializeComponent();
                   
            read();
           
        }

        private CollectionView cursor;

        void read()
        {
            using (var nwe = new NORTHWNDEntities())
            {
                
                var objctx = (nwe as IObjectContextAdapter).ObjectContext;
                ObjectQuery<Employee> query = new ObjectQuery<Employee>(
                    "SELECT VALUE n from NORTHWNDEntities.Employees as n", objctx);
                List<Employee> results = query.ToList();
                foreach (Employee emp in results)
                {
                    textBoxID.Text = emp.EmployeeID.ToString();
                    textBoxFirstName.Text = emp.FirstName;
                    textBoxLastName.Text = emp.LastName;
                    textBoxBirthDate.Text = emp.BirthDate.ToString();
                }

                cursor = (CollectionView)CollectionViewSource.GetDefaultView(results);
                
            }
        }
Code:
private void countposition()
        {
            labelRead.Content = "Read " + (cursor.CurrentPosition + 1) + " to " + cursor.Count; 
        }
               
        private void buttonNext_Click(object sender, RoutedEventArgs e)
        {
            if(cursor.CurrentPosition < cursor.Count -1)
            {
                cursor.MoveCurrentToNext();
                countposition();

            }
            else
            {
                MessageBox.Show("No more data");
            }
        }

        private void buttonPrevious_Click(object sender, RoutedEventArgs e)
        {
        
             if (cursor.CurrentPosition > 0)
             {
                cursor.MoveCurrentToPrevious();
                countposition();
             }
             else
             {
                 MessageBox.Show("No more data");
             }
                
        }
 
Das ist eine aufgabe die ich mit Entity Framwork machen muss. Das einlesen der Daten geht, das löschen auch nur die Textboxen aktualiseren sich nicht, das ist mein problem.
 
Code:
foreach (Employee emp in results)
                {
                    textBoxID.Text = emp.EmployeeID.ToString();
                    textBoxFirstName.Text = emp.FirstName;
                    textBoxLastName.Text = emp.LastName;
                    textBoxBirthDate.Text = emp.BirthDate.ToString();
                }

Soweit ich das auf den ersten Blick erkennen kann passt du hier deine Textboxen an?
Also, ich kenne mich jetzt nicht wirklich mit deinem verwendeten Framework aus, aber hier werden doch immer die selben IDs überschrieben. Du siehst immer den letzten Eintrag, da der letzte am Schleifenende gesetzt wird.

Wie gesagt, kann mich auch irren, da ich mich mit dem Entity Framwork nicht wirklich auskenne =)
 
Ja genau das ist mein problem, und ich weis nicht wie ich das lösen soll.
 
MVVM schließt EF nicht aus. Aber darum gehts es jetzt gar nicht.

Nochmal: Was spricht dagegen, dass du es so machst, wie hier?
http://stackoverflow.com/questions/10145815/c-sharp-entity-framework-pagination#10182883

Ich hab nur 2 Semester mit EF gearbeitet und dabei gelernt, das man auf das explizite Formulieren von Queries nach Möglichkeit verzichten sollte: Meist gibt es eine sehr einfache Lösung durch EF selbst.

Wenn ich mir aber diesen Teil näher anschaue:
PHP:
foreach (Employee emp in results)
{
    textBoxID.Text = emp.EmployeeID.ToString();
    textBoxFirstName.Text = emp.FirstName;
    textBoxLastName.Text = emp.LastName;
    textBoxBirthDate.Text = emp.BirthDate.ToString();
}

"results" ist eine Liste. Du hast 4 Textboxen (ID, FirstName, LastName, BirthDate) und bildest je ein DB-Tupel (Zeile) auf die Textboxen ab. Vielleicht versteh ich was auch nicht, aber nach meinem Verständnis wird immer nur das letzte Tupel angezeigt, oder? Ist das gewollt oder ein Logik-Fehler?
 
zepho schrieb:
Wenn ich mir aber diesen Teil näher anschaue:
PHP:
foreach (Employee emp in results)
{
    textBoxID.Text = emp.EmployeeID.ToString();
    textBoxFirstName.Text = emp.FirstName;
    textBoxLastName.Text = emp.LastName;
    textBoxBirthDate.Text = emp.BirthDate.ToString();
}

"results" ist eine Liste. Du hast 4 Textboxen (ID, FirstName, LastName, BirthDate) und bildest je ein DB-Tupel (Zeile) auf die Textboxen ab. Vielleicht versteh ich was auch nicht, aber nach meinem Verständnis wird immer nur das letzte Tupel angezeigt, oder? Ist das gewollt oder ein Logik-Fehler?

Genau das habe ich ja auch versucht mit meinem Beitrag zu vermitteln :D
Du überschreibst in jedem Schleifendruchlauf deine Textboxen. Du siehst nur den letzten Eintrag, weil dieser eben im letzten Schleifendurchlauf in die Textboxen geschrieben wird.

Du musst also den Inhalt dann anpassen, wenn du vor oder zurück navigierst.
 
Zuletzt bearbeitet:
Wenn es Datenmengen sind, die den Abruf/Ausgabe in Teilmengen notwendig machen --> Pagination.

Ich würde mal raten, dass dir Kenntnisse in WPF und Databinding fehlen, oder? (Hast du *.xaml-Dateien?)

Durch Databinding könntest du z.B. Collections direkt an deinen Grid binden:
http://www.codeproject.com/Questions/214294/How-to-Bind-a-simple-List-to-DataGrid-in-WPF

Daher auch meine Empfehlung zu Mvvm-Toolkit.

Es gilt als schlechtes Design, wenn die Business-Logik etwas über die Präsentationsschicht weiß.
 
Code:
 <Label x:Name="labelID" Content="ID" HorizontalAlignment="Left" Margin="52,79,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="textBoxID" HorizontalAlignment="Left" Height="23" Margin="163,79,0,0" TextWrapping="Wrap" Text="{Binding Path=EmployeeID}" IsReadOnly="True" VerticalAlignment="Top" Width="87"/>
        <Label x:Name="labelFirstNAme" Content="First Name" HorizontalAlignment="Left" Margin="52,157,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="textBoxFirstName" HorizontalAlignment="Left" Height="23" Margin="163,157,0,0" TextWrapping="Wrap" Text="{Binding Path=FirstName}" VerticalAlignment="Top" Width="145"/>
        <Label x:Name="labelLastName" Content="Last Name" HorizontalAlignment="Left" Margin="52,224,0,0" VerticalAlignment="Top" Width="67"/>
        <TextBox x:Name="textBoxLastName" HorizontalAlignment="Left" Height="23" Margin="163,224,0,0" TextWrapping="Wrap" Text="{Binding Path=LastName}" VerticalAlignment="Top" Width="145"/>
        <Label x:Name="labelBirthDate" Content="Birth Date" HorizontalAlignment="Left" Margin="52,307,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.289,0.462" Width="67"/>
        <TextBox x:Name="textBoxBirthDate" HorizontalAlignment="Left" Height="23" Margin="163,310,0,0" TextWrapping="Wrap" Text="{Binding Path=BirthDate}" VerticalAlignment="Top" Width="145"/>
        <Button x:Name="buttonNext" Content="Next" HorizontalAlignment="Left" Margin="52,397,0,0" VerticalAlignment="Top" Width="75" Click="buttonNext_Click"/>
        <Button x:Name="buttonPrevious" Content="Previous" HorizontalAlignment="Left" Margin="163,397,0,0" VerticalAlignment="Top" Width="75" Click="buttonPrevious_Click"/>
        <Label x:Name="labelRead" Content="" HorizontalAlignment="Left" Margin="65,351,0,0" VerticalAlignment="Top"/>
        <Button x:Name="buttonAdd" Content="Add" HorizontalAlignment="Left" Margin="266,397,0,0" VerticalAlignment="Top" Width="75" Click="buttonAdd_Click"/>
        <Button x:Name="buttonSave" Content="Save" HorizontalAlignment="Left" Margin="374,397,0,0" VerticalAlignment="Top" Width="75" Click="buttonSave_Click" IsEnabled="False"/>
        <Button x:Name="buttonDelete" Content="Delete" HorizontalAlignment="Left" Margin="163,453,0,0" VerticalAlignment="Top" Width="75" Click="buttonDelete_Click"/>
        <Button x:Name="buttonUpdate" Content="Update" HorizontalAlignment="Left" Margin="266,453,0,0" VerticalAlignment="Top" Width="75" Click="buttonUpdate_Click"/>
Ich muss das mit dem Textboxen machen so lautet die aufgabe.
 
Dast hast du recht, genau nach so etwas suche ich.
Ergänzung ()

Das Problem ist gelöst. Das Bindig ist alles OK.

Des Rätsels Lösung:
Code:
DataContext = cursor;
 
Zurück
Oben