Announcement

Collapse
No announcement yet.

Falscher Inhalt in einer Form

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

  • Falscher Inhalt in einer Form

    Hallo zusammen,

    ich möchte mit einem Button in Form1 eine Form2 visible schalten, und zwar so:

    [Highlight=vb.net]Private Sub Button205_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button205.Click

    Form2.Visible = True

    End Sub[/Highlight]

    In der Form2 passiert fast nichts, nämlich:

    [Highlight=vb.net]Public Class Form2

    Private Sub DateTimePicker1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateTimePicker1.ValueChanged

    For i As Short = 1 To 101

    If DateTimePicker1.Value = Form1.Controls(String.Format("DateTimePicker{0}", i)).Text Then


    End If

    Next

    End Sub
    End Class[/Highlight]

    Bis zu der Zeile mit dem "IF" funktioniert das auch. Aber dann springt das Programm zurück zum Aufruf in Button205 und bringt die Fehlermeldung:

    "Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Excepti-on.InnerException. Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt"

    Wie muss dass denn richtig heißen, wenn ich jewiels die 2 DateTimepicker vergleichen will?

    vG

    fredyx

  • #2
    Hi,

    von Form2 kann standardmäßig nicht auf die Steuerelemente in Form1 zugegriffen werden, da diese als private Member von Form1 deklariert sind.

    Suche nach Zugriff auf andere Form oder so was ähnliches -> wurde schon sehr oft behandelt.

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

    Comment


    • #3
      Hallo Gü,

      also grundsätzlich scheint das doch zu funktionieren, dass der Zugriff auf ein Steuerelement einer andern Form möglich ist, denn folgendes Beispiel klappt ja.

      Klick auf Button2 öffnet Form2.

      [highlight=vb.net]
      Public Class Form1

      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As Sys-tem.EventArgs) Handles Button2.Click

      Form2.Visible = True

      End Sub

      Private Sub DateTimePicker2_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateTimePicker2.ValueChanged

      End Sub
      End Class[/highlight]

      1. Klick auf Button 1 überträgt den Wert von DTP 2 aus Form 1 in den DTP 1 von Form 2 und zeigt ihn auch an!!
      Der 2. Klick auf Button 1 in Form2 zeigt die MSGBOX.

      [highlight=vb.net]
      Public Class Form2

      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As Sys-tem.EventArgs) Handles Button1.Click

      If DateTimePicker1.Value = Form1.DateTimePicker2.Value Then

      MsgBox("hurra!!", , )

      End If

      DateTimePicker1.Value = Form1.DateTimePicker2.Value

      End Sub
      End Class[/highlight]

      Und das geht sogar, obwohl DTP 2 in Form1 in einer Groupbox steht!!


      Wenn ich aber die IF-Ziele ersetze durch:

      [highlight=vb.net]
      Dim i As Short = 2

      If DateTimePicker1.Value = Form1.GroupBox1.Controls(String.Format("datetimepi cker{0}", i)).Text Then[/highlight]

      oder ohne Groupbox1 durch:

      [highlight=vb.net]
      Dim i As Short = 2

      If DateTimePicker1.Value = Form1.Controls(String.Format("datetimepicker{0}", i)).Text Then[/highlight],

      dann kann da nach dem 2. Klicken auf Button1 keine Gleichheit festgestellt werden.
      Es kommt aber auch nicht mehr zu einer Fehlermeldung!!!

      Fällt dir da was auf, das ich korrigieren muss, damit die Gleichheit der 2 Werte erkannt wird?

      vG

      fredyx

      Comment


      • #4
        Hallo Gü,

        HURRA ich hab's!!

        Im DTP 2 in Form 1 stand die Eigenschaft "Value" mit Uhrzeitangabe drinn.

        Das hat die 2. Version der IF-Zeile wohl anders interpretiert als die erste.

        Gute Nacht und vG bis zum nächsten mal.

        fredyx

        Comment


        • #5
          Hi Friedhelm,

          als Anmerkung:
          Es kann zu Problemen führen wenn Daten und User Interface (UI) gemischt bzw. gemeinsam implementiert werden. Was ist wenn sich der Aufbau deiner Form ändern soll/muss?

          Besser wäre es eine Datenschicht und ein Präsentationsschicht zu haben. D.h. alle Daten sind in eigenen Klasse vorhanden. Dort sind auch Methoden für Vergleiche, etc.
          In eigenen Klassen - den Forms - werden die Daten nur dargestellt. Alle Manipulationen an den Daten werden von der Präsentationsschicht ledigliche an die Datenschicht weitergeleitet und dort geändert.
          Somit ist das Herz der Anwendung (die Daten) unabhängig von der Präsentationsschicht und diese kann leicht getauscht werden. Zb von Winforms auf ASP.net.

          Hört sich aufs erste ein wenig aufwändiger an, aber wenn du dich an diese Denkweise erst mal gewöhnt hast gibts nichts mehr anderes.

          Konkret soll das heißen:
          Erstell eine Klasse in der die Datumswerte stehen - eine Liste.
          Von der Form aus wird dann eine Methode in dieser Klasse aufgerufen dass diese Liste und eine weitere Liste vergleicht.
          Zum vereinfachten darstellen kann über BindingSource-Steuerelemente die Datenschicht an die Präsentationschicht gebunden werden.

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

          Comment


          • #6
            Was mir noch aufgefallen ist, du vergleichst Äpfel mit Birnen.
            [highlight=vbnet]If DateTimePicker1.Value = Form1.Controls(String.Format("datetimepicker{0}", i)).Text Then [/highlight]
            Das kann eine ganze Zeit gut gehen (wenn Du im DateTimePicker die CustomFormat-Eigenschaft setzt), aber ich würde möglichst die gleichen Eigenschaften abfragen. Also beide .value oder beide .text

            Ich habe mit dem DateTimePicker noch nichts gemacht, deswegen weiß ich nicht ob .value und .text immer identisch sind, aber gerade bei so einem Element kann es sein das es durch die regionalen Einstellungen beinflusst wird und z.B. der .text entsprechend umformatiert wird während das .value in jedem Setting den gleichen Wert hat.

            [EDIT:]
            Ich habe es gerade mal auf die Schnelle getestet .value und .text liefern definitiv unterschiedliche Werte.

            .value: 29.10.2008 10:37:40
            .text: Mittwoch, 29. Oktober 2008

            Gruß Womble
            Zuletzt editiert von Womble; 29.10.2008, 11:46.

            Comment


            • #7
              Originally posted by Womble View Post
              Ich habe es gerade mal auf die Schnelle getestet .value und .text liefern definitiv unterschiedliche Werte.

              .value: 29.10.2008 10:37:40
              .text: Mittwoch, 29. Oktober 2008

              Gruß Womble

              Hallo Womble, ich weiß gar nicht, wie Du das getestet hast, weil ein DatetimePicker die Eigenschaft "Text" überhaupt nicht hat.

              vG

              fredyx

              Comment


              • #8
                Originally posted by fredyx View Post
                Hallo Womble, ich weiß gar nicht, wie Du das getestet hast, weil ein DatetimePicker die Eigenschaft "Text" überhaupt nicht hat.
                Nanu, ich kann in meiner SDK-Doku unter DateTimePicker-Member dies lesen:
                Text
                Überschrieben. Ruft den diesem Steuerelement zugeordneten Text ab oder legt diesen fest.
                Jürgen

                Comment


                • #9
                  Originally posted by Jürgen Thomas View Post
                  Nanu, ich kann in meiner SDK-Doku unter DateTimePicker-Member dies lesen:

                  Jürgen
                  Die Info zu TEXT ist ja nicht falsch.
                  Ich stelle nur fest, wenn ich in einer Form einen DTP anklicke, dann wird zwar Value aber nicht Text als Eigenschaft angezeigt.

                  Inzwischen habe ich aber selber auch so getestet:
                  [highlight=vb.net]
                  If DateTimePicker1.Value = LaborwerteFo.GroupBox1.Controls(String.Format("dat etimepicker{0}", i)).Text Then
                  ' GroupBox1. kann hier auch fehlen
                  Dim q As String
                  Dim r As Date
                  Dim s As DateTime
                  q = LaborwerteFo.GroupBox1.Controls(String.Format("dat etimepicker{0}", i)).Text
                  r = LaborwerteFo.GroupBox1.Controls(String.Format("dat etimepicker{0}", i)).Text
                  s = LaborwerteFo.GroupBox1.Controls(String.Format("dat etimepicker{0}", i)).Text[/highlight]

                  Wenn ich mir dann bei einem STOP an dieser Stelle die Variablen ansehe, dann wird angezeigt:

                  für DateTimePicker1.value und r und s

                  #1/13/2006#

                  für q

                  "13.01.2006"

                  und der Vergleich hinter IF ergibt an der richtigen Stelle auch ein TRUE.

                  Ich muss aber noch dazu sagen, dass ich bei dem DTP für die Eigenschaft FORMAT = short eingestellt habe, evtl. spielt das ja auch noch eine Rolle!!

                  vG

                  fredyx

                  Comment

                  Working...
                  X