Announcement

Collapse
No announcement yet.

Problem mit bindingsource.addnew

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit bindingsource.addnew

    Hallo Zusammen
    Ich habe folgendes Problem in VB.net
    Ich habe ein Formular einer Combobox zum nachschlagen und versch. textfeldern zur Anzeige. Das ganze ist mit einer bindingsource (bs) an eine datatable gebunden.
    Weiterblättern, ändern usw ist alles kein Problem.
    Wenn ich mit bs.addnew() einen neuen Datensatz hinzufüge wird dieser angelegt, aber:
    -alle Textfelder werden nicht gelehrt sondern zeigen noch die Werte des letzten datensatzes an.
    -Die Combobox erhält einen leeren Eintrag.
    Wie bringe ich die Combobox dazu, dass der Inhalt aktualisiert wird (gleiches Problem auch beim Löschen, ändern eines Datensatzes)
    Wieso werden die Textfelder nicht gelehrt beim Anlegen des neuen Datensatzes.
    Besten Dank

  • #2
    Ich vermute mal das beim AddNew der aktuelle Datensatz nicht verschoben wird. Warum auch? Du mußt wahrscheinlich noch den von AddNew zurückgegebenen neuen Datensatz der Current Property der BindingSource zuweisen.


    edit: Vergiß was ich geschrieben habe. Ich sollte nicht spekulieren sondern ausprobieren. Hast du AllowNew an der BindingSource gesetzt und den UpdateMode beim Binding auf OnValidation oder OnPropertyChanged stehen?
    Zuletzt editiert von Ralf Jansen; 01.08.2009, 13:55.

    Comment


    • #3
      Noch nicht ganz klar

      Hallo Ralf
      Danke für die Antwort. Leider bin ich noch ziemlich ein Anfänger.
      Was meinst Du mit "Updatemode onValidation"
      Der neue Datensatzu wird angelegt aber die Textboxen nicht gelehrt.
      Wenn ich den Datensatz so speichere, dan habe ich schon einen neuen Datensatz aber halt mit den Werten des Vorgängerdatensatzes.

      Comment


      • #4
        Wenn du UpdateMode nicht kennst dann hast du denn wohl nicht verändert. Da der Default richtig ist hast du dort vermutlich kein Problem.

        Ändern kannst du den, wenn du das Binding im Winforms Designer vorgenommen hast, über den PropertyEditor der Textbox. Unter dem Punkt (DataBindings) findest du einen Punkt (Erweitert) über den du die Bindingdetails einstellen kannst. Eben z.B auch den UpdateModus(oder in der deutschen Übersetzung den Datenquellen-Aktualisierungsmodus)

        Der neue Datensatzu wird angelegt aber die Textboxen nicht gelehrt.
        Wenn ich den Datensatz so speichere, dan habe ich schon einen neuen Datensatz aber halt mit den Werten des Vorgängerdatensatzes.
        Vielleicht zeigst du uns ein wenig SourceCode insbesondere wie du das Binding gemacht hast und wie du einen neuen Datensatz anlegst. Vielleicht verstehen wir dann was bei dir nicht funktioniert. Was meinst du mit speichern? In eine DB? Dann wäre der Code zum speichern auch interessant.

        Comment


        • #5
          Hier etwas Code

          Hier meine Codeausschnitt:

          Imports System.Data.SqlClient
          Imports System.IO

          Public Class frmLieferanten
          Private da As SqlDataAdapter
          Private dt As DataTable

          Private Sub frmLieferanten_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
          'Verbindung herstellen
          Dim ConnStr As String
          ConnStr = "Data Source=.\SQLEXPRESS;AttachDBFilename=" & My.MySettings.Default.PharmtaxeDatenConn & ";Integrated Security=True;User Instance=true"
          Dim SelStr As String = "Select * FROM tblLieferantenstamm WHERE LKurzname <> 'Billigster Lieferant' ORDER by LKurzName"
          Dim conn As New SqlConnection(ConnStr)
          da = New SqlDataAdapter(SelStr, conn)
          'Setzt Primary Key automatisch
          da.MissingSchemaAction = MissingSchemaAction.AddWithKey
          Dim cb As New SqlCommandBuilder(da)
          dt = New DataTable("tblLieferantenstamm")

          conn.Open()
          da.Fill(dt)
          conn.Close()
          'Bindingsource zuweisen: verbindet Tabelle mit Controls
          bs.DataSource = dt


          TextBox28.DataBindings.Add("Text", bs, "LName")
          TextBox1.DataBindings.Add("Text", bs, "LKurzname")
          ComboBox1.ValueMember = "LKurzname" 'Felder an die Tabelle binden
          ComboBox1.DataSource = bs
          ComboBox1.DisplayMember = "LKurzname"

          '... weitere Textboxen anbinden


          Neuer Datensatz füge ich folgendermassen hinzu:

          Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
          'brauchts das um vorherige Änderungen abzuschliessen?
          bs.EndEdit()

          Dim varstring As String = InputBox("Geben Sie einen neue Bezeichnung für den Lieferanten ein.")
          If varstring IsNot String.Empty Then
          If ComboBox1.FindString(varstring) > 0 Then
          MessageBox.Show("Der eingegebene Lieferant " & varstring & " existiert bereits.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
          Exit Sub
          End If
          bs.AddNew()
          TextBox1.Text = varstring
          TextBox28.Text = varstring
          End If
          End Sub

          Dann habe ich folgendes Bild


          Die Combobox Lieferant zeigt einen leeren Eintrag, da der Dateninhalt nicht aktualisert wurde (wie mache ich das?)
          Alle Textfelder (mit Ausnahme der gesetzten Lieferantennamen) stammen noch vom letzten Datensatz.
          Zuletzt editiert von gfoidl; 03.08.2009, 16:47. Reason: Größe des Bildes korrigieren veruscht - BBCode unterstützt das aber nicht.

          Comment


          • #6
            @ChristophW:
            1. Kannst du den Code formatieren? Dann ist er leichter zu lesen und somit kann dir leichter geholfen werden. Es sollte also in deinem Interesse sein.
            2. Das von dir verlinkte Bild ist
              • riesig -> bitte ändere das auf eine normale Größe
              • liegt bei dir auf dem Server, d.h. wenn es dort gelöscht ist stimmt der Beitrag mit dem Bild nicht mehr zusammen. Das Bild kann auch direkt dem Beitrag angehängt werden. Dies halte ich für das bevorzugte Verfahren ein Bild anzuhängen.


            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Ich würde dir von diesem Vorgehen abraten. Also dem Benutzen von BindingSource.AddNew und danach manipulieren der Daten dieser Row über die gebundenen Controls im Code. Databinding ist anders gedacht eben die Manipulation der Daten an der Datenmenge selbst. Dein vorgehen (ich nenn das mal doppelt indirekt) von Control nach Datenmenge nach Control wird dich sonst häufiger vor Aktualisierungsprobleme stellen.

              Du solltest an der Datatable eine neue Row erzeugen und dort die DataRow direkt mit den gewünschten Werten befüllen. Wenn diese dann richtig vorbereiten ist kannst du diese z.B. per BindingSource.MoveLast() da Rows hinten angehängt werden oder noch besser per BindingSource.Find("MeinePrimaryKeySpalte", DerNeuePrimaryKey) zur aktuellen Row machen.

              Code:
              DataRow row = dt.NewRow();
              row["LKurzname"] = varstring;       
              dt.Rows.Add(row);                             
              bindingSource1.MoveLast();

              Sonstiges:

              - Denk nochmal über 'Select * from' nach. * ist für Leute die auch Goto benutzen.
              - Deine Oberfläche sieht nicht dynamisch aus. Wenn das so ist wäre ein typisiertes Dataset geeigneter und leichter zu handhaben.
              - Eine vernünftige Benamsung der Controls würde denn Code lesbarer machen. Auch für dich!
              - Wenn ich deinen Code richtig lese kann man beliebig viele billigste Lieferanten anlegen.

              Comment


              • #8
                Noch weitere Fragen

                Danke für die Antworten
                Ralf:
                Danke für die Tipps.
                dt.NewRow() werde ich verwenden.
                Eigentlich möchte ich gerne die gezeigte Eingabemaske auch für die Dateneingabe verwenden und nicht dazu ein weiteres Eingabeformular verwenden. Soll ich dann den Datensatz zuerst mit dt.NewRow() hinzufügen und zum letzten Datensatz gehen; der Anwender kannn dann den Rest ergänzen

                Select * habe nich nur verwendet weil ausnamslos alle Felder in der EIngabemaske verwendet werden.
                Was meinst Du mit "dynamischer Oberfläche"?
                Das mit den billigisten Lieferanten stimmt,. Ich habe alle Validierungen aus dem Code rausgeschnitten damit er nicht zu lange wird.

                Comment

                Working...
                X