Laden...

Problem mit Relation

Erstellt von Grimmbizkit vor 16 Jahren Letzter Beitrag vor 13 Jahren 1.859 Views
G
Grimmbizkit Themenstarter:in
310 Beiträge seit 2006
vor 16 Jahren
Problem mit Relation

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?

4.221 Beiträge seit 2005
vor 16 Jahren

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

G
Grimmbizkit Themenstarter:in
310 Beiträge seit 2006
vor 16 Jahren

Ich arbeite leide rnicht mit einem Designer, sondern mache alles per Hand.

F
10.010 Beiträge seit 2004
vor 16 Jahren

Um Mit Relationen zu arbeiten, muss die gebundene DataSource diese natürlich auch unterstützen.

  1. Du benutzt einen View, der Unterstützt dies nicht.

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

  1. Und der grund warum es bei dir garnicht gehen kann, die Relation ist das ergebnis,
    also muss sie dem DetailView zugewiesen werden.

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;

G
Grimmbizkit Themenstarter:in
310 Beiträge seit 2006
vor 16 Jahren

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

G
Grimmbizkit Themenstarter:in
310 Beiträge seit 2006
vor 16 Jahren

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

F
10.010 Beiträge seit 2004
vor 16 Jahren

Bitte drehe auch die datamember/DataSource beim letzten aufruf, sonst werden erst alle daten agezeigt, und dann nochmal "gefiltert".

4.221 Beiträge seit 2005
vor 13 Jahren

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...