DataGridView - Inhalte ansprechen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    DataGridView - Inhalte ansprechen

    Hallo Zusammen,

    Ich habe derzeit ein kleinen Wurm in der Entwicklung meines Programmes, mit dem DataGridView.

    Ich habe 2 alte Funktionen:

    VB.NET-Quellcode

    1. Private Function BerechneDauer(ByRef BeginnStr As String, ByRef EndeStr As String) As Integer
    2. ' gibt die Dauer aus zwei Textfeldern als Integer in Minuten zurück
    3. Dim Dauer1 As Integer
    4. Dim Dauer2 As Integer
    5. Dim Anfang, Ende As Integer
    6. 'ANFANG
    7. 'Stunden Anfang, WICHTIG: Stunden zweistellig!!
    8. Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(BeginnStr, 2))
    9. 'Minuten Anfang, WICHTIG: Minuten zweistellig!!
    10. Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(BeginnStr, 2))
    11. 'Anfang in Minuten umgerechnet
    12. 'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen:
    13. Dim methode As New INIDatei
    14. methode.Pfad = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\Umrechner\settings.ini"
    15. If methode.WertLesen("General", "Methode") = "Dezimal" Then
    16. Anfang = CInt(Dauer1 * 60 + Dauer2 / 100 * 60)
    17. Else
    18. Anfang = Dauer1 * 60 + Dauer2
    19. End If
    20. 'ENDE
    21. 'Stunden Anfang, WICHTIG: Stunden zweistellig!!
    22. Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(EndeStr, 2))
    23. 'Minuten Anfang, WICHTIG: Minuten zweistellig!!
    24. Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(EndeStr, 2))
    25. 'Ende in Minuten umgerechnet
    26. 'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen:
    27. If methode.WertLesen("General", "Methode") = "Dezimal" Then
    28. Ende = CInt(Dauer1 * 60 + Dauer2 / 100 * 60)
    29. Else
    30. Ende = Dauer1 * 60 + Dauer2
    31. End If
    32. 'Dauer vormittag in Minuten
    33. BerechneDauer = Ende - Anfang
    34. End Function
    35. Private Function MinutenInStunden(ByRef Dauer As Integer) As String
    36. ' gibt das Ergebnis als String für die Anzeige und/oder das Abspeichern zurück
    37. Dim Dauer_Stunden As Integer
    38. Dim Dauer_Stunden_Str As String
    39. Dim Dauer_Minuten As Integer
    40. Dim Dauer_Minuten_Str As String
    41. Dauer_Stunden = Dauer \ 60 'ganzzahlige Division
    42. If Dauer_Stunden < 10 Then
    43. Dauer_Stunden_Str = "0" & Convert.ToString(Dauer_Stunden)
    44. Else
    45. Dauer_Stunden_Str = Convert.ToString(Dauer_Stunden)
    46. End If
    47. Dauer_Minuten = Dauer - Dauer_Stunden * 60
    48. If Dauer_Minuten < 10 Then
    49. Dauer_Minuten_Str = "0" & Convert.ToString(Dauer_Minuten)
    50. Else
    51. Dauer_Minuten_Str = Convert.ToString(Dauer_Minuten)
    52. End If
    53. MinutenInStunden = Convert.ToString(Dauer_Stunden_Str) & ":" & Convert.ToString(Dauer_Minuten_Str)
    54. End Function
    55. Private Function MinutenInStundenlohn(ByRef Dauer As Integer) As String
    56. ' gibt das Ergebnis als String für die Anzeige und/oder das Abspeichern zurück
    57. Dim Dauer_Stunden As Integer
    58. Dim Dauer_Stunden_Str As String
    59. Dim Dauer_Minuten As Integer
    60. Dim Dauer_Minuten_Str As String
    61. Dauer_Stunden = Dauer \ 60 'ganzzahlige Division
    62. If Dauer_Stunden < 10 Then
    63. Dauer_Stunden_Str = "0" & Convert.ToString(Dauer_Stunden)
    64. Else
    65. Dauer_Stunden_Str = Convert.ToString(Dauer_Stunden)
    66. End If
    67. Dauer_Minuten = Dauer - Dauer_Stunden * 60
    68. If Dauer_Minuten < 10 Then
    69. Dauer_Minuten_Str = "0" & Convert.ToString(Dauer_Minuten)
    70. Else
    71. Dauer_Minuten_Str = Convert.ToString(Dauer_Minuten)
    72. End If
    73. MinutenInStundenlohn = Convert.ToString(Dauer_Stunden_Str) & "," & Convert.ToString(Dauer_Minuten_Str)
    74. End Function


    Diese Funktionen habe Werte aus Textboxen getrennt. z.B. 12:45.Mithilfe der Funktion gabs dann eine Variabel die den Wert vor dem : beinhaltet und eine den Wert nach dem Doppelpunkt.

    Die Funktionen wurden bei einem Button Klick ausgeführt.

    VB.NET-Quellcode

    1. Private Sub rechnen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rechnen.Click
    2. For Each ctl In Me.Controls.OfType(Of TextBox)()
    3. Console.WriteLine(ctl.Name)
    4. If String.IsNullOrEmpty(ctl.Text) Then
    5. ctl.Text = "00:00"
    6. End If
    7. Next
    8. 'Methode Überpfrüfen
    9. Dim methode As New INIDatei
    10. methode.Pfad = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\Umrecher\settings.ini"
    11. Dim DauerFeld_vormittag(0 To 31) As Integer
    12. Dim DauerFeld_nachmittag(0 To 31) As Integer
    13. Dim i As Integer
    14. Dim Gesamtdauer As Integer
    15. Dim Gesamtdauerlohn As Integer
    16. Dim GesamtdauerStr As String
    17. Dim GesamtdauerStrlohn As String
    18. 'Dauer für vormittag in Minuten im Feld ablegen
    19. DauerFeld_vormittag(0) = BerechneDauer(CustomTextBox1.Text, CustomTextBox2.Text)
    20. DauerFeld_vormittag(1) = BerechneDauer(CustomTextBox5.Text, CustomTextBox6.Text)
    21. DauerFeld_vormittag(2) = BerechneDauer(CustomTextBox9.Text, CustomTextBox10.Text)
    22. DauerFeld_vormittag(3) = BerechneDauer(CustomTextBox13.Text, CustomTextBox14.Text)
    23. DauerFeld_vormittag(4) = BerechneDauer(CustomTextBox17.Text, CustomTextBox18.Text)
    24. DauerFeld_vormittag(5) = BerechneDauer(CustomTextBox21.Text, CustomTextBox22.Text)
    25. DauerFeld_vormittag(6) = BerechneDauer(CustomTextBox25.Text, CustomTextBox26.Text)
    26. DauerFeld_vormittag(7) = BerechneDauer(CustomTextBox29.Text, CustomTextBox30.Text)
    27. DauerFeld_vormittag(8) = BerechneDauer(CustomTextBox33.Text, CustomTextBox34.Text)
    28. DauerFeld_vormittag(9) = BerechneDauer(CustomTextBox37.Text, CustomTextBox38.Text)
    29. DauerFeld_vormittag(10) = BerechneDauer(CustomTextBox41.Text, CustomTextBox42.Text)
    30. DauerFeld_vormittag(11) = BerechneDauer(CustomTextBox45.Text, CustomTextBox46.Text)
    31. DauerFeld_vormittag(12) = BerechneDauer(CustomTextBox49.Text, CustomTextBox50.Text)
    32. DauerFeld_vormittag(13) = BerechneDauer(CustomTextBox53.Text, CustomTextBox54.Text)
    33. DauerFeld_vormittag(14) = BerechneDauer(CustomTextBox57.Text, CustomTextBox58.Text)
    34. DauerFeld_vormittag(15) = BerechneDauer(CustomTextBox61.Text, CustomTextBox62.Text)
    35. DauerFeld_vormittag(16) = BerechneDauer(CustomTextBox65.Text, CustomTextBox66.Text)
    36. DauerFeld_vormittag(17) = BerechneDauer(CustomTextBox69.Text, CustomTextBox70.Text)
    37. DauerFeld_vormittag(18) = BerechneDauer(CustomTextBox73.Text, CustomTextBox74.Text)
    38. DauerFeld_vormittag(19) = BerechneDauer(CustomTextBox77.Text, CustomTextBox78.Text)
    39. DauerFeld_vormittag(20) = BerechneDauer(CustomTextBox81.Text, CustomTextBox82.Text)
    40. DauerFeld_vormittag(21) = BerechneDauer(CustomTextBox85.Text, CustomTextBox86.Text)
    41. DauerFeld_vormittag(22) = BerechneDauer(CustomTextBox89.Text, CustomTextBox90.Text)
    42. DauerFeld_vormittag(23) = BerechneDauer(CustomTextBox93.Text, CustomTextBox94.Text)
    43. DauerFeld_vormittag(24) = BerechneDauer(CustomTextBox97.Text, CustomTextBox98.Text)
    44. DauerFeld_vormittag(25) = BerechneDauer(CustomTextBox101.Text, CustomTextBox102.Text)
    45. DauerFeld_vormittag(26) = BerechneDauer(CustomTextBox105.Text, CustomTextBox106.Text)
    46. DauerFeld_vormittag(27) = BerechneDauer(CustomTextBox109.Text, CustomTextBox110.Text)
    47. DauerFeld_vormittag(28) = BerechneDauer(CustomTextBox113.Text, CustomTextBox114.Text)
    48. DauerFeld_vormittag(29) = BerechneDauer(CustomTextBox117.Text, CustomTextBox118.Text)
    49. DauerFeld_vormittag(30) = BerechneDauer(CustomTextBox121.Text, CustomTextBox122.Text)
    50. 'Dauer für nachmittag in Minuten im Feld ablegen
    51. DauerFeld_nachmittag(0) = BerechneDauer(CustomTextBox3.Text, CustomTextBox4.Text)
    52. DauerFeld_nachmittag(1) = BerechneDauer(CustomTextBox7.Text, CustomTextBox8.Text)
    53. DauerFeld_nachmittag(2) = BerechneDauer(CustomTextBox11.Text, CustomTextBox12.Text)
    54. DauerFeld_nachmittag(3) = BerechneDauer(CustomTextBox15.Text, CustomTextBox16.Text)
    55. DauerFeld_nachmittag(4) = BerechneDauer(CustomTextBox19.Text, CustomTextBox20.Text)
    56. DauerFeld_nachmittag(5) = BerechneDauer(CustomTextBox23.Text, CustomTextBox24.Text)
    57. DauerFeld_nachmittag(6) = BerechneDauer(CustomTextBox27.Text, CustomTextBox28.Text)
    58. DauerFeld_nachmittag(7) = BerechneDauer(CustomTextBox31.Text, CustomTextBox32.Text)
    59. DauerFeld_nachmittag(8) = BerechneDauer(CustomTextBox35.Text, CustomTextBox36.Text)
    60. DauerFeld_nachmittag(9) = BerechneDauer(CustomTextBox39.Text, CustomTextBox40.Text)
    61. DauerFeld_nachmittag(10) = BerechneDauer(CustomTextBox43.Text, CustomTextBox44.Text)
    62. DauerFeld_nachmittag(11) = BerechneDauer(CustomTextBox47.Text, CustomTextBox48.Text)
    63. DauerFeld_nachmittag(12) = BerechneDauer(CustomTextBox51.Text, CustomTextBox52.Text)
    64. DauerFeld_nachmittag(13) = BerechneDauer(CustomTextBox55.Text, CustomTextBox56.Text)
    65. DauerFeld_nachmittag(14) = BerechneDauer(CustomTextBox59.Text, CustomTextBox60.Text)
    66. DauerFeld_nachmittag(15) = BerechneDauer(CustomTextBox63.Text, CustomTextBox64.Text)
    67. DauerFeld_nachmittag(16) = BerechneDauer(CustomTextBox67.Text, CustomTextBox68.Text)
    68. DauerFeld_nachmittag(17) = BerechneDauer(CustomTextBox71.Text, CustomTextBox72.Text)
    69. DauerFeld_nachmittag(18) = BerechneDauer(CustomTextBox75.Text, CustomTextBox76.Text)
    70. DauerFeld_nachmittag(19) = BerechneDauer(CustomTextBox79.Text, CustomTextBox80.Text)
    71. DauerFeld_nachmittag(20) = BerechneDauer(CustomTextBox83.Text, CustomTextBox84.Text)
    72. DauerFeld_nachmittag(21) = BerechneDauer(CustomTextBox87.Text, CustomTextBox88.Text)
    73. DauerFeld_nachmittag(22) = BerechneDauer(CustomTextBox91.Text, CustomTextBox92.Text)
    74. DauerFeld_nachmittag(23) = BerechneDauer(CustomTextBox95.Text, CustomTextBox96.Text)
    75. DauerFeld_nachmittag(24) = BerechneDauer(CustomTextBox99.Text, CustomTextBox100.Text)
    76. DauerFeld_nachmittag(25) = BerechneDauer(CustomTextBox103.Text, CustomTextBox104.Text)
    77. DauerFeld_nachmittag(26) = BerechneDauer(CustomTextBox107.Text, CustomTextBox108.Text)
    78. DauerFeld_nachmittag(27) = BerechneDauer(CustomTextBox111.Text, CustomTextBox112.Text)
    79. DauerFeld_nachmittag(28) = BerechneDauer(CustomTextBox115.Text, CustomTextBox116.Text)
    80. DauerFeld_nachmittag(29) = BerechneDauer(CustomTextBox119.Text, CustomTextBox120.Text)
    81. DauerFeld_nachmittag(30) = BerechneDauer(CustomTextBox123.Text, CustomTextBox124.Text)
    82. 'Gesamtsumme berechnen:
    83. Gesamtdauer = 0
    84. For i = 0 To 30
    85. Gesamtdauer = Gesamtdauer + DauerFeld_vormittag(i)
    86. Gesamtdauer = Gesamtdauer + DauerFeld_nachmittag(i)
    87. Next
    88. GesamtdauerStr = MinutenInStunden(Gesamtdauer)
    89. Dim gethour As New INIDatei
    90. Dim grammatik As String
    91. Dim grammatik1 As String
    92. gethour.Pfad = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\Umrechner\settings.ini"
    93. If CDbl(gethour.WertLesen("General", "Hours")) = 1 Then
    94. grammatik = " Stunde"
    95. grammatik1 = " wurde "
    96. Else
    97. grammatik = " Stunden"
    98. grammatik1 = " wurden "
    99. End If
    100. Dim altestunden = Convert.ToInt32(Microsoft.VisualBasic.Left(GesamtdauerStr, 2))
    101. Dim altemin = Convert.ToInt32(Microsoft.VisualBasic.Right(GesamtdauerStr, 2))
    102. Dim berechnungneuerstd = altestunden - CInt(gethour.WertLesen("General", "Hours"))
    103. ergebnis.Text = "Stunden: " & berechnungneuerstd & ":" & altemin
    104. txtabzug.Text = "Es" & grammatik1 & gethour.WertLesen("General", "Hours") & grammatik & " abgezogen"
    105. gesammt.Text = "Gesammtstunden: " & altestunden & ":" & altemin
    106. For i = 0 To 30
    107. Gesamtdauerlohn = Gesamtdauerlohn + DauerFeld_vormittag(i)
    108. Gesamtdauerlohn = Gesamtdauerlohn + DauerFeld_nachmittag(i)
    109. Next
    110. GesamtdauerStrlohn = MinutenInStundenlohn(Gesamtdauerlohn)
    111. Dim INI As New INIDatei
    112. INI.Pfad = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\Umrechner\settings.ini"
    113. INI.WertSchreiben("Berechnung", "Ergebnis", GesamtdauerStrlohn)
    114. Dim neuerwert As Double = CDbl(GesamtdauerStrlohn) - CDbl(INI.WertLesen("General", "Hours"))
    115. INI.WertSchreiben("Berechnung", "Ueberstunden", CStr(neuerwert))
    116. Dim ininull As New INIDatei
    117. ininull.Pfad = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\Umrechner\settings.ini"
    118. If ininull.WertLesen("General", "NullClear") = "Yes" Then
    119. For Each ctl In Me.Controls.OfType(Of TextBox)()
    120. Console.WriteLine(ctl.Name)
    121. If ctl.Text = "00:00" Then
    122. ctl.Text = ""
    123. End If
    124. Next
    125. End If
    126. lohnrechnen.Enabled = True
    127. End Sub



    Nun möchte ich aber nicht mehr die TextBoxen ansprechen, sondern Die einzelnden Kästchen aus dem DataGridView (31 Reihen, je 4 Spalten)


    Wie aber kann ich jetzt Die Berechnungen darauflegen? Und wie ist es möglich diese Funktion hier auf das DataGridView zu beziehen?

    VB.NET-Quellcode

    1. For Each ctl In Me.Controls.OfType(Of TextBox)()
    2. Console.WriteLine(ctl.Name)
    3. If ctl.Text = "00:00" Then
    4. ctl.Text = ""
    5. End If



    Wenn ich das hinbekommen habe bzw. weiß wie es geht sollte ich den rest eigendlich alleine schaffen. :)

    Liebe Grüße
    Mithilfe der Funktion gabs dann eine Variabel die den Wert vor dem : beinhaltet und eine den Wert nach dem Doppelpunkt.
    schaue dir vorerst einmal folgende Links an:
    DateTimePicker-Steuerelement
    DateTimePicker-Klasse
    DateTime-Struktur
    Hierbei bietet dir das FW moderne Methoden und Eigenschaften, die dir bei solchen Aufgaben bedeutend weiterhelfen...
    Ich verstehe nicht ganz wie mir das weiterhelfen soll VB1963, Ich benötige ja keinen Tag sondern will nur Werte umrechnen und am Ende zusammen Addieren.

    Außerdem glaube ich kaum das Datetime mir sagen kann welche Uhrzeit 12:95 ist oder? :)


    Liebe Grüße
    Außerdem glaube ich kaum das Datetime mir sagen kann welche Uhrzeit 12:95 ist oder?

    Hast du dir die Structur schon einmal angeschaut?

    steht gleich ganz oben in der DateTime-Structure als Einleitung - MSDN schrieb:

    Stellt einen Zeitpunkt dar, der normalerweise durch Datum und Uhrzeit dargestellt wird.
    Er erstellt doch selbst das Projekt - und soll gleich solche Eingaben verhindern.
    Wenn man das DateTimePicker-Steuerelement statt der Textbox hernimmt, dann sind solche Zeitangaben gar nicht möglich, weil der Picker solches nicht zulässt. Damit ersparst man sich dann auch solche Umrechnungen...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    Der Sinn dahinter soll ja aber sein das das Programm die Werte von der Stempelkarte umrechnet und die sind nunmal im hinteren Bereich nur :05 :10 :15 :20 :25 :30 :35 :40 :45 :50 :55 :60 :65 :70 :75 :80 :85 :90 :95 :00

    Die alte Funktion teilt ja diesen String in Dauer1(vor wert 00 - 23), Integer und in Dauer2 (Nachwert). Anschließend werden die Stunden * 60 gerechnet ( Dauer1 * 60 + Dauer2 ) um an den Minuten Wert zu kommen, das selbe dann nocheinmal mit der 2ten Textbox Dauer1 * 60 + Dauer2 / 100 * 60 danach werden die einfach 2 Variabeln Ende - Anfang gerechnet um die übrigen Minuten zu erhalten. Und zu letzt werden diese dann zusammen addiert und in Stunden und Minuten getrennt.

    Beispiel der alten Version:


    Ich versuche ja jeglich erstmal die Funktion so umzuschreiben das er sich den Inhalt nicht mehr aus den TextBoxen bezieht , sonders aus dem DataGridView.

    Besonders wichtig ist dabei diese Funktion hier, doch wie kann ich alle Leeren Zellen des DataGridViews ansprechen?

    VB.NET-Quellcode

    1. For Each ctl In Me.Controls.OfType(Of TextBox)()
    2. Console.WriteLine(ctl.Name)
    3. If ctl.Text = "00:00" Then
    4. ctl.Text = ""
    5. End If



    LG
    also mit einem typisierten Dataset würde man eine Tabelle Arbeiter anlegen, und eine Tabelle Stempelzeiten. Die Monats-Auswahl könnte man mit einem BindingSource-Filter einstellen.
    Wären vlt. 5 Zeilen zum Zusammenrechnen nötig.
    Die Timespan-Struktur kann übrigens sehr fabelhaft mit Bruchteilen von Stunden rechnen (TotalHours As Double).
    @MarvinKleinMusic
    Das es sich hier um industrielle Zeitangaben handelt, hättest du im 1. Post erwähnen können.
    In dem Fall würde ich diese Zeiten als Double angeben - also mit einem Komma...
    Und im DGV-CellFormatting Event werden die Kommas zum Doppelpunkt zur Anzeige gebracht...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()