Benutzer mit den meisten Antworten
Dataset - Add DataRow über die Beziehung

Frage
Antworten
-
Hi Oliver,
unklar ist, wer Dir verbietet, Klassen aus dem Framework zu nutzen, z.B. die System.Windows.Forms.dll?
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort markiert Oliver Müller12 Montag, 13. November 2017 17:40
- Bearbeitet Peter Fleischer Montag, 13. November 2017 19:07 Grammatikfehler
Alle Antworten
-
Hi Oliver,
natürlich ist das möglich:BindingSource bs2 hält die zum aktuellen Master-Datensatz gehörenden Child-Datensätze. Dann einfach neuen Datensatz mit AddNew hinzufügen:
var drv = (DataRowView)(bs2.AddNew()); drv["Info"] = "neue Zeile"; // Eigenschaftswert im neuen Child-Datensatz
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Hi Oliver,
Mit dem Designer erstellst Du erst einmal die DataSet-Klassen. Wie erstellst Du die Repositories, die die Daten von den erstellten Typen halten?--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
-
Hi Oliver,
im von Dir genannten Thread ist nicht ersichtlich, wie das Repository für die Child-Datensätze aussieht. Vermutlich hast Du dafür nichts implementiert und greifst immer auf alle Child-Datensätze zu. In meinem Beispiel habe ich eine BindingSource für die Child-Datensätze zum Current Master-Datensatz genutzt.
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Bearbeitet Peter Fleischer Freitag, 10. November 2017 16:06 Grammatikfehler
-
. In meinem Beispiel habe ich eine BindingSource für die Child-Datensätze zum Current Master-Datensatz genutzt.
Hallo Peter,
mir fehlt hier die Vorgehensweise.
Ich nehme den Wizard, erstelle mir Primär-/Fremdschlüssel. Sauberes Datenmodell.
Erstelle dann die Beziehungen über den Wizard, meist dann Benamung mit FK_PK_XXX etc.
Wie kann ich jetzt anhand dem das Datenmodell schneller befüllen, ohne mühselig selber nach dem Fremdschlüssel zu suchen.
Ich brauche da ein Bespiel, wenn Du eins hast. DANKE.
Viele Grüße Oliver
-
Hi Oliver,
zu Deiner Ausgangsfrage hatte ich Dir schon geantwortet. Hier mal eine Konsolendemo zur Verdeutlichung:using System; using System.Data; namespace ConsoleApp1 { class Program21 { static void Main(string[] args) { try { Demo c = new Demo(); c.Execute(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("Fertig, Abschluss mit beliebiger Taste"); Console.ReadKey(); } /// <summary> /// Klasse, die das arbeitende Programm simuliert /// </summary> internal class Demo { internal void Execute() { /// Master-Tabelle DataSet t1 = new DataSet(); DataTable dtSide = new DataTable("Master"); DataTable dtSerials = new DataTable("Child"); t1.Tables.AddRange(new DataTable[] { dtSide, dtSerials }); DataColumn col11 = dtSide.Columns.Add("Id", typeof(int)); col11.AutoIncrement = true; col11.AutoIncrementSeed = -1; col11.AutoIncrementStep = -1; dtSide.Columns.Add("Number", typeof(string)); // Child-Tabelle DataColumn col21 = dtSerials.Columns.Add("Id", typeof(int)); col21.AutoIncrement = true; col21.AutoIncrementSeed = -1; col21.AutoIncrementStep = -1; DataColumn col22 = dtSerials.Columns.Add("IdSide", typeof(int)); dtSerials.Columns.Add("Position", typeof(string)); // Beziehung ForeignKeyConstraint fkc = new ForeignKeyConstraint("FKc", col11, col22) { DeleteRule = Rule.Cascade }; dtSerials.Constraints.Add(fkc); t1.Relations.Add("rel1", col11, col22); // BindingSources System.Windows.Forms.BindingSource bsMaster = new System.Windows.Forms.BindingSource(t1, "Master"); System.Windows.Forms.BindingSource bsChild = new System.Windows.Forms.BindingSource(bsMaster, "rel1"); // Master-Datensätze for (int i = 1; i <= 10; i++) { DataRowView drv = bsMaster.AddNew() as DataRowView; drv["Number"] = $"Master {i}"; } // Child-Datensätze Random rnd = new Random(); // Für zufälligen Master-Datensatz for (int i = 0; i < 100; i++) { bsMaster.Position = rnd.Next(0, bsMaster.Count); DataRowView drv = bsChild.AddNew() as DataRowView; drv.BeginEdit(); drv["Position"] = $"Child {i + 1}"; drv.EndEdit(); } // Testanzeige foreach (DataRow row1 in dtSide.Rows) { Console.WriteLine($"{row1[0]} {row1[1]}"); foreach (DataRow row2 in row1.GetChildRows("rel1")) Console.WriteLine($" {row2[0]} {row2[1]} {row2[2]}"); } } } } }
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Hallo Peter,
>Um Teile der Logik auszulagern, nutze rechte Maustaste auf markierte Codezeilen -> refactoring -> extract method.
das wußte ich nicht. DANKE.
// BindingSources
System.Windows.Forms.BindingSource bsMaster = new System.Windows.Forms.BindingSource(t1, "Master");
Ich muss das ohne Windows Form realisieren.
So was erzeugt der Wizard, müsste irgendwie anders zu befüllen sein, denke ich.
Weiß nur nicht wo ich suchen kann.
Viele Grüße Oliver
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "15.0.0.0")] public DTCounterIndiciesRow[] GetDTCounterIndiciesRows() { if ((this.Table.ChildRelations["FK_DTPositions_DTCounterIndicies"] == null)) { return new DTCounterIndiciesRow[0]; } else { return ((DTCounterIndiciesRow[])(base.GetChildRows(this.Table.ChildRelations["FK_DTPositions_DTCounterIndicies"]))); } } DataSetMarkingCodes.DTCounterIndiciesRow myRow = new DataSetMarkingCodes.DTCounterIndiciesRow(); DSMarkingCodes.DTCounterIndicies.AddDTCounterIndiciesRow(myRow);
- Bearbeitet Oliver Müller12 Samstag, 11. November 2017 21:10
-
Hi Oliver,
unklar ist, wer Dir verbietet, Klassen aus dem Framework zu nutzen, z.B. die System.Windows.Forms.dll?
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort markiert Oliver Müller12 Montag, 13. November 2017 17:40
- Bearbeitet Peter Fleischer Montag, 13. November 2017 19:07 Grammatikfehler
-
Hi Oliver,
natürlich kannst Du auch den Designer für die Erzeugung des Repositories nutzen. Die dazu gehörenden Anweisungen werden dann in der Designer-Datei abgelegt. Üblicherweise ist das in einer Windows Forms Anwendung die Designer-Datei eines Formulars. Dort kann man die Instanz des typisierten DataSets ablegen und auch die Instanzen von BindingSources. Im Eigenschaftsfenster kann man dann die Zuordnungen treffen.--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks