Autor Beitrag
Koto
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 09.01.17 11:14 
Hallo zusammen,
ich habe ein Programm geschrieben, was ein DataGridView enthält, welches Daten aus einer Datenbank mittels ADO anzeigt.
Jede Zeile im DGV hat eine Priorität, nahc der die Anzeige sortiert wird (Jede Prio kommt nur ein mal vor).
Nun möchte ich mittels zweier Buttons die Priorität der Zeile ändern (um 1 erhöhen oder verringern) und die Prio der darüber oder darunterliegenden Zeile somit auch anpassen, sodass jede Prio immer noch nur 1 mal vor kommt.
Abschließend soll dann die Anzeige aktualisiert werden (Priorität aktualisiert und neu sortiert) und der Fokus weiterhin auf der ausgewählten Zeile (mit neuer Prio) liegen. Mit Hilfe eines 3. Button wird dann zurück in die DB geschrieben.
Funktioniert auch fast alles einwandfrei. Nur die Zeilen mit den Prioritäten 9 und 10 machen mir zu Beginn Probleme. Beim erstmaligen erhöhen der Prio von 10 auf 9 wird die Spalte Prio (bei Datensatz 1 von 10 auf 9 und bei Datensatz 2 von 9 auf 10) angepasst, allerdings wird das DGV scheinbar nicht aktualisiert. Die Zeilen bleiben in der vorherigen Reihenfolge stehen und es erfolgt keine Neusortierung. Somit steht dann folgende Reihenfolge: 7,8,10,9,11,12.
Dieser Fehler tritt nur beim 1. Mal auf und nur bei den Prios 9 und 10.
Sofern ich mit der Maus auf das DGV klicke wird neu sortiert und alles ist richtig. Allerdings reicht mir dies nicht aus.
Ich habe bereits mittels Debugger den Code überprüft, allerdings erscheint keine Fehlermeldung. Zudem tritt der Fehler nur unregelmäßig auf.

Jemand eine Idee, was ich falsch/schlecht gemacht habe und wo überhaupt das Problem liegt?

(bs ist die BindingSource)


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
private void btnPrioHoch_Click(object sender, EventArgs e)
        {
            
            try
            {
            int focus = grdDaten.CurrentCell.RowIndex;
            int ausgewaelter = Convert.ToInt16(grdDaten.CurrentCell.RowIndex);
            int darueber = Convert.ToInt16(grdDaten.CurrentCell.RowIndex) - 1;
            int ausgewaehltrow = ausgewaelter;
            int darueberrow = darueber;
            if (Convert.ToInt16(grdDaten.CurrentCell.RowIndex) > 0)
            {
          
                    this.grdDaten.Rows[ausgewaehltrow].Cells[0].Value = darueber;
                    this.grdDaten.Rows[darueberrow].Cells[0].Value = ausgewaelter;
             
                    focus--;
                    bs.Position = focus;


              
            }
            else 
            {
                MessageBox.Show("Höchste Prio erreicht");
            }

            bs.Sort = "AuPrio ASC";

            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler: " + ex);
            }
            
        }


Ich habe bereits versucht mit grdDaten.Sort etwas zu erreichen. Ist allerdings auch fehlgeschlagen ....

Gruss

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 09.01.17 13:08 
Hallo und :welcome:

du schreibst im Titel, daß du eine BindingSource (als DataSource) verwendest, dann solltest du aber nicht direkt die Daten im Grid verändern, sondern die Daten der DataSource (d.h. der BindingSource).
Koto Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 09.01.17 15:57 
Aber löst das das Problem?

Ich habe jetzt den Code halbwegs angepasst , jedoch weiß ich nicht, ob du es so gemeint hast. Zudem komme ich gerade auch noch nicht drauf, wie ich die Zeile über/unter der aktuell ausgewählten ändere.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
            DataRowView row = (DataRowView)bs.Current;
            row.BeginEdit();

            row[0] = darueber;

            row.EndEdit();

            bs.EndEdit();
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 09.01.17 16:03 
Nein, das meinte ich nicht (du benutzt ja immer noch direkt die Row).
Du solltest in deiner Datenquelle die Priorität ändern. Was verwendest du denn als Datenquelle (eine DataTable)?

Und du solltest auch nicht den Vorgänger anhand der Row identifizieren, sondern den Datensatz suchen, welche die vorherige Priorität hat - und diesen dann ändern. Durch das DataBinding aktualisiert sich dann das DataGridView automatisch.
Koto Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 10.01.17 08:26 
Ah ok, vielen Dank schon mal.
Ja genau. Ich arbeite mit einem DataAdapter, der den Sql-Befehl erhält und später mit dem DataSet/ der DataTable "gefüllt" wird, einem DataSet, dem die DataTable angefügt wird und deiner BindingSource, die als DataSource das DataSet erhält und als DataMember die DataTable.

Zitat:
Du solltest in deiner Datenquelle die Priorität ändern.

Meinst du damit auch direkt in der Datanbank oder nur im DataTable?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 10.01.17 13:02 
Primär erst einmal in der DataTable, aber diese kann ja auch wieder mit der Datenbank synchronisiert werden.
Koto Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 13.01.17 09:25 
Mein Lösungsansatz wäre nun der hier:

ausblenden C#-Quelltext
1:
ds.Tables[0].Rows[grdDaten.CurrentCell.RowIndex]["AuPrio"] = "99";					


Allerdings hat er auch hier damit Probleme, dass ich das DGV mit Hilfe der Bindingsource sortiere. Er nimmt eine für mich nicht nachvollziehbare Row und ändert dort die Prio.

Nehme ich die Sortierung raus, klappt alles einwandfrei.
Einloggen, um Attachments anzusehen!