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
Projekt:
Dies ist die (jeweils) aktuellste Version.
vorher: KalenderControl.zip (123,11 KB, 212 mal heruntergeladen)
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
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!"
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
Anhang entfernt, die aktuelle Version befindet sich oben im zweiten Beitrag
vorher: KalenderControl (5).zip (146 KB, 201 mal heruntergeladen)
Hallo Aratar,
hast Du das Kalenderprojekt auch für VS2005 ??
MfG ChrisProg
@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.
@ChrisProg:
Wo liegt dein Problem? Lass VS das Projekt konvertieren und gut ist.
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
@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.
- Verwende besser Using() {...} anstatt das manuelle Dispose, um das Freigeben der Ressourcen zu garantieren.
- 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
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
Anhang entfernt, die aktuelle Version befindet sich oben im zweiten Beitrag
vorher: Calendar-Control.rar (8,11 KB, 180 mal heruntergeladen)
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
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
Anhang entfernt, die aktuelle Version befindet sich oben im zweiten Beitrag
vorher: Calendar-Control.rar (12 KB, 13 mal heruntergeladen)
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.
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
Anhang entfernt, die aktuelle Version befindet sich oben im zweiten Beitrag
vorher: Calendar-Control.rar (12,18 KB, 15 mal heruntergeladen)
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!
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 😦
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