Benutzer mit den meisten Antworten
Wert wird nicht gespeichert/Übernommen

Frage
-
Ich habe ein Formular mit einen DataView und TextBoxen
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load tbl_Journal_BindingSource.DataSource = rep.GetData_tbl_Journal Me.Controls.AddRange(New Control() {btn_Speichern, DataGridView1}) DataGridView1.DataSource = tbl_Journal_BindingSource AdresseTextBox.DataBindings.Add("Text", tbl_Journal_BindingSource, "Adresse") BeschreibungTextBox.DataBindings.Add("Text", tbl_Journal_BindingSource, "Beschreibung") 'DatumZeitDateTimePicker.DataBindings.Add("Value", tbl_Journal_BindingSource.DataSource, "DatumZeit") End Sub
in der Textbox kann ich im Feld BeschreibungTextBox(String) Text eingeben oder ändern und dieses wird auch im DataView geändert - Oder ich kann im DataView ändern und es wird in der BeschreibungTextBox geändert - so soll es auch sein
leider
in der AdresseTextBox(Integer in der DB) kann ich ändern aber beim Klicken auf ein anders Element wird die änderung zurück genommen - Sprich der alte Wert steht wieder da
Wenn ich im DataView den Wert bei Adresse ändere geht es - und wird dann wiederum auch in der AdresseTextBox angezeigt
hatte es auch mit einer ComboBox Probiert aber dort war es genau so (Datenherkunft allerdings über eine andere Tabelle)
With AdresseSuchbegriff .DataSource = tbl_Adressen_BindingSource .DisplayMember = "Suchbegriff" .ValueMember = "Adresse" .DataBindings.Add("SelectedValue", tbl_Journal_BindingSource, "Adresse") End With
wie gesagt ich bin Neu - aber auch verzweifelt :)
Antworten
-
Hi,
im Prinzip funktioniert das so. Ich habe das bereits gepostete Beispiel mal etwas erweitert mit TextBox und Combobox. Das DemoProjekt hate eine Tabelle Tab1 und eine Tabelle Master aus einer DemoDB und einem Model MyModel. Den Code einfach in den Codeteil der Form1 eines leeren VB Projektes kopieren. Es ist lediglich der Zugriff auf die DB anzupassen (in der app.config) und ggf. auch Tab1 und Master. In Tab1 gibt es eine Spalte "FK" für den Fremdschlüssel und die Spalte "Info", die an die TextBox gebunden ist. In Master gibt es eine Schlüsselspalte "ID" und eine Spalte "Info" für die Anzeige des Langtextes in der Combobox.Imports System.Collections.ObjectModel Imports System.Data.Entity Public Class Form1 Private DataGridView1 As New DataGridView With {.Dock = DockStyle.Fill} Private WithEvents btn As New Button With {.Text = "Save", .Dock = DockStyle.Top} Private tb1 As New TextBox With {.Dock = DockStyle.Top} Private cb1 As New ComboBox With {.Dock = DockStyle.Top, .ValueMember = "ID", .DisplayMember = "Info"} Private rep As New DemoRepository(DemoContext.GetInstance) Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.Controls.AddRange(New Control() {DataGridView1, cb1, tb1, btn}) DataGridView1.DataSource = rep.GetChildData tb1.DataBindings.Add("Text", rep.GetChildData, "Info") cb1.DataSource = rep.GetMasterData cb1.DataBindings.Add("SelectedValue", rep.GetChildData, "FK") End Sub Private Sub btn_Click(sender As Object, e As EventArgs) Handles btn.Click rep.Save() End Sub End Class Public Class DemoContext Inherits DbContext Private Shared _instance As DemoContext = Nothing Public Shared Function GetInstance() As DemoContext If _instance Is Nothing Then _instance = New DemoContext Return _instance End Function Public Sub New() MyBase.New("DemoDBEntities") End Sub Public Property DemoData As DbSet(Of Tab1) Public Property DemoMaster As DbSet(Of Master) End Class Friend Class DemoRepository Friend Sub New(context As DemoContext) Me.ctx = context End Sub Private ctx As DemoContext Private _bsChild As BindingSource Friend Function GetChildData() As BindingSource Dim col = New ObservableCollection(Of Tab1)(From item In ctx.DemoData) If Me._bsChild Is Nothing Then Me._bsChild = New BindingSource With {.DataSource = col} Return Me._bsChild End Function Private _bsMaster As BindingSource Friend Function GetMasterData() As BindingSource Dim col = New ObservableCollection(Of Master)(From item In ctx.DemoMaster) If Me._bsMaster Is Nothing Then Me._bsMaster = New BindingSource With {.DataSource = col} Return Me._bsMaster End Function Friend Sub Save() Me._bsChild.EndEdit() ctx.SaveChanges() End Sub End Class
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort vorgeschlagen Peter Fleischer Donnerstag, 31. August 2017 09:23
- Als Antwort markiert MCDPone Donnerstag, 31. August 2017 14:32
Alle Antworten
-
Hi,
im Prinzip funktioniert das so. Ich habe das bereits gepostete Beispiel mal etwas erweitert mit TextBox und Combobox. Das DemoProjekt hate eine Tabelle Tab1 und eine Tabelle Master aus einer DemoDB und einem Model MyModel. Den Code einfach in den Codeteil der Form1 eines leeren VB Projektes kopieren. Es ist lediglich der Zugriff auf die DB anzupassen (in der app.config) und ggf. auch Tab1 und Master. In Tab1 gibt es eine Spalte "FK" für den Fremdschlüssel und die Spalte "Info", die an die TextBox gebunden ist. In Master gibt es eine Schlüsselspalte "ID" und eine Spalte "Info" für die Anzeige des Langtextes in der Combobox.Imports System.Collections.ObjectModel Imports System.Data.Entity Public Class Form1 Private DataGridView1 As New DataGridView With {.Dock = DockStyle.Fill} Private WithEvents btn As New Button With {.Text = "Save", .Dock = DockStyle.Top} Private tb1 As New TextBox With {.Dock = DockStyle.Top} Private cb1 As New ComboBox With {.Dock = DockStyle.Top, .ValueMember = "ID", .DisplayMember = "Info"} Private rep As New DemoRepository(DemoContext.GetInstance) Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.Controls.AddRange(New Control() {DataGridView1, cb1, tb1, btn}) DataGridView1.DataSource = rep.GetChildData tb1.DataBindings.Add("Text", rep.GetChildData, "Info") cb1.DataSource = rep.GetMasterData cb1.DataBindings.Add("SelectedValue", rep.GetChildData, "FK") End Sub Private Sub btn_Click(sender As Object, e As EventArgs) Handles btn.Click rep.Save() End Sub End Class Public Class DemoContext Inherits DbContext Private Shared _instance As DemoContext = Nothing Public Shared Function GetInstance() As DemoContext If _instance Is Nothing Then _instance = New DemoContext Return _instance End Function Public Sub New() MyBase.New("DemoDBEntities") End Sub Public Property DemoData As DbSet(Of Tab1) Public Property DemoMaster As DbSet(Of Master) End Class Friend Class DemoRepository Friend Sub New(context As DemoContext) Me.ctx = context End Sub Private ctx As DemoContext Private _bsChild As BindingSource Friend Function GetChildData() As BindingSource Dim col = New ObservableCollection(Of Tab1)(From item In ctx.DemoData) If Me._bsChild Is Nothing Then Me._bsChild = New BindingSource With {.DataSource = col} Return Me._bsChild End Function Private _bsMaster As BindingSource Friend Function GetMasterData() As BindingSource Dim col = New ObservableCollection(Of Master)(From item In ctx.DemoMaster) If Me._bsMaster Is Nothing Then Me._bsMaster = New BindingSource With {.DataSource = col} Return Me._bsMaster End Function Friend Sub Save() Me._bsChild.EndEdit() ctx.SaveChanges() End Sub End Class
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort vorgeschlagen Peter Fleischer Donnerstag, 31. August 2017 09:23
- Als Antwort markiert MCDPone Donnerstag, 31. August 2017 14:32
-
Erst einmal vielen Dank für deine Hilfe
ich habe deine DEMO einmal genauso Umgesetzt und habe genau das gleiche Phänomen das wenn ich einen Datensatz in der ComboBox auswähle und ich dann irgendwo hin clicke(in diesem Fall auf btnSave) er den wert der ComboBox wieder auf den Ursprünglichen wert setzt
sprich genauso wie in meinem eigenen DemoProjekt
auch wird der neue Wert dann nicht in der DB gespeicher - also nicht nur in der Anzeige das ganze
und auch hier wenn ich im DataGridView den wert FK ändere er diesen richtig in der ComboBox anzeigt
-
Hi,
also meine Demo funktioniert problemlos. Was hast Du daran geändert, so dass es nicht mehr funktioniert?--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Also Projekt neu
deinen Code eingefügt
Tabellen im sql Server erstellt
Beide Tabellen mit DEMO daten gefüllt
ConnectionStrings in App.config erstellt
2 klassen erstellt
Imports System Imports System.Collections.Generic Imports System.ComponentModel.DataAnnotations Imports System.ComponentModel.DataAnnotations.Schema Imports System.Data.Entity.Spatial <Table("Master")> Partial Public Class Master Public Property ID As Integer <StringLength(10)> Public Property Info As String <StringLength(10)> Public Property Beschreibung As String End Class
Imports System Imports System.Collections.Generic Imports System.ComponentModel.DataAnnotations Imports System.ComponentModel.DataAnnotations.Schema Imports System.Data.Entity.Spatial Partial Public Class Tab1 Public Property ID As Integer Public Property FK As Integer? <StringLength(10)> Public Property Info As String <StringLength(10)> Public Property Test As String End Class
Projekt gestartet - Daten werden angezeigt - wenn ich im Datensatz des DataGridView den Datensatz wechsel alles OK wird auch in der ComboBox angezeigt
wenn ich in der ComboBox einen anderen wert auswähle wird dieser nicht in der DB oder auch in dem DataGridView geändert - sobald der Cursor aus der ComboBox geht wird der wert der im DataGriedView steht wieder als wert in der Combobox übernommen
-
Hi,
ich habe auch diesen Code First Ansatz getestet und alles funktioniert. Es sieht aus, als würdest Du eine angehängte Datenbank nutzen, die bei jedem Debug neu ins Ausführungsverzeichnis kopiert wird und deshalb die alten Änderungen überschrieben werden.--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks