Laden...

Forenbeiträge von MaWiMo Ingesamt 6 Beiträge

23.04.2024 - 16:46 Uhr

Ja, "Tage" ist eine DataTable aus dem DataSet. Ich habe die Hierarchie so wie empfohlen angelegt und ändern/löschen funktioniert ja auch. Nur das bei BindingSource.AddNew ein Datensatz mit leeren Eigenschaften (jeweils DBNull) angelegt wird und die Datenbindung nicht funktioniert.

Ohne Hierarchie habe ich auch schon probiert, funktioniert ebenfalls nicht. Ohne BindingSource muss ich bei der DataTable halt mit NewRow eine neuen Datensatz erzeugen, die Eigenschaften "manuell" beschreiben und der Table hinzufügen. Dies funktioniert natürlich. Auch mit BindingSource habe ich die Eigenschaften "manuell" beschrieben und dann gespeichert. Auch dies funktioniert.

Ich hätte es nur gerne mit dem DataBinding umgesetzt, denn wozu ist diese Methode denn da? Mit BindingSource.AddNew wird exakt das Gleiche in der zugrunde liegenden Table ausgelöst (NewRow).

Das sehr gute Tutorial hat mich in diesem Punkt nicht weitergebracht.

23.04.2024 - 11:00 Uhr

Vielen Dank für die Hinweise! Den Artikel werde ich durcharbeiten (und nameof(...) verwenden).

Es handelt sich um DataTables. Die DataSource ist eine andere BindingSource im Sinne einer Master/Detail-Struktur (Tage haben Zeiten / Zeiten haben Beginn, Ende, Art usw.). Hier ein Ausschnitt:

DataSet.Relations.Add("TageZeiten", Tage.Columns["Id"], Zeiten.Columns["TagId"], true);
BsTage.DataSource = Data.DataSet;
BsTage.DataMember = "Tage";
BsZeiten.DataSource = BsTage;
BsZeiten.DataMember = "TageZeiten";

Ich dachte, wenn die zugrunde liegende Liste eine DataTable ist, muss das Ereignis BindingSource.AddingNew nicht verwendet werden.

22.04.2024 - 17:29 Uhr

Hallo zusammen,

ich habe eine BindingSource mit einigen DataBindings an verschiedene Steuerelemente. Ändern und Löschen von Datensätzen funktioniert einwandfrei. Einzig mit dem Hinzufügen neuer DS habe ich ein Problem. Ich verwende die Methode BindingSource.AddNew() und erzeuge dann das Formular zum Eingeben der Daten. Dem Formular wird die BindingSource als Parameter übergeben:

		private void BtnZeitNeu_Click(object sender, EventArgs e)
		{
			BsZeiten.AddNew();
			ZeitEditieren();
		}

		private void ZeitEditieren()
		{
			try
			{
				EingabeZeit form = new(BsZeiten);
				if (form.ShowDialog() == DialogResult.OK)
				{
					Cursor = Cursors.WaitCursor;
					BsZeiten.EndEdit();
					Data.UpdateZeiten();
				}
				else
				{
					BsZeiten.CancelEdit();
				}
			}
			catch (Exception Ex)
			{
				Helper.ShowException(Ex);
			}
			finally
			{
				Cursor = Cursors.Default;
			}
		}

Bei der Initialisierung der Form werden die DataBindings angelegt:

		internal EingabeZeit(BindingSource BsZeiten)
		{
			InitializeComponent();
			_BsZeiten = BsZeiten;

			try
			{

				Binding BdgBeginn = new("Value", _BsZeiten, "Beginn", true, DataSourceUpdateMode.OnPropertyChanged, DateTime.Now);
				Binding BdgEnde = new("Value", _BsZeiten, "Ende", true, DataSourceUpdateMode.OnPropertyChanged, DateTime.Now);
				Binding BdgArt = new("SelectedIndex", _BsZeiten, "Art", true, DataSourceUpdateMode.OnPropertyChanged, 0);
				DtpBeginn.DataBindings.Add(BdgBeginn); //DateTimePicker
				DtpEnde.DataBindings.Add(BdgEnde);
				CmbArt.DataBindings.Add(BdgArt); //ComboBox
				
				//.... weitere Bindungen
			}
			catch (Exception Ex)
			{
				Helper.ShowException(Ex);
			}
		}

Mein Problem ist nun, dass beim Schließen der Form mit DialogResult.OK keine Werte in dem neuen Datensatz stehen. Die DataBindings funktionieren irgendwie nicht, obwohl die Binding-Ereignisse Format und BindingComplete geworfen werden. Einzig das Ereignis Parse wird nicht geworfen. Es wird aber geworfen, wenn ich einen Wert in der Form ändere. Wenn jedoch die Standardwerte der Bindings nicht verändert werden, so werden die nicht in den neuen Datensatz eingetragen.

Was mache ich da nur falsch?

Danke für Eure Antworten!

29.06.2023 - 09:26 Uhr

Danke für die Hinweise!

Schade, ich hoffte es gäbe da eine Möglichkeit. Denn es sind ja alle Tabellen und Relationen aus der DB im EF abgebildet. Und beim Materialisieren der LINQ-Abfrage werden ja auch alle Daten entsprechend der Relationen aus der DB geladen.

28.06.2023 - 15:09 Uhr

Danke für die schnelle Antwort!

Im echten Programmcode ist das schon getrennt, ich habe es hier der Übersicht halber zusammen dargestellt. Ich habe noch eine weitere Möglichkeit gefunden, die dokumentiert wird und zwar mit der Erweiterungsmethode ToBindingList(). Damit funktioniert es mit einer "normalen" Tabelle, die DataGridView wird automatisch aktualisiert:

                Context.ArbZeiten.Load();
                BindingSource bs = new BindingSource();
                bs.DataSource = Context.ArbZeiten.Local.ToBindingList();
                DgvArbZeiten.DataSource = bs;

Mein Problem ist, wie kriege ich genau das mit einer Liste hin, die so wie unten gezeigt durch eine LINQ-Abfrage erzeugt wird?

Danke!

28.06.2023 - 13:14 Uhr

Hallo!

Ich bin mit dem Entity Framework Core 7 relativ neu unterwegs und komme an dieser Stelle nicht weiter:

Ich habe eine LINQ-Abfrage mit Joins über mehrere Tabellen aus meinem DbContext und projiziere das Ergebnis mit "select new xyz()" und ToList() über einen BindingSource in die DataSource eines DataGridView's. Wenn nun in der zugrundliegenden Haupttabelle ein Datensatz hinzugefügt wird, wird das DataGridView nicht aktualisiert.

            var query = from az in Context.ArbZeiten
                       where az.MitarbId == MitarbeiterId
                       join kat in Context.Kategorie on az.KatId equals kat.Id
                       join ort in Context.Orte on az.OrtId equals ort.Id
                       join prj in Context.vAuftraege on az.AuftragId equals prj.BELEG_ID
                       orderby az.Id
                       select new ArbZeitenSicht()
                       {
                           Bearbeitet = az.Bearbeitet,
                           Projekt = prj.Projekt,
                           Bezeichnung = prj.Bezeichnung,
                           Auftrag = az.Auftrag,
                           Kategorie = kat.Kategorie1,
                           Datum = az.Datum,
                           Beginn = az.Beginn,
                           Ende = az.Ende,
                           Pause = az.Pause,
                           Ort = ort.Ort,
                           Reise = az.Reise,
                           Km = az.Km,
                           Beschreibung = az.Beschreibung
                       };
               BindingSource bs = new BindingSource();
               bs.DataSource = query.ToList();
               DgvArbZeiten.DataSource = bs;

Im DbContext:

  public virtual DbSet<ArbZeitenSicht> ArbZeitenSicht { get; set; }
  
  protected override void OnModelCreating(ModelBuilder modelBuilder)
  {
          modelBuilder.Entity<ArbZeitenSicht>(entity => 
        {
            entity
                .HasNoKey();
        });
       OnModelCreatingPartial(modelBuilder);

  }

Ist das überhaupt der richtige Weg? Welches ist der beste Weg, um einen solchen Fall mit dem EF zu lösen? Ich stehe da im Moment etwas auf dem Schlauch....

Vielen Dank für Eure Tipps und Hinweise!