Laden...

Kalender Control

Erstellt von Aratar vor 13 Jahren Letzter Beitrag vor 10 Jahren 33.015 Views
A
Aratar Themenstarter:in
118 Beiträge seit 2009
vor 13 Jahren
Kalender Control

Beschreibung:

Ein kleines Kalender-Control, welches die Anzeige von Einträgen/Terminen ermöglicht.

Schlagwörter: Kalender, Control, Termine

Hallo,

Brauche für mein momentanes Projekt ein kleines Kalender-Control, mit welchem ich Termine anzeigen kann. Wie einige von euch vielleicht merken, hab ich als Vorlage den Windows Live Mail Kalender genommen, da der mir besonders gefallen hat.

Vielleicht können es einige von euch für zukünftige Projekte brauchen. Falls euch extrem schlimme Coding-Style Errors oder Ähnliches auffällt wäre ich froh, wenn ihr mich darauf hinweisen könnt, damit ich es verbessern kann.

**Changelog:***Problem beim Ändern des Start-Datums behoben *Monatsname wird nun in der Mitte des Monats angezeigt

Gruss Aratar

Im Anhang noch ein Screenshot

A
Aratar Themenstarter:in
118 Beiträge seit 2009
vor 13 Jahren

Projekt:

Hinweis von herbivore vor 13 Jahren

Dies ist die (jeweils) aktuellste Version.

vorher: KalenderControl.zip (123,11 KB, 212 mal heruntergeladen)

5.657 Beiträge seit 2006
vor 13 Jahren

Vielleicht können es einige von euch für zukünftige Projekte brauchen.

Sieht schick aus! Danke 🙂

Falls euch extrem schlimme Coding-Style Errors oder Ähnliches auffällt wäre ich froh, wenn ihr mich darauf hinweisen könnt, damit ich es verbessern kann.

Die werden selbstverständlich direkt in das entsprechende Forum gepostet: Coding Styles Horror){gray} 8)

Weeks of programming can save you hours of planning

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo Aratar,

Da so eins im Visual Studio noch nicht vorhanden ist

Das hat mit VS nichts zu tun. Die Controls die dabei sind gehören zum .net Framework.

Im Projekt wäre es praktisch wenn Dateiname und Klassenname zusammenpassen. Form1.cs, Form2.cs, ... sind nicht aussagekräftig. Benenne Form3.cs -> NeuerEintrag.cs oder noch besser NeuerEintragView.cs - die Klasse heißt dann eben auch NeuerEintragView. So weiß dann jeder sofort um was es sich handelt. Das ist v.a. bei größeren Projekten wichtig.
Es ist auch praktisch wenn jede Klasse in eine eigene Datei kommt. So zB Form1.cs splitten in 3 Dateien -> zB MainView.cs, Calender.cs und ItemCollection.cs

Selbiges gilt für die Bezeichnung der Member. ZB button1 sagt nichts aus - außer dass ein Button sein wird.

Die Forms NeuerEintrag und ItemChangeForm sind weitesgehend ident (zumindest optisch). Hier könntest du überlegen ob du nicht eine Form daraus machst.

Den Code hab ich ganz schnell überflogen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Gelöschter Account
vor 13 Jahren
  1. Die Benennung ist suboptimal.
  2. Schau dir das Dispose pattern an und warum das da ist. Du erstellst haufenweise Pen´s usw in der onpaint... google mal. Sonst gibt es per Zufallsprinzip OutOfMemoryExceptions
  3. Teile lange Methoden in mehrere auf, wenn diese in in sich geschlossene funktionale bereiche (bei dir sind es momentan regionen) unterteilt werden können.
A
Aratar Themenstarter:in
118 Beiträge seit 2009
vor 13 Jahren

So, hab mir eure Verbesserungsvorschläge zu Herzen genommen und sie geändert. Hab den Kalender ausserdem noch um die Navigationsmöglichkeit mit den Pfeil-Tasten erweitert.

Gruss Aratar

Hinweis von herbivore vor 12 Jahren

Anhang entfernt, die aktuelle Version befindet sich oben im zweiten Beitrag

vorher: KalenderControl (5).zip (146 KB, 201 mal heruntergeladen)

174 Beiträge seit 2009
vor 13 Jahren

Hallo Aratar,

hast Du das Kalenderprojekt auch für VS2005 ??

MfG ChrisProg

Gelöschter Account
vor 13 Jahren

@Aratar:
Schon viel besser. Dein Code wirkt aufgeräumt, wenn auch noch prozedural anstatt objektorientiert. Aber für den Anfang sehr gut.

2 Anmerkungen habe ich dennoch.

  1. Verwende besser Using() {...} anstatt das manuelle Dispose, um das Freigeben der Ressourcen zu garantieren.
  2. Wenn du eine Methode aufrufst und innerhalb der Parameter ein "new Pen..." machst, heißt das nicht, das dieser Pen nicht freigegeben werden muss. Du musst auch für diese Freigabe sorge tragen. Üblicherweise erzeugt man daher keine Objekte, die ein Dispose haben, innerhalb eines Methodenaufrufes.

@ChrisProg:
Wo liegt dein Problem? Lass VS das Projekt konvertieren und gut ist.

174 Beiträge seit 2009
vor 13 Jahren
Kalender Control

Tja, das dachte ich auch,

aber anscheinend ist VS nicht abwärtskompatibel.

Doppelklick auf die Kalendercontrol.sln --> nichts passiert !!!

Neues Projekt, manuelles Einfügen der *.cs-Dateien --> funktioniert,

aber beim Aufruf z.B. des MainViews erhalte ich nur folgende Zeile:

Beim Laden des Designers sind die nachfolgend aufgeführten Fehler aufgetreten.
Einige können durch Neuerstellen des Projekts behoben werden, andere erfordern möglicherweise Änderungen am Code.
Die Variable itemCollection1 wurde nicht deklariert oder nicht zugeordnet.
Der Typ KalenderTestAnwendung.ItemCollection wurde nicht gefunden. Stellen Sie sicher, dass auf die Assembly, die diesen Typ enthält, verwiesen wird. Wenn dieser Typ Teil Ihres Entwicklungsprojekts ist, stellen Sie sicher, dass das Projekt erfolgreich generiert wurde.
Der Typ KalenderTestAnwendung.Calendar wurde nicht gefunden. Stellen Sie sicher, dass auf die Assembly, die diesen Typ enthält, verwiesen wird. Wenn dieser Typ Teil Ihres Entwicklungsprojekts ist, stellen Sie sicher, dass das Projekt erfolgreich generiert wurde.
Die Variable calendar1 wurde nicht deklariert oder nicht zugeordnet.
bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error(IDesignerSerializationManager manager, String exceptionText, String helpLink)
bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression (IDesignerSerializationManager manager, String name, CodeExpression expression)
bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression (IDesignerSerializationManager manager, String name, CodeExpression expression)
bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement (IDesignerSerializationManager manager, CodeStatement statement)

also scheint Downgrade leider nicht möglich zu sein, deshalb meine Frage.

Gruß ChrisProg

Gelöschter Account
vor 13 Jahren

aber anscheinend ist VS nicht abwärtskompatibel.

Ich habe schon duzende Projekte konvertiert. Der Fehler liegt bei dir lokal.

Dieser Thread hier ist jedoch ungeeignet um das Problem zu lösen.

A
Aratar Themenstarter:in
118 Beiträge seit 2009
vor 13 Jahren

@Aratar:
Schon viel besser. Dein Code wirkt aufgeräumt, wenn auch noch prozedural anstatt objektorientiert. Aber für den Anfang sehr gut.

2 Anmerkungen habe ich dennoch.

  1. Verwende besser Using() {...} anstatt das manuelle Dispose, um das Freigeben der Ressourcen zu garantieren.
  2. Wenn du eine Methode aufrufst und innerhalb der Parameter ein "new Pen..." machst, heißt das nicht, das dieser Pen nicht freigegeben werden muss. Du musst auch für diese Freigabe sorge tragen. Üblicherweise erzeugt man daher keine Objekte, die ein Dispose haben, innerhalb eines Methodenaufrufes.

Hallo,

Hab erst jetzt gesehen, dass es noch weitere Antworten auf diesen Thread gab.

Vielen Dank für die Anmerkungen, werde sie noch berücksichtigen.

Mich würde nur noch interessieren, was genau du mit "...auch noch prozedural anstatt objektorientiert." meinst. (Ich hoffe das sprengt nicht den Rahmen dieses Threads)

Gruss Aratar

Gelöschter Account
vor 13 Jahren

Beschäftige dich mit OOP. Dann wird dir das bestimmt klarer 😃

A
Aratar Themenstarter:in
118 Beiträge seit 2009
vor 13 Jahren

Ich habe mich dazu entschieden, das Control mehr oder weniger komplett neu zu schreiben, da es immerhin 200 Leute runtergeladen haben. Der Hauptgrund war, dass die letzte Version einerseits sehr fehleranfällig war und wie ich jetzt im Nachhinein doch gemerkt habe sehr schlecht programmiert/aufgebaut wurde. Ebenfalls denke ich, dass es jetzt viel benutzerfreundlicher ist und was mir fast am wichtigsten war nach JAck30lena "Aufforderung" um einiges objektorientierter. Ausserdem habe ich das Control jetzt gerade als Dll. Die Optik ist das einzige, was mehr oder weniger gleich geblieben ist.

Zur Benutzung:

Das Control:

und die CalendarItem- Klasse:

Beim Verwenden des ersten Konstruktors erhält das Item einen vordefinierten (grünen/weissen) Farbverlauf als Hintergrund.

Ich hoffe die Bezeichnungen sind eindeutig, ansonsten könnt ihr mich immer noch fragen (Im Designer gibt es zu einigen noch Descriptions). Ausserdem wäre ich euch dankbar, wenn ihr mir Bugs u.ä. melden könntet.

Mfg
Aratar

Hinweis von herbivore vor 12 Jahren

Anhang entfernt, die aktuelle Version befindet sich oben im zweiten Beitrag

vorher: Calendar-Control.rar (8,11 KB, 180 mal heruntergeladen)

F
84 Beiträge seit 2008
vor 12 Jahren

Moin Moin,

erst einmal vielen Dank für die BEreitstellung des Controls; Gefällt mir sehr gut.
Ich probiere gerade ein wenig damit rum um festzustellen ob ich es in einem Projekt verwenden kann.

Ich bin dabei über etwas gestolpert, dass aber eventuell auch an falscher Bedienung liegen kann daher meine kurze Schilderung.

Wenn ich die StartDate-Property verändere, stimmen mitunter die Angaben nicht mehr, da der erste Tag immer auf den Montag gelegt wird.
Als Beispiel habe ich das StartDate auf den 01.06.2011 gelegt. Zur Verdeutlichung habe ich einen Screenshot beigefügt.

Gibt es hierfür eine "integrierte" Lösung? Andernfalls würde ich versuchen die Auflistung des Date - Properties selbst aufzubauen.

Schöne Grüße,
fod

A
Aratar Themenstarter:in
118 Beiträge seit 2009
vor 12 Jahren

Hallo,

Vielen Dank für den Hinweis. Da hatte ich vergessen bei der Änderung des StartDate-Properties das Anfangsdatum richtig zu setzen. Ich habe es geändert und in der angehängten Version stimmt es nun.

Mfg
Aratar

Hinweis von herbivore vor 12 Jahren

Anhang entfernt, die aktuelle Version befindet sich oben im zweiten Beitrag

vorher: Calendar-Control.rar (12 KB, 13 mal heruntergeladen)

F
84 Beiträge seit 2008
vor 12 Jahren

Danke für die schnelle Änderung. Je weiter ich damit herumprobiere, dest beser gefällt es mir.
Wenn mir noch etwas auffallen sollte melde ich mich natürlich.

Grüße,
fod

Edit:

Nach dem Update bin ich gerade über etwas gestolpert. Jetzt wird ja der Monat eingeblendet, wenn es innerhalb des dargestellten Zeitraums einen Wechsel gibt. Allerdings steht der meist auf dem falschen Tag.
Im BIld sieht man hoffentlich was ich meine. Nimmt man ein anderes Startdatum (Beispiel 22.04.2011) steht 'Mai' auf dem 27. April.

A
Aratar Themenstarter:in
118 Beiträge seit 2009
vor 12 Jahren

Hallo,

Ah ja, ich weiss was du meinst. Durch eine kleine Änderung konnte ich das beheben. Der Monatsname steht nun etwa in der Mitte des Monats. Vielen Dank für den Hinweis.

Mfg
Aratar

Hinweis von herbivore vor 12 Jahren

Anhang entfernt, die aktuelle Version befindet sich oben im zweiten Beitrag

vorher: Calendar-Control.rar (12,18 KB, 15 mal heruntergeladen)

B
1 Beiträge seit 2012
vor 11 Jahren

Hey!

Fast schon ein Jahr her, aber ich versuche dennoch mein Glück 😉
Ich habe mir die DLL runtergeladen und in mein Projekt eingebunden (Visual Studio 2010).
Jetzt habe ich das Problem, dass wenn ich auf einen Kalendertag klicke das DateSelectionChanged-Event das richtige Datum zurückliefert, im Kalender aber immer der Vortag markiert wird (z.B. ich klicke auf den 10.04., dann wird der 09.04. markiert). Auch in der Funktion myCalendar_DoubleClick steht in myCalendar.SelectedDate der korrekte Wert, aber eingetragen wird der Termin dennoch am Vortag. 🤔

Ich habe eine Form mit einem horizontalen SplitContainer 'scHorizontal', im unteren Panel (Panel2) zwei Buttons (btnCalMonthBack und btnCalNextMonth) und zwei Labels (lblYear und lblSelectedDate).
Hier mein Code:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace RunningDiaryV2
{
    public partial class frmCalendar : Form
    {

        private CalendarControl.Calendar myCalendar;

        public frmCalendar()
        {
            InitializeComponent();
        }

        private void frmCalendar_Load(object sender, EventArgs e)
        {
            myCalendar = new CalendarControl.Calendar();
            myCalendar.Dock = DockStyle.Fill;
            myCalendar.StartDate = DateTime.Now.AddDays(-DateTime.Now.Day);
            lblYear.Text = myCalendar.StartDate.Year.ToString();
            scHorizontal.Panel1.Controls.Add(myCalendar);
            this.myCalendar.DateSelectionChanged += new CalendarControl.Calendar.DateSelectionEventHandler(this.myCalendar_DateSelectionChanged);
            this.myCalendar.MouseDoubleClick += new  MouseEventHandler(this.myCalendar_DoubleClick);
        }

        private void btnCalNextMonth_Click(object sender, EventArgs e)
        {
            myCalendar.StartDate = myCalendar.StartDate.AddMonths(1);
            lblYear.Text = myCalendar.StartDate.Year.ToString();
        }

        private void btnCalMonthBack_Click(object sender, EventArgs e)
        {
            myCalendar.StartDate = myCalendar.StartDate.AddMonths(-1);
            lblYear.Text = myCalendar.StartDate.Year.ToString();
        }

        private void myCalendar_DateSelectionChanged(DateTime selDateTime)
        {
            lblSelectedDate.Text = selDateTime.ToString();            
        }

        private void myCalendar_DoubleClick(object sender, MouseEventArgs e)
        {
            CalendarControl.CalendarItem newItem = new CalendarControl.CalendarItem(myCalendar.SelectedDate, "neuer Eintrag 08/15");
            myCalendar.Items.Add(newItem);
            myCalendar.Refresh();
        }
    }
}

Kann mir jemand helfen?
Oder hat jemand Beispielcode zur Verwendeung dieses Controls?

Danke!

53 Beiträge seit 2012
vor 10 Jahren

Gibt es ein Tutorial für dieses Control?

Wie füge ich einen Termin hinzu? Wie speiche ich einen Termin bzw. wie lade ich alle Termin die ich zb. in einer Datenbank gespeichert habe?


CalendarControl.CalendarItem newItem = new CalendarControl.CalendarItem(myCalendar.SelectedDate, "neuer Eintrag 08/15");
myCalendar.Items.Add(newItem);

habe es hiermit aus dem vorbeitrag versucht, leider ohne erfolg.

auch

            MessageBox.Show(myCalendar.SelectedDate.ToString());

gibt nur das tagesdatum, nicht das ausgewählte datum aus 😦

S
322 Beiträge seit 2007
vor 10 Jahren

Hallo,

hast Du schon mal hier geschaut?
A Professional Calendar/Agenda View That You Will Use

Ich habe damals den hier aus dem Forum auch getestet und fand aber den von Code-Project besser. Ich hab diesen bei mir schon am laufen, mit speichern/laden der Termine in/aus der DB.
Vielleicht wirst Du daraus schlauer!?

Gruß
Steffen