none
Wert wird nicht gespeichert/Übernommen RRS feed

  • 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 :)

    Mittwoch, 30. August 2017 14:17

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
    Mittwoch, 30. August 2017 15:45

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
    Mittwoch, 30. August 2017 15:45
  • 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

    Donnerstag, 31. August 2017 07:35
  • 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

    Donnerstag, 31. August 2017 09:23
  • 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

    Donnerstag, 31. August 2017 11:08
  • 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

    Donnerstag, 31. August 2017 14:23
  • Ich denke schon das der fehler bei mir liegt - ich schaue weiter

    vielen dank für die ganze hilfe

    Donnerstag, 31. August 2017 14:31