Autor Beitrag
lightsaver
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24


C# (VS 2008 Prof.)
BeitragVerfasst: Do 01.05.08 14:01 
Hi,

ich habe ein Problem, wenn ich rejectchanges() verwende.

Erstmal kurz was zum Aufbau:

Ich habe ein Form1 mit einem DataGridView, welches an ein Dataset gebunden ist, in dem verschiedene Daten aus einer DB stehen. In jeder Zeile ist auch ein Symbol erstellt, was als Button dient, um die Zeile zu editieren (also nicht das, was beim dgv dabei ist, wenn userCanEdit oder so ähnlich auf true ist!).
Ich rufe nun ein weiters Form (Form2) mit meinem DataSet und einem Key als Parameter auf.
Dort erstelle mir jetzt eine DataRow anhand des Keys. (Ich weiß, ich könnte dies auch vorher machen und nur die DataRow an Form2 übergeben, aber ich brauche das DataSet noch für andere Sachen, die später mal kommen, daher dieser umweg)
Dieses Form2 hat mehrere Textboxen, eine Richtextbox und noch mehrere Comboboxen. Diese habe ich mit der DataRow gebunden. Die Daten werden dann auch richtig angezeigt.
Wenn ich jetzt etwas ändere und auf übernehmen klicke, dann wird alles aus der DataRow in der DB aktuallisiert und bei Form1 auch korrekt angezeigt.

Nun aber das Problem:

Klicke ich auf den Button "zurücksetzen", wird folgendes aufgerufen:

ausblenden C#-Quelltext
1:
2:
3:
4:
private void button1_Click(object sender, EventArgs e)
        {
            dr.RejectChanges();
        }


also erstmal nichts besonderes.
Im Hintergrund sehe ich noch das Form1 und kann da auch sehen, dass im dgv die Daten auch wirklich zurückgesetzt werden auf den Zustand, wo auf editieren geklickt wurde -> rejectchanges() tut also an sich erstmal das, was es soll.
Alle Felder in Form2 bleiben aber unverändert. Erst wenn ich in irgendein anderes Feld klicke (also raus aus dem wo ich zuletzt war) und da dann eine änderung vornehme, werden alle Felder in Form2 zurückgesetzt.

Ich verstehe nicht, wie es zu dieser Inkonsistenz kommen kann. Ich habe auch schon ein this.refresh() probiert, um mal das ganze Form2 inklusive der Usercontrols zu aktuallisieren, aber das bringt auch nichts.

Hier noch ein wenig Code, falls da doch der Fehler sein sollte:

der Konstruktor von Form2, den ich hier verwende, damit man sieht, wie ich die Felder binde
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
public Form_NewPosData(long posID, bauDataSet bds)
        {
            InitializeComponent();
            this.bds = bds;
            this.posid = posID;

            dr = this.bds.positionen.Rows.Find(posID);


            comboBox_Einheit.DataBindings.Add(new Binding("Text"this.dr, "einheit"false, DataSourceUpdateMode.OnPropertyChanged));
            textBox_Pos.DataBindings.Add(new Binding("Text"this.dr, "pos_nr"false, DataSourceUpdateMode.OnPropertyChanged));
            richTextBox1.DataBindings.Add(new Binding("Text"this.dr, "pos_text"false, DataSourceUpdateMode.OnValidation));
            textBox_Menge.DataBindings.Add(new Binding("Text"this.dr, "menge"true, DataSourceUpdateMode.OnPropertyChanged, 1"N2"));
            textBox_EP.DataBindings.Add(new Binding("Text"this.dr, "ep"true, DataSourceUpdateMode.OnPropertyChanged, 0"N2"));
            comboBoxZusatz.DataBindings.Add(new Binding("Text"this.dr, "zusatz"false, DataSourceUpdateMode.OnPropertyChanged));
            
        }



Ich hoffe, jemand hat eine Idee, woran das liegen könnte oder was ich noch probieren kann.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 01.05.08 15:36 
Hallo,

wenn verschiedene Controls an die gleiche Datenquelle gebunden werden, kommt es immer wieder zu solchen Ungereimtheiten. Meistens hilft es, eine BindingSource dazwischenzuschalten und die Controls daran zu binden. Zusätzlich kann es sinnvoll sein, vor der Speicherung (bzw. in diesem Fall vor dem Zurücksetzen) BindingSource.EndEdit() zu setzen.

Gruß Jürgen
lightsaver Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24


C# (VS 2008 Prof.)
BeitragVerfasst: Do 01.05.08 16:04 
Meintest du das etwa so? :

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public Form_NewPosData(long posID, bauDataSet bds)
        {
            InitializeComponent();
            this.bds = bds;
            this.posid = posID;

            dr = this.bds.positionen.Rows.Find(posID);


            this.bindingSource1.DataSource = this.dr;
            
            comboBox_Einheit.DataBindings.Add(new Binding("Text"this.bindingSource1, "einheit"false, DataSourceUpdateMode.OnPropertyChanged));
            textBox_Pos.DataBindings.Add(new Binding("Text"this.bindingSource1, "pos_nr"false, DataSourceUpdateMode.OnPropertyChanged));
            richTextBox1.DataBindings.Add(new Binding("Text"this.bindingSource1, "pos_text"false, DataSourceUpdateMode.OnValidation));
            textBox_Menge.DataBindings.Add(new Binding("Text"this.bindingSource1, "menge"true, DataSourceUpdateMode.OnPropertyChanged, 1"N2"));
            textBox_EP.DataBindings.Add(new Binding("Text"this.bindingSource1, "ep"true, DataSourceUpdateMode.OnPropertyChanged, 0"N2"));
            comboBoxZusatz.DataBindings.Add(new Binding("Text"this.bindingSource1, "zusatz"false, DataSourceUpdateMode.OnPropertyChanged));
            
        }


Das bindingSource1.EndEdit(); habe ich auch gemacht, leider hat es keine Besserung gebracht.
Vielleicht habe ich dich aber auch falsch verstanden
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 01.05.08 17:06 
user profile iconlightsaver hat folgendes geschrieben:
Meintest du das etwa so? :

In etwa ja. Allerdings hätte ich gedacht, dass bindingSource1.DataSource auf die DataTable gesetzt wird und eine Zeile mit Find und Position ausgewählt wird. Ob das einen Unterschied macht, weiß ich (noch) nicht.

user profile iconlightsaver hat folgendes geschrieben:
Das bindingSource1.EndEdit(); habe ich auch gemacht, leider hat es keine Besserung gebracht.

Schade.

user profile iconlightsaver hat folgendes geschrieben:
Vielleicht habe ich dich aber auch falsch verstanden

Nein, war schon so gemeint.

Tut mir leid, mehr Ideen habe ich nicht. Jürgen
lightsaver Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24


C# (VS 2008 Prof.)
BeitragVerfasst: Mi 07.05.08 14:44 
Das Problem selber ist zwar noch nicht gelöst, aber ich habe zumindest einen Workaround gefunden. Nach dem RejectChanges() löse ich von jedem UserControl mit Databinding.Clear() die Bindung und erstelle die Bindung danach neu.
In meinen Augen ist dies zwar ein sehr unschöner Weg, aber zumindest tut es erstmal das, was ich wollte.

Ich bin aber für weitere Vorschläge immernoch offen.