Announcement

Collapse
No announcement yet.

DGV - Expression und Datediff

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

  • DGV - Expression und Datediff

    Guten Tag,
    ich habe foglendes Problem. Ich möchte gern in mein DGV eine Expressionspalte einfügen. die die differenz von spalte 1 und 2 errechnet. (Datum).

    dt_zeiten = New DataTable("Zeiten")
    ' *** Expression Collum erstellen (Differenz zwischen start und endzeit)
    dt_zeiten.Columns.Add("diff", GetType(Date))
    dt_zeiten.Columns("diff").Expression = "DateDiff('n', ZStartzeit, ZEndzeit)"

    Jedoch bekomme ich immer wieder eine Fehlermeldung.

    diese besagt "der ausdruck enthält undefinierten Funktionsaufruf Datediff()

  • #2
    Hallo,

    woher kommt die DateDiff-Funktion?

    Tatsächlich darfst Du in den Expression-String nur das einbinden, was laut SDK-Doku/MSDN möglich ist. Wenn Du die Differenz zwischen Start und Ende haben willst, muss das so aussehen (in der Annahme, dass das die Namen der Spalten sind):
    Code:
    dt_zeiten.Columns("diff").Expression = "ZEndzeit - ZStartzeit"
    Eventuell muss noch CONVERT hinzugefügt werden, wenn Du eine spezielle Formatierung haben willst. Das Ergebnis einer Differenz zweier DateTime-Werte ist ein TimeSpan, kein DateTime.

    Gruß Jürgen

    PS. Bitte markiere Code als solchen (durch den #-Button), das liest sich besser. Noch schöner wäre "[highlight=vbnet]", aber dafür gibt es keinen Button.

    Comment


    • #3
      Erstmal danke für deine Antwort.

      Jetzt hab ich das Problem, das er die ZStartzeit nicht als Spalte findet.
      Diese ist aber richtig geschrieben.

      // edit

      ok klappt nun
      bekomm jetzt aber die Fehlermeldung das ich die Operation " - " nicht zwischen datetime typen ausführen kann.
      Zuletzt editiert von c-Jay; 09.02.2009, 17:14.

      Comment


      • #4
        Originally posted by c-Jay View Post
        bekomm jetzt aber die Fehlermeldung das ich die Operation " - " nicht zwischen datetime typen ausführen kann.
        Das tut mir leid, dann geht es mit einer berechneten Spalte offensichtlich überhaupt nicht.

        Mir fällt kein einfacher Ersatz ein. Vielleicht ist etwas mit manueller Berechnung und einem Ereignis bei DataTable oder DataGridView oder BindingSource geeignet.

        Jürgen

        Comment


        • #5
          vielleicht hilft es:

          "rechnen" mit Date-Werten:

          Code:
          
          Dim timeStart1 As DateTime
          Dim timeStart2 As DateTime
           
          Dim timeDiff As TimeSpan
          Dim mDay AsInteger
          Dim mMillisecond As Int64
           
          timeStart2 = DateTime.Now
          timeStart1 = CType("1.1.1995", DateTime)
           
          timeDiff = timeStart2.Subtract(timeStart1)
           
          mDay = CType(timeDiff.TotalDays, Integer)
          mMillisecond = CType(timeDiff.TotalMilliseconds, Int64)
           
          

          Comment


          • #6
            Hallo cb4866,

            das Rechnen mit DateTime-Werten ist grundsätzlich überhaupt kein Problem: In C# kann ich einfach zwei DateTime-Werte subtrahieren, in VB.NET geht das vermutlich genauso. Das Problem liegt hier darin, dass die Möglichkeiten, die innerhalb der Expression-Eigenschaft zur Verfügung stehen, offensichtlich beschränkt sind.

            Jürgen

            Comment


            • #7
              Hallo Jürgen,

              ich hab mich "bloß so" ein wenig mit dem Thema beschäftigt und bin auf etwas gestoßen was mich interessiert: Die Funktion "fnTimeSpan" im
              Click Ereignis eines BindingSource-gebundenen BindingNavigators eingebaut - erzeugt eine unerwünschte + leere DataRow im DataGridView.

              das DataTable-Objekt "dtDateBerechnet" hat 4 Columns: timeStart, timeEnde, timeDifferenz und guid (als Schlüssel).

              unten die funktionstüchtige ToolstripButton-Click Variante.

              Gruß
              Christian

              [highlight=vbnet]
              Public Class frmKalenderTest

              Private timeStart As DateTime
              Private guidKey As System.Guid
              Private mSecond As Int64

              Private Function fnTimeSpan() As Boolean
              Dim timeEnde As New DateTime
              Dim timeDiff As New TimeSpan
              timeEnde = DateTime.Now()
              timeDiff = timeEnde.Subtract(timeStart)
              mSecond = CType(timeDiff.TotalSeconds, Integer)
              guidKey = System.Guid.NewGuid()

              Me.DataSet.dtDateBerechnet.AdddtDateBerechnetRow(timeStart, timeEnde, mSecond, guidKey.ToString)
              End Function

              Private Sub frmKalenderTest_Load(ByVal sender As Object, _
              ByVal e As System.EventArgs) _
              Handles Me.Load
              timeStart = DateTime.Today.Add(New TimeSpan(0, 8, 0, 0, 0))
              fnTimeSpan()
              End Sub

              Private Sub toolStripButton_AddTime_Click(ByVal sender As System.Object, _
              ByVal e As System.EventArgs) _
              Handles tsBtn_AddTime.Click
              fnTimeSpan()

              End Sub
              End
              Class
              [/highlight=vbnet]
              Zuletzt editiert von cb4866; 11.02.2009, 16:50.

              Comment

              Working...
              X