Klassendiagramm für kleines Kalenderprog.

pipistrello

Mitglied
Ich lasse mir in einer Form mittels einer Combobox, in der man einen Monat auswählen kann, die Kalendertage in einer Listview anzeigen. Der Quellcode steht und es funktioniert auch soweit..

Meine Frage ist nun, wie das entsprechende Klassendiagramm aussehen könnte, da ich mich grade mit uml / klassendiagrammen beschäftige, und diesbezüglich noch sehr unerfahren bin.

Evtl. kann ja jemand ein Bild uploaden. Wäre super...
 
V

VScan

Guten Morgen,

hast Du alle Funktionen, die für die Berechnung der Kalendertage nötig sind, in eine entsprechende Klasse ausgelagert?

Wenn nein, erst auslagern, dann Kode posten...

Im übrigen ist es nicht so einfach irgendetwas aus der Luft zu greifen, insbesondere wenn es Deinen Vorstellungen entsprechen sollte, wäre es immer hilfreich Kode zu posten.


Viele Grüße...
 

pipistrello

Mitglied
Hmmm, nachdem ich versucht hab den Code nach folgendem Diagramm umzuschreiben,

Zeiterfassung.jpg zeiterfassungForm.jpg

werden mir die Tage jetzt nicht mehr angezeigt...:(

Code:
//----------------
//Klasse MainForm
//----------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Recoding_Calendar
{
     public partial class MainForm : Form
    {      
        //Konstruktor
        public MainForm() 
        {
            InitializeComponent();
        }

        //der MainForm den Kalender hinzufügen (Aggregation)
        public void addKalender(CListView listview, CComboBox combobox)
        {
            this.Controls.Add(listview);
            this.Controls.Add(combobox);
        }
     }
}

//---------------
//Klasse Kalender
//---------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Recoding_Calendar
{
    public class CKalender
    {
        public CKalender()
        {
        }

        //ListView erzeugen und der MainForm hinzufügen (Komposition)
        public void addListview(MainForm form)
        {
            form.Controls.Add(new CListView());
        }

        //ComboBox erzeugen und der MainForm hinzufügen (Komposition)
        public void addComboBox(MainForm form)
        {
            form.Controls.Add(new CComboBox());
        }
    }
}

//----------------
//Klasse CListView
//----------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Globalization; //Using Direktive für Datumsformate
using System.Windows.Forms;

namespace Recoding_Calendar
{
    public class CListView : ListView
    {
        private ListViewItem item;
     
        //Konstruktor
        public CListView()
        {       
            this.Location = new Point(12, 71);
            this.Size = new Size(756, 555);
            this.View = View.Details;
            this.GridLines = true;

            this.Columns.Add("Tag", 52, HorizontalAlignment.Center);
      
            //this.Items.Add("test");          
        }

        public void addDaysInMonth(int selectedIndex)
        { 
            int anzahlTageimMonat = DateTime.DaysInMonth(DateTime.Now.Year, selectedIndex + 1);

            //Kalendertage einfügen
            for (int x = 1; x <= (anzahlTageimMonat); x++)
            {
                DateTime dt = new DateTime(DateTime.Now.Year, selectedIndex + 1, x);
                item = new ListViewItem(x.ToString() + " " + "(" + CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedDayName(dt.DayOfWeek) + ")");            

                this.Items.Add(item);

                if (dt.DayOfWeek == DayOfWeek.Sunday)
                {
                    item.UseItemStyleForSubItems = false;
                    item.BackColor = Color.DarkOrange;
                }
            }
        }
    }
}

//-------------------
//Klasse CComboBox
//-------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Globalization; //Using Direktive für Datumsformate

namespace Recoding_Calendar
{
    public class CComboBox : ComboBox
    {
        private CListView listview;

        //Konstruktor
        public CComboBox()
        {
            this.FormattingEnabled = true;
            this.Location = new Point(13, 28);
            this.Size = new Size(121, 21);
            this.TabIndex = 7;
            this.SelectedIndexChanged += new EventHandler (this_SelectedIndexChanged);

            listview = new CListView();

            Init();
        }

        //ComboBox mit Einträgen/Monaten füllen 
        public void Init()
        {
            String str;

            for (int x = 1; x < 13; x++)
            {
                //Monatsanzeige formatieren (Januar, Februar, März etc...)
                str = CultureInfo.CurrentUICulture.DateTimeFormat.GetMonthName(x);
                this.Items.Add(str);
            }

            //Einen Eintrag/Monat in der Combobox markieren
            this.SelectedIndex = DateTime.Now.Month - 1;        
        }

        public void this_SelectedIndexChanged(object sender, EventArgs e)
        {
            listview.addDaysInMonth(this.SelectedIndex);
        }
    }
}

//--------------
//Klasse Program
//--------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace Recoding_Calendar
{
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            
            MainForm form = new MainForm();
            CKalender kalender = new CKalender();

            kalender.addListview(form);
            kalender.addComboBox(form);
    
            Application.Run(form);               
        }
    }
}

Und wie bereits erwähnt bin ich mir auch nicht sicher ob es überhaupt Sinn macht dies so zu modellieren bzw. ob man sowas anders modellieren sollte/müsste.... :confused:
 
Zuletzt bearbeitet:
V

VScan

Hallo pipistrello,


also ganz grundsätzlich führen viele Wege nach Rom, je nach Aufgabenstellung.

Es sieht ganz danach aus, als ob Du VisualStudio verwendest, also folgender Tipp.

Ich würde Dir empfehlen ein benutzerdefiniertes Steuerelement zu erstellen, dass kann man hinterher der Toolbox hinzufügen und wie die anderen Elemente verwenden, ausserdem bietet sich das an.

Dazu ein Link: http://msdn.microsoft.com/de-de/library/cc438236(v=vs.100).aspx

Insgesamt sieht das Klassendesign etwas komisch aus, aber in Deinem Fall ist der aktuelle Stand glaub ich ganz ok, wenn es irgendwelchen Vorgaben entsprechen soll, die ich nicht kenne.
Eins ist mir aufgefallen, ich würde die CultureInfo im Kalender erstellen und die ListView auch im Kalender füllen, nicht in der CComboBox, das sieht etwas seltsam aus, ausserdem kannst Du, falls sich der Monat in der CComboBox ändert, das Ganze in der Kalenderklasse verwalten.

Das mit den Tagen ist ganz einfach: Die Klasse namens CComboBox erstellt ein lokales Objekt des Typs CListView, wenn das aber keinem anderem Objekt zugeordnet wird, das weis, wie man es anzeigt, wird es auch die Tage, die darin hinzugefügt werden nie anzeigen, da Du in der Methode addListView von CKalender eine neue CListView erstellst und nicht die in CComboBox erstellte CListView referenzierst.

Viele Grüße...
 
Zuletzt bearbeitet von einem Moderator:

pipistrello

Mitglied
Hi nochmal...

Meine listview hat ja eine itemcollection. Jedes Item in dieser collection stellt ja einen kalendertag für einen selektierten Monat dar. Wenn der Monat Mai beispielsweise 31 Tag hat, so besteht die collection also auch aus 31 Items... Jeder Kalendertag bzw. jedes Item enthält auch SubItems.

Nun soll aber für jedes Item, also für jeden Kalendertag auch eine zusätzliche Zeile hinzugefügt werden können, um diese mit weiteren SubItems zu füllen. Um eine neue Zeile am selektiertem Tag einzufügen, benutze ich die Insert()-Methode.
Dabei übergebe ich den Index des selektierten Items + 1 als Parameter, damit unterhalb des gewählten Tags, ein neues Item bzw. eine neue Zeile erstellt wird.

Das Problem ist dann aber, das pro neu eingefügtes Item, sich selbstverständlich denn auch die Gesamtzahl der Items in der Listview um 1 erhöht. Aus 31 Tagen werden dann 32, 33 usw.

Naja, und das DateTime Objekt wirft dann eine Exception aus, da es ja nur maximal 31 tage im Monat gibt.

listview.jpg debug_listview.jpg

Habt ihr nen Tip für mich ?



EDIT: Scheint als hätt ichs gelöst....
 
Zuletzt bearbeitet: