XML-Datei für Kalender

  • WPF

SSL ist deaktiviert! Aktivieren Sie SSL für diese Sitzung, um eine sichere Verbindung herzustellen.

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    XML-Datei für Kalender

    Hallo Gemeinde benötige mal Eure Meinung.
    Habe ein funktionierenden Kalender für kleinen Handwerksbetrieb welcher seit Jahren funktioniert. Dieser soll jetzt mit WPF neu enstehen.


    Zur Zeit funkt. es so: In die erste Spalte wird das heutige Datum -50 Tage und +365 Tage über For Next eingelesen und gefärbt.
    Jeder Mitarbeiter hat eine eigene XML-Datei die dann jeweils in die weiteren Spalten eingelesen werden.
    XML-Datei:

    XML-Quellcode

    1. <Daten>
    2. <Eintrag ID="Montag, 2. Oktober 2017">
    3. <Zelltext>Urlaub</Zelltext>
    4. </Eintrag>
    5. <Eintrag ID="Montag, 14. August 2017">
    6. <Zelltext>Baumann </Zelltext>
    7. </Eintrag>

    Die Einträge werden mit der ID mit der ersten Spalte verglichen und jeweils eingetragen, gespeichert und geändert.

    Jetzt wollte ich das das Ganze in WPF und Datenbindung machen und nicht mehr über For/Next. Datum (1.Spalte) in eine XML-Tabelle, jeden Mitarbeiter in eine XML-Tabelle alles in ein Dataset
    und dann die Spalten des Datagrids an das Dataset binden.
    Wer hat einen Lösungsansatz?
    Hallo Thomi

    Was hast du denn bis jetzt??
    ​Wie liest du die XML aus? Hast du bereits eine ViewModel Klasse? Also eine klasse an die dein Kalender gebunden wird.
    ​Wenn wir wissen was du bereits hast können wir das weitere Vorgehen ja besprechen.

    ​Ich kann dir auch einen fertigen Kalender bauen, aber der Lerneffekt würde ja völlig ausbleiben oder?
    ​Falls du noch nix hast (bezweifle ich, weil die App läuft ja bereits als WinForms App. Also liest du zumindest die XML in Klassen ein.) Gib bescheid, dann können wir es ja Schritt für Schritt durchgehen.

    Grüße
    ​Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Hi Sascha, Danke für Deine schnelle Antwort. Den Kalender will ich schon selbst bauen, aber Deine Hilfe nehme ich gern an.

    Also ich Versuch Dir mal den relevanten Code zu posten: (Nicht lachen, da ist bestimmt nicht alles perfekt.) :P
    Im Load:

    VB.NET-Quellcode

    1. cDGV.y_dgvEinlesen(sPfadXMLDatenKalender, sDateiIni, nZeileHeute, dgvKalender, False) 'DGV Datum, KW, Feiertage... Grundaussehen einlesen
    2. cDGV.y_dgvDatenEinlesenKomplett(sPfadXMLDatenKalender, sDateiIni, dgvKalender, False) 'Daten einlesen


    Klasse DGV

    VB.NET-Quellcode

    1. Public Sub y_dgvEinlesen(ByVal _sPfadXMLDatenKalender As String, ByVal _sDateiIni As String, ByVal _ZeileHeute As Integer, ByVal dgvKalender As DataGridView, ByVal lDrucken As Boolean)
    2. Dim sTag As String
    3. Dim IniList As New List(Of String)
    4. Dim nzaehlerZeile As Integer = 0
    5. Try
    6. If lDrucken = False Then
    7. IniList = cXML.y_MitarbeiterIniAuslesen(_sPfadXMLDatenKalender & "\" & _sDateiIni)
    8. Else
    9. IniList.Add("Dummy")
    10. IniList.Add(_sDateiIni)
    11. End If
    12. dgvKalender.Columns.Clear() 'Komplette Spalte löschen
    13. dgvKalender.Columns.Add("Datum", "Datum") 'Datumsspalte als 1. anlegen
    14. For nZaehler = 1 To IniList.Count - 1 'wegen Dummy 1 To... Spalten mit IniMitarbeiter anlegen
    15. dgvKalender.Columns.Add(IniList(nZaehler), IniList(nZaehler))
    16. Next
    17. dgvKalender.Columns.Add("KW", "KW") ' Spalte Kalenderwoche als letztes anlegen
    18. For nDatumszaehler = -_ZeileHeute To 500
    19. dgvKalender.Rows.Add()
    20. dgvKalender.RowHeadersWidthSizeMode = CType(False, DataGridViewRowHeadersWidthSizeMode)
    21. sTag = Now.AddDays(nDatumszaehler).ToLongDateString
    22. dgvKalender.Rows(nzaehlerZeile).Cells(0).Value = sTag 'Datumsstring für 1.Spalte
    23. dgvKalender.Rows(nzaehlerZeile).Cells("KW").Value = cDatum.DateToWeek(Convert.ToDateTime(dgvKalender.Rows(nzaehlerZeile).Cells(0).Value)).ToString.Substring(4) 'Kalenderwoche einlesen
    24. If sTag.StartsWith("Samstag") Then ' Or cDatum.StartsWith("Sonntag")
    25. dgvKalender.Rows(nzaehlerZeile).DefaultCellStyle.BackColor = Color.LightSalmon
    26. ElseIf sTag.StartsWith("Sonntag") Then
    27. dgvKalender.Rows(nzaehlerZeile).DefaultCellStyle.BackColor = Color.DarkOrange
    28. End If
    29. '!!!!!!!!FESTE FEIERTAGE!!!!!!! cTagMonat aus sTag extrahieren und Zeilen färben
    30. Dim cTagMonat As String = Trim(sTag.Substring(sTag.IndexOf(" "), sTag.Length - sTag.IndexOf(" ") - 5))
    31. Select Case cTagMonat
    32. Case ("1. Januar")
    33. dgvKalender.Rows(nzaehlerZeile).DefaultCellStyle.BackColor = Color.DarkOrange
    34. dgvKalender.Rows(nzaehlerZeile).Cells("KW").Value = "Neujahr"
    35. Exit Select
    36. Case ("31. Dezember")
    37. dgvKalender.Rows(nzaehlerZeile).DefaultCellStyle.BackColor = Color.DarkOrange
    38. dgvKalender.Rows(nzaehlerZeile).Cells("KW").Value = "Silvester"
    39. Exit Select
    40. Case ("6. Januar")
    41. dgvKalender.Rows(nzaehlerZeile).DefaultCellStyle.BackColor = Color.DarkOrange
    42. dgvKalender.Rows(nzaehlerZeile).Cells("KW").Value = "Heilige 3. Könige"
    43. Exit Select
    44. 'Weitere Feiertage
    45. End Select
    46. '!!!!!!!!!!Variable Feiertage!!!!!!!!!!!!!!!!
    47. Dim sJahr As String = Trim(sTag.Substring(sTag.LastIndexOf(" ") + 1, 4))
    48. Dim sOsterSonntag As String = cDatum.y_OsterSonntag(CInt(sJahr)).ToLongDateString 'Osterfunktion
    49. Dim VarFeiertage As List(Of String) = cDatum.y_VarFeiertage(CDate(sOsterSonntag))
    50. Select Case sTag
    51. Case sOsterSonntag
    52. dgvKalender.Rows(nzaehlerZeile).DefaultCellStyle.BackColor = Color.DarkOrange
    53. dgvKalender.Rows(nzaehlerZeile).Cells("KW").Value = "Ostersonntag"
    54. Exit Select
    55. Case VarFeiertage(0)
    56. 'frmStart.dgvKalender.Rows(nzaehlerZeile).DefaultCellStyle.BackColor = Color.LightSalmon
    57. dgvKalender.Rows(nzaehlerZeile).Cells("KW").Value = "Rosenmontag"
    58. Exit Select
    59. Case VarFeiertage(1)
    60. 'frmStart.dgvKalender.Rows(nzaehlerZeile).DefaultCellStyle.BackColor = Color.LightSalmon
    61. dgvKalender.Rows(nzaehlerZeile).Cells("KW").Value = "Faschingsdienstag"
    62. Exit Select
    63. 'Weitere Feiertage
    64. End Select
    65. dgvKalender.RowTemplate.Height = 100
    66. nzaehlerZeile += 1
    67. Next
    68. 'Next
    69. 'Weiterer Formatierungscode
    70. '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Einlesen KalenderDaten
    71. 'End Sub
    72. '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Ende Einlesen Kalenderdaten
    73. Catch ex As Exception
    74. MessageBox.Show("Es ist ein Fehler aufgetreten in classDGV_ y_dgvEinlesen " + ex.Message, "Achtung", MessageBoxButtons.OK, MessageBoxIcon.Error)
    75. End Try
    76. End Sub


    Und dann die Daten einlesen:

    VB.NET-Quellcode

    1. Public Sub y_dgvDatenEinlesenKomplett(ByVal _sPfadXMLDatenKalender As String,
    2. ByVal _sDateiIni As String,
    3. ByVal dgvKalender As DataGridView,
    4. ByVal lDrucken As Boolean,
    5. Optional nAnzahlAlt As Integer = 0)
    6. Dim IniList As New List(Of String)
    7. Dim KalenderDaten As List(Of String)
    8. Try
    9. If lDrucken = False Then
    10. Application.DoEvents()
    11. IniList = cXML.y_MitarbeiterIniAuslesen(_sPfadXMLDatenKalender & "\" & _sDateiIni)
    12. Else
    13. IniList.Add("Dummy")
    14. IniList.Add(_sDateiIni)
    15. End If
    16. 'IniList = cXML.y_MitarbeiterIniAuslesen(_sPfadXMLDatenKalender & "\" & _sDateiIni) 'Ursprung
    17. For nzaehlerSpalte = 1 To IniList.Count - 1 '1 wegen Dummy
    18. Application.DoEvents()
    19. KalenderDaten = cXML.y_xmlDGVZeile(_sPfadXMLDatenKalender & "\" & IniList(nzaehlerSpalte) & ".xml", False) 'False Daten die älter sind nicht löschen
    20. Dim ListZeile As List(Of String)
    21. Dim Spaltenname As String = IniList(nzaehlerSpalte)
    22. For Each Datensatz In KalenderDaten
    23. ListZeile = RueckgabelisteTrennen(Datensatz) 'Listzeile 0=Datum, 1=Zelltext, 2=Auswahl, 3=Anzahl
    24. If ListZeile(1) <> "" Then
    25. For nzaehlerZeile = 0 To dgvKalender.RowCount - 2
    26. 'dgvKalender.Rows(nZaehlerZeile).Cells(nzaehlerSpalte).Style.BackColor = Color.White
    27. If ListZeile(0) = dgvKalender.Item(0, nzaehlerZeile).Value.ToString Then
    28. dgvKalender.Rows(nzaehlerZeile).Cells(Spaltenname).Value = ListZeile(1)
    29. '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    30. ' Weiterer Formatierungscode für Farbe Urlaub, Lehrgang usw.
    31. Next
    32. End If
    33. 'dgvKalender.Columns.Item(dgvKalender.CurrentCell.ColumnIndex).Name
    34. End If
    35. Next
    36. End If
    37. Next
    38. Next
    39. Catch ex As Exception
    40. MessageBox.Show("Es ist ein Fehler aufgetreten in dgvDatenEinlesenKomplett " + ex.Message, "Achtung", MessageBoxButtons.OK, MessageBoxIcon.Error)
    41. End Try
    42. End Sub



    So das wars eigentlich, habe versucht nur den wichtigen Code zu Kopieren.

    Freue mich auf eine Antwort
    Grüße aus Nürnberg. :)
    Hi,
    ja die Mitarbeiter XML ist fix:
    <Daten>
    <Eintrag ID="Montag, 2. Oktober 2017">
    <Zelltext>Urlaub</Zelltext>
    </Eintrag>
    <Eintrag ID="Montag, 14. August 2017">
    <Zelltext>Baumann </Zelltext>
    </Eintrag>
    </Daten>
    Die Eintrag ID wird mit der ersten Spalte verglichen, und dann in der richtigen Spalte für den jeweiligen Mitarbeiter angezeigt.
    Mein Problem ist das Datum in Spalte 0 wie ich das flexibel in eine Tabelle bekomme (-50 bis +365 Tage vom heutigen Datum)
    Es sollte ein Datagrid sein, da ich noch über eine Detailansicht nachdenke, bin aber für Alternativen offen.

    Bis jetzt haben wir 10 Mitarbeiter und die Geschwindikeit für das Einlesen geht noch.

    Grüße Thomas
    Hallo Thomi

    Heute bin ich dazu gekommen. Wichtig. Bitte nicht als ReadyToRun sehen. Soll nur ein Beispiel sein.
    ​Auch die Optik und die Logik ist nur ein schnell, schnell Beispiel. Kannst natürlich anpassen.

    ​Meine Überlegung war ja. Eine Person kann ja mehrere Termin haben. Oder etwa nicht?
    ​Ich habe es nun so gelöst das ich dir ein UserControl gemacht habe. Inkl. Datumsauswahl. Kannst du je wegnehmen. Ich dachte nur. Warum 50+356 Tage hineinladen.
    ​Unnötig wenn es nur Termine bis 10 oder 13 Tage in der Zukunft gibt. So wie in meinem Ansatz (!!) wäre es etwas dynamischer. Z.b. könntest du mit meinem ViewModel ganz leicht ermitteln wie weit der letzte Termin in die Zukunft geht und dieses Datum vorauswählen und der User kann wenn er will auch ein anderes Datum eintragen. Ich habe in ein normales Grid die Columns und die Rows dynamisch erzeugt. So bist du auch recht flexibel mit der Optik.

    ​Ist jetzt nicht zu 100% WPF Style da recht viel über Code Behind gelöst. Aber ich wollte jetzt hier für ein Beispiel nicht anfangen zig Stunden was zu basteln wenn ich nicht mal weis ob es das ist was du brauchst (sorry).
    ​Wenn dies ein wirklich wichtiges Control ist, könnten wir gemeinsam ja was viel bessere ausarbeiten.

    Anbei die Solution und hier ein Bild.
    ​In der Hoffnung dir ein wenig geholfen zu haben..

    ​PS: An die anderen, bitte nicht steinigen, habe ich gerade schnell runtergeschrieben.
    Grüße
    ​Sascha
    Bilder
    • calSS.PNG

      33,03 kB, 466×596, 27 mal angesehen
    Dateien
    • WpfCalendar.zip

      (70,35 kB, 8 mal heruntergeladen, zuletzt: )
    If _work = worktype.hard Then Me.Drink(Coffee)
    Also Sascha, erst mal vielen Dank für Deine Mühe. Zur Zeit kann man natürlich mehrere Termine pro Mitarbeiter eintragen.
    Die XML sieht dann so aus:

    XML-Quellcode

    1. <Eintrag ID="Montag, 14. August 2017">
    2. <Zelltext>8:00 Uhr Meier 10:00 Uhr Pause 11:00 Feierabend</Zelltext>
    3. </Eintrag>

    Wir benötigen die die größe Zeitspanne weil wir großen Vorlauf haben bzw. langfristige Termine planen müssen. Z.zt. habe ich es sogar auf +500 Tage hochgeschraubt geht gerade noch mit der Ladezeit (1* am Tag).

    Jetzt werde ich erst mal versuchen den Code zu verstehen. Melde mich auf jeden Fall bei Dir.

    Grüße Thomas und nochmal vielen Dank. :thumbsup:
    Hallo

    Verstehe ich. Aber die 500 Tage benötigst du nicht auf einmahl. Man kann das ganze auch so gestallten das Nachgeladen wird beim Scrollen.

    Aber in solch einem Fall würde ich dir sowieso zu einer ganz anderen Art der Darstellung raten.

    Wenn es um solch einen Zeitraum geht, ist ein Kalender in diesem Stil wohl nicht übersichtlich.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Hallo

    habe jetzt ein Datagrid genommen und an eine XML gebunden. Das Datum (die vielen Datensätze), werde ich einmal erstellen und dann bei jedem Neustart hinten (alte Daten) löschen und vorn zwei Neue in der XML/Dataset dransetzen.
    Interessant ist das Nachladen beim scrollen. Hast Du einen Tipp? Geht das auch wenn die Daten auf einem Server im Netzwerk liegen und von mehreren Arbeitsplätzen darauf zugegriffen wird?
    Zur Zeit mache ich das mit einem FileSystemWatcher der die XML überwacht und bei Bedarf das Datagridview nachführt.(ohne WPF)

    Jetzt noch eine Frage: Das Datagrid ist an eine XML gebunden, die Header der Spalten sollen an eine andere XML gebunden werden geht das auch? (kann auch eine andere Tabelle in der XML sein.)

    Grüße Thomas
    Hallo

    Zum Thema nachladen: Ich meine das nachladen im View. Die Daten geht leider nicht mit deiner vermurksten (sorry) XML.
    Wie willst du die Daten nach Datum nachladen? Die Personen ja, aber nicht nach Datum. Du weist ja anhand der Datei vor (!) dem Auslesen nicht welche Datumsangaben da drinnen stehen. Und wenn du die Datei bereits ausliest kannst du es auch gleich in der Klasse speichern.

    Im View also im DataGrid kannst du das machen indem du abfragst beim Scrollen ob das letzte Element sichtbar ist.

    Das Thema ist hier eher, und ich will dich jetzt auf keinen Fall angreifen oder gar beleidigen, aber die Datenhaltung ist hier falsch. Wenn du die App nun neu machst unter WPF, denke mal darüber nach ob du nicht in der Zukunft VIEL weniger Arbeit hast beim Warten wenn du die "neue" App gleich anders machst. Ich weis, du willst die bereits vorhanden Daten Weiter nutzen und nur das Frontend austauschen. Aber auch in diesem Fall gibt es Lösungen. Da mach ich ne kleine App welche die Daten Migriert. Kommt hald immer darauf an wieviel Arbeit du da reinstecken willst.

    Weil, das sind keine mehreren Termine

    XML-Quellcode

    1. <Eintrag ID="Montag, 14. August 2017">
    2. <Zelltext>8:00 Uhr Meier 10:00 Uhr Pause 11:00 Feierabend</Zelltext>
    3. </Eintrag>


    So vielleicht noch evtl.

    XML-Quellcode

    1. <Eintrag ID="Montag, 14. August 2017">
    2. <Zelltext>8:00 Uhr Meier</Zelltext>
    3. <Zelltext>10:00 Uhr Pause</Zelltext>
    4. <Zelltext>11:00 Feierabend</Zelltext>
    5. </Eintrag>


    Eigentlich besser so:

    XML-Quellcode

    1. <Eintrag ID="Montag, 14. August 2017">
    2. <Termin DateTime=12.08.2017 08:15:00 Duration=30>Meier wegen Angebot</Termin>
    3. </Eintrag>


    Aber richtig (vorallem im Netzwerk) wäre eine DB !!!!

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Danke für Deine ehrliche Antwort, die vermurkste XML ist gewachsen, das Programm dazu läuft seit Jahren einwandfei. Sicher ist mir klar,
    das ich mit meinen Programmierkenntnissen kein Geld verdienen könnte. Mir fällt aber auf, das auf konkret gestellte Fragen:
    Zur Zeit mache ich das mit einem FileSystemWatcher der die XML überwacht und bei Bedarf das Datagridview nachführt.(ohne WPF) und
    Das Datagrid ist an eine XML gebunden, die Header der Spalten sollen an eine andere XML gebunden werden geht das auch? (kann auch eine andere Tabelle in der XML sein.)

    keine Antwort bekommen habe.
    Das ist keine Kritik an Dir oder am Forum, aber es gibt vielleicht auch Leute die einfach nur so programmieren oder Anfänger sind und etwas Hilfe brauchen. Da kommt schon eine gewisse Aroganz rüber.
    Es gibt bestimmt Menschen die nicht so gut im programmieren sind aber dafür einen Nagel gerade in die Wand kriegen.

    Nicht persönlich nehmen.

    Gruß Thomas
    Halllo

    Es steht mir gar nicht zu das zu beurteilen ob du mit deinen Kenntnissen Geld verdienen kannst oder nicht.
    Nur mal abgesehen davon das es darauf ankommt wie du dich verkaufst.

    Zu deiner Kritik. Ich habe im vorhinein gemeint das ich dafür ein eigenes Usercontrol machen würde, wobei das klar ist das ich auf eine Frage bez. des Datagrids nicht mehr näher eingehe solange du nicht explizit sagst das du es mit einem DataGrid machen willst und nichts anderes in frage kommt.

    Ich finde es eigendlich nicht arogant wenn wir versuchen dir zu helfen. Poste ich ein Beispiel mit einem eigenen Conntrol und Poste dann noch was mit einem DataGrid bin ich mir sicher das du verwirrt bis. Aber wenn du das arogant haltest ist das deine Meinung.

    Also, was deine Frage betrifft mmuss ich dir sagen, direkt binden geht nicht. Du musst deine XML in Klassen Abbilden, diese kannst du dann an dein Grid binden. Auch die Header kann man durch ein DataBinding im HeaderTemplate dynamisch anzeigen lassen.
    Allerdings, die Anzahl der Header weniger. Das ist zwar möglich aber nicht so einfach, hierfür müsstest du ein eigenes Control erstellen welches von DataGridView erbt.

    Wenn du fragen hast, werden wir versuchen zu Antworten, wir werden allerins immer versuchen dich dabei auf den richtigen Weg zu bringen, auch wenn dir das missfällt. Denke darüber nach.

    In der Hoffnung dich zufriedengestellt zu haben.
    sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Hallo Sascha , ich wolte dich nicht angreifen, aber Du bist laut Deinem Profil EDV-Techniker, ich habe eine handwerklichen Beruf, vielleicht gibt es da Unterschiede. Wenn Du Fragen zur Prüfung elektrischen Anlagen brauchst dann kannst Du mich gern kontaktieren, da gibt es bestimmt auch unterschiedliche Wege.
    Ich mag nur nicht wenn sich jemand als der Messias aufspielt.

    Nochmal, Nicht persönlich nehmen.

    Grüße nach Wien.
    Sorry wenn es so rüberkam. War sicher nicht meine Absicht und das denke ich auch auf keinen Fall von mir selbst.

    Aber du must dich auch in meine Lage versetzen, ICH will dir nichts zeigen was nicht in Ordnung ist.
    Du schreibst das du eine App zu WPF portieren willst, machst dann aber nicht WPF. Da muss ich dir das sagen. Was hätte die Portierung denn sonst für einen Sinn?

    Ich hoffe du verstehst was ich meine, und wie ich geschrieben habe wollte ich dich damit auch nicht angreifen, nur einen Rat geben.

    And now please back to Topic!

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Hi Sascha,
    And now please back to Topic!

    Vielleicht kannst Du mir noch eine Tipp geben:
    Das Datagrid ist an eine XML gebunden, die Header der Spalten sollen an eine andere XML gebunden werden, geht das auch? (kann auch eine andere Tabelle in der XML sein.)

    Ich will ja nicht das jemand meine Arbeit macht, ich brache nur einen Lösungsansatz.

    Grüße nach Wien.
    Also meines wissens nach nicht.
    Man kann ja nur ein Datenbindung erstellen.

    Meine Idee wäre jetzt (wenn nichts anderes in Frage kommt) das man die zwei xml Merged. Also das man Temporär eine draus macht. Was ist den in der zweiten drinnen?

    Die Datenhaltung neu zu machen und zu Migrieren ist echt keine Option? Du würdest es dir in Zukunft danken?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)