verwendetes Datenbanksystem: SQL
Hallo ich habe zwei Tabellen.
Lfs_Daten1 mit Indexen
Lfs_Daten2 mit den Entsprechenden Daten
Nun habe ich versuch eine Relation zwischen den beidne Tabellen zu bauen:
dsLfs = lfs.LoadLfsDaten(this.dateTimePicker_From.Value, this.dateTimePicker_To.Value);
dtLfs = dsLfs.Tables["Lfs_Daten1"];
dtLfsDaten = dsLfs.Tables["Lfs_Daten2"];
dvLfs = dtLfs.DefaultView;
dvLfsDaten = dtLfsDaten.DefaultView;
DataRelation RelationLfs = new DataRelation("Lfs_Relation", dsLfs.Tables["Lfs_Daten1"].Columns["LfsId"], dsLfs.Tables["Lfs_Daten2"].Columns["LfsDatId"]);
dsLfs.Relations.Add(RelationLfs);
bs_Lieferscheine.DataSource = dvLfs;
bs_Lieferscheine.DataMember = "Lfs_Relation";
bs_LieferscheinDaten.DataSource = dvLfsDaten;
Doch wenn ich die Position im bs_Lieferscheine verändere, bewegt sich der Zeiger in der anderen BS nicht.
Woran kann das liegen?
Es liegt daran, dass Du die DataSources falsch setzt.
Probier es mal so (oder so ähnlich).
1-Teil:
DataSource=DataSet;
DataMember=TableName;
n-Teil:
DataSource=DataSet;
DataMember=ParentTable.RelationToSubTable; (Im Designer zuerst die ParentTabelle auswählen und dann diese aufklappen und die entsprechende ChildTable auswählen)
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Ich arbeite leide rnicht mit einem Designer, sondern mache alles per Hand.
Um Mit Relationen zu arbeiten, muss die gebundene DataSource diese natürlich auch unterstützen.
Du benutzt einen View, der Unterstützt dies nicht.
Die DataMember immer zuerst zuweisen, sonst werden erst alle daten gebunden,
und dann nochmal durch den DataMember gefiltert.
3.Der defaultview wird sowieso benutzt, den musst Du nicht erst zuweisen.
dsLfs = lfs.LoadLfsDaten(this.dateTimePicker_From.Value, this.dateTimePicker_To.Value);
dtLfs = dsLfs.Tables["Lfs_Daten1"];
dtLfsDaten = dsLfs.Tables["Lfs_Daten2"];
DataRelation RelationLfs = new DataRelation("Lfs_Relation", dsLfs.Tables["Lfs_Daten1"].Columns["LfsId"], dsLfs.Tables["Lfs_Daten2"].Columns["LfsDatId"]);
dsLfs.Relations.Add(RelationLfs);
bs_Lieferscheine.DataMember = "Lfs_Daten1";
bs_Lieferscheine.DataSource = dsLfs;
bs_LieferscheinDaten.DataMember = "Lfs_Relation";
bs_LieferscheinDaten.DataSource = dsLfs;
Wenn ich den Quellcode so übernehme, dann erhalte ich die Meldung:
An die Eigenschaft oder Spalte KdName1 für die DataSource kann nicht gebunden werden.
doch in der Lfs_Daten2 gibt es dieses Feld, das kann ich sehen, wenn ich mir die bs_Lieferscheindaten mit dem Debugger und dem DataSetVisualizer ansehe.
Nachdem ich die Relation der BindingSource zugewiesen habe kommt folgender Code:
txtKdNr.DataBindings.Add("Text", bs_Lieferscheine, "KdNr"); // ID Nummer
txtKunde.DataBindings.Add("Text", bs_LieferscheinDaten, "KdName1"); // der eigentlich Name
Die daten der ID Tabelle (1) lassen sich mittels des BindingNavigators verschieben, doch die Texte (aus der Relation) lassen sich nicht verschieben.
Woran liegt das?
Wenn ich mir das im Debugger ansehen, dann merke ich, das die BindingSource bs_LieferscheinDaten, keinen DataMember hat. obwohl der doch "Lfs_Relation" zugewiesen wurde
Lösung:
Ich muss DataSource und DataMember folgendermaßen zuweisen:
dsLfs = lfs.LoadLfsDaten(this.dateTimePicker_From.Value, this.dateTimePicker_To.Value);
dtLfs = dsLfs.Tables["Lfs_Daten1"];
dtLfsDaten = dsLfs.Tables["Lfs_Daten2"];
DataRelation RelationLfs = new DataRelation("Lfs_Relation", dsLfs.Tables["Lfs_Daten1"].Columns["LfsId"], dsLfs.Tables["Lfs_Daten2"].Columns["LfsDatId"]);
dsLfs.Relations.Add(RelationLfs);
bs_Lieferscheine.DataMember = "Lfs_Daten1";
bs_Lieferscheine.DataSource = dsLfs;
bs_LieferscheinDaten.DataSource = bs_Lieferscheine;
bs_LieferscheinDaten.DataMember = "Lfs_Relation";
Dann geht das.
Gruß Simon
Bitte drehe auch die datamember/DataSource beim letzten aufruf, sonst werden erst alle daten agezeigt, und dann nochmal "gefiltert".
Hier noch ein Link zum selben Thema
ComboBox-Bindung: Nach Auswahl in der ersten Box in zweiter Box die zugehörigen Werte anzeigen
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...