Announcement

Collapse
No announcement yet.

Initialisieren von Tab Controls

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

  • Initialisieren von Tab Controls

    Hi,

    ich habe ein Problem mit dem Tab Control

    Ich habe 4 Pages auf einem Tabcontrol. über das Databinding der Textboxen auf den Pages werden die Daten gefüllt.
    So weit , so gut.
    Schau ich mir alle Pages an und ändere etwas werden die daten wunderbar verarbeitet und alles ist gut.

    Ändere ich aber nur die daten auf der 1. Page ohne vorher auf die 2. 3. und 4. Seite geschaut zu haben bekomme ich einen Fehler da versucht wir ein Leeres Feld in INTeger zu konvertieren.

    Dieses Feld ist jedoch nicht leer, zumindest nicht wenn ich auf die page gehe.

    Ich müsste eigentlich vom Programm her alle Seiten einmal kurz anzeigen, was natürlich so nicht Sinnvoll ist

    Wie kann ich es schaffen das alle Werte dort stehen wo Sie hingehören auch wenn ich mir die Seiten nicht anzeigen lasse ?


    Gruß Frank

  • #2
    Das sollte so nicht passieren wenn man nicht irgendwas falsch macht.
    Aber ohne Code kann man da nur raten.

    Comment


    • #3
      Das mit dem Code ist so ein Problem
      Die Zuweisung zum Dataset findet ja Grafisch statt , bei den Proberties der Textboxen
      Das ist der Einsieg in die Form


      [highlight=vbnet]
      Public Overloads Sub Show(ByVal Art As String)
      If Art = "" Then
      Neu = True
      Else
      Neu = False
      End If
      If Not Neu Then
      Me.ArtikelTableAdapter.FillByArtNr(MyERPDataSet.Ar tikel, Art)
      End If
      Me.Show()
      Application.DoEvents()
      End Sub
      [/highlight]

      So werden die Daten gelesen, unter (Databindings) (Erweitert) der Textbox wird dann mit dem entsprechenden Feld verknüpft.

      Sonst gibt es keinen relevanten Code denk ich.
      Ich hoffe das hilft weiter.

      Comment


      • #4
        Zumindest wissen wir jetzt das du Dataset/Datatables verwendest. Wenn es keinen weiteren relevanten Code gibt könnte uns vielleicht eine vollständige Fehlermeldung inklusive Stack weiterhelfen.

        Hast du das Problem vielleicht nur in im ~Neu~-Fall? Wenn ja, wie legst du denn einen neuen Datensatz an und wie befüllst du diesen Datensatz mit Defaults? Wenn es denn welche gibt.

        Comment


        • #5
          1. das Application.DoEvents() sollte nicht nötig sein, hat in dem Fall wohl eh keinerlei Auswirkung. Da auf die Abarbeitung von FillByArtNr sowie Me.Show() gewartet wird bis sie abgeschloßen sind, egal wie lange es dauert.
          2. Brauchst du die Neu Variable noch außerhalb dieser Prozedur? Dann könnte man deinen Code noch ein wenig kürzer und lesbarer gestalten.
          3. Zum Problem kann man wie Rafl schon sagt ohne weiteren Code nicht viel sagen!
          Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

          Comment


          • #6
            Hallo Ralf,
            hallo das-d

            Quellcode und Callstack könnt ihr haben. Am Code sieht man dann auch wofür die Variable neu gebraucht wird

            [highlight=vbnet]
            Private Sub PB_Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PB_Save.Click
            Dim EKPreis, VKPreis As Decimal
            Dim Metall As Integer
            EKPreis = CType(TB_EKPreis.Text, Decimal)
            VKPreis = CType(TB_VK_Preis.Text, Decimal)
            Metall = CB_Metall.SelectedIndex
            If Neu Then
            Me.ArtikelTableAdapter.Insert(TB_ArtNr.Text, TB_ArtGrp.Text, TB_ArtRbtGrp.Text, TB_Bezeichnung.Text, TB_Bezeichnung2.Text, CType(TB_EKPreis.Text, Decimal), CType(TB_VK_Preis.Text, Decimal), CType(TB_EKEinheit.Text, Integer), CType(TB_VKEinheit.Text, Integer), Metall, CType(TB_Metallgewicht.Text, Double), CType(TB_MetallIncl.Text, Integer), CType(TB_Minbestand.Text, Integer), CType(TB_MaxBestand.Text, Integer))
            Else
            Me.ArtikelTableAdapter.Update(TB_ArtGrp.Text, TB_ArtRbtGrp.Text, TB_Bezeichnung.Text, TB_Bezeichnung2.Text, EKPreis, VKPreis, CType(TB_EKEinheit.Text, Integer), CType(TB_VKEinheit.Text, Integer), Metall, CType(TB_Metallgewicht.Text, Double), CType(TB_MetallIncl.Text, Integer), CType(TB_Minbestand.Text, Integer), CType(TB_MaxBestand.Text, Integer), TB_ArtNr.Text)
            End If
            Me.Close()
            End Sub
            [/highlight]



            System.InvalidCastException wurde nicht behandelt.
            Message="Ungültige Konvertierung von der Zeichenfolge in Typ Decimal."
            Source="Microsoft.VisualBasic"
            StackTrace:
            bei Microsoft.VisualBasic.CompilerServices.Conversions .ToDecimal(String Value, NumberFormatInfo NumberFormat)
            bei Microsoft.VisualBasic.CompilerServices.Conversions .ToDecimal(String Value)
            bei MyERP_GUI.Artikelkarte.PB_Save_Click(Object sender, EventArgs e) in C:\Users\Frank\Documents\Visual Studio 2008\Projects\MyERP_GUI\MyERP_GUI\Artikelkarte.vb: Zeile 42.
            bei System.Windows.Forms.Control.OnClick(EventArgs e)
            bei System.Windows.Forms.Button.OnClick(EventArgs e)
            bei System.Windows.Forms.Button.OnMouseUp(MouseEventAr gs mevent)
            bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
            bei System.Windows.Forms.Control.WndProc(Message& m)
            bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
            bei System.Windows.Forms.Button.WndProc(Message& m)
            bei System.Windows.Forms.Control.ControlNativeWindow.O nMessage(Message& m)
            bei System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
            bei System.Windows.Forms.NativeWindow.DebuggableCallba ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
            bei System.Windows.Forms.UnsafeNativeMethods.DispatchM essageW(MSG& msg)
            bei System.Windows.Forms.Application.ComponentManager. System.Windows.Forms.UnsafeNativeMethods.IMsoCompo nentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
            bei System.Windows.Forms.Application.ThreadContext.Run MessageLoopInner(Int32 reason, ApplicationContext context)
            bei System.Windows.Forms.Application.ThreadContext.Run MessageLoop(Int32 reason, ApplicationContext context)
            bei System.Windows.Forms.Application.Run(ApplicationCo ntext context)
            bei Microsoft.VisualBasic.ApplicationServices.WindowsF ormsApplicationBase.OnRun()
            bei Microsoft.VisualBasic.ApplicationServices.WindowsF ormsApplicationBase.DoApplicationModel()
            bei Microsoft.VisualBasic.ApplicationServices.WindowsF ormsApplicationBase.Run(String[] commandLine)
            bei MyERP_GUI.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
            bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
            bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
            bei Microsoft.VisualStudio.HostingProcess.HostProc.Run UsersAssembly()
            bei System.Threading.ThreadHelper.ThreadStart_Context( Object state)
            bei System.Threading.ExecutionContext.Run(ExecutionCon text executionContext, ContextCallback callback, Object state)
            bei System.Threading.ThreadHelper.ThreadStart()
            InnerException:




            Die Unterbrechung ist in Zeile 4 beim EK-Preis. Die Konvertierungen sind herrausgezogen um festzustellen welchen Feld es genau war.
            Das dies unnötig ist weiss ich, wird auch korrigiert wenn der Code läuft


            Diese Meldung kommt NUR wenn ich speicher und hab mir vorher nicht die Pages 2,3 und 4 angesehn.
            Schau ich mir die an , ist der Wert gefüllt und alles ist super



            Gruß Frank

            Comment


            • #7
              warum lässt du nicht den TableAdapter sorge tragen wann ein Insert und wann ein Update zu passieren hat. Dafür hat jeder Eintrag in einer DataTable einen sogenannten RowState. Der verrät dem TableAdapter ob der Eintrag neu ist oder ob er aktualisiert wurde ...

              Arbeitest du mit einer BindingSource Komponente? Wohl eher nicht. All diese Dinge die du hier manuell machst würden dir Abgenommen ...
              Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

              Comment


              • #8
                Außerdem haben wir jetzt endlich den Hinweis, dass das Problem an der Formatierung des Textes in TB_EKPreis und vermutlich ebenso in TB_VKPreis liegt. Wie und wo werden diese Controls bei einem neuen Datensatz initialisiert? Vielleicht hast du es in eines der TabPage-Ereignisse gesetzt statt in eines der DataTable/TableAdapter-Ereignisse?

                Merke: Was zu den Daten gehört (wie Default-Werte), muss bei den Daten bearbeitet werden und nicht in der GUI.

                Wie das-d schon sagte, würdest du solche Probleme vermeiden, wenn du konsequent die Möglichkeiten der Datenbindung benutzen würdest. Wenn du schon so ein Code-Monster wie den TableAdapter verwendest, dann solltest du das, was er anbietet, auch ausnutzen.

                Zur Einführung in die Datenverarbeitung mit .NET siehe auch openbook visualbasic Kap. 23 ff.

                Gruß Jürgen
                Zuletzt editiert von Jürgen Thomas; 09.03.2010, 10:11. Reason: typo

                Comment


                • #9
                  hmm, nun wie oben beschrieben hab ich die textboxen über Databinding / Erweitert mit dem Feld Verknüpft .
                  Dies geschieht über ArtikelBindingSource - Feldname.


                  Wie kann ich nun das Update/Insert machen ohne es
                  1. Explizit auszuwählen
                  2. Alle felder anzugeben ?


                  Ich programmier vielleicht schon zu lange alles aus als das ich diese Feature finden, geschweige denn suchen würde


                  Gruß Frank

                  Comment


                  • #10
                    http://msdn.microsoft.com/de-de/libr...33(VS.80).aspx

                    nur ein TableAdapter.Update sollte genügen. Den neuen Datensatz legt ja eigentlich die Bindingsource schon für dich an oder? Du solltest halt dann gleich bei Show deinen neuen Datensatz anlegen. Dann wird dieser neue leere Datensatz halt noch aktiviert und dann ist dein "leerer" "neuer" Datensatz auch gleich an die Textboxen gebunden und du brauchst nichts mehr zu casten, das übernimmt dann die Bindingsource respektive dem Tableadapter

                    ich empfehle dir das was Jürgen dir an Lektüre empfohlen hat zu Herzen zu nehmen und umzusetzen, damit wird deine Software ein ganzes Stück besser
                    Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                    Comment


                    • #11
                      Mir fällt gerade noch ein: BindingSource.EndEdit darf vor dem Speichern nicht vergessen werden; erst dann werden Eingaben in die DataTable übertragen und dort abgeschlossen. Jürgen

                      Comment


                      • #12
                        Ich danke euch,

                        grad der Code der MSDN Seite hat geholfen.
                        Manchmal ignoriere ich die Möglichkeiten die ich habe einfach

                        Ich werde das Open Book mal ziemlich genau lesen .

                        Dieses kleine Projekt dient für mich dazu um mich mit den Möglichkeiten vertraut zu machen.

                        Hab wieder was gelernt


                        Gruß Frank

                        Comment

                        Working...
                        X