Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Kalender Control
Aratar
myCSharp.de - Member



Dabei seit:
Beiträge: 126

Themenstarter:

Kalender Control

beantworten | zitieren | melden

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
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Aratar am .
Attachments
private Nachricht | Beiträge des Benutzers
Aratar
myCSharp.de - Member



Dabei seit:
Beiträge: 126

Themenstarter:

beantworten | zitieren | melden

Projekt:
Attachments

Moderationshinweis von herbivore (04.01.2011 - 11:53:29):

Dies ist die (jeweils) aktuellste Version.

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

private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5961
Herkunft: Leipzig

beantworten | zitieren | melden

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

Sieht schick aus! Danke

Zitat von Aratar
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
8)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MrSparkle am .
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7528
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Aratar,
Zitat
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!"
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

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.
Aratar
myCSharp.de - Member



Dabei seit:
Beiträge: 126

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Aratar am .

Moderationshinweis von herbivore (22.06.2011 - 08:12:00):

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

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

private Nachricht | Beiträge des Benutzers
ChrisProg
myCSharp.de - Member

Avatar #avatar-3533.jpg


Dabei seit:
Beiträge: 168
Herkunft: Cloppenburg

beantworten | zitieren | melden

Hallo Aratar,

hast Du das Kalenderprojekt auch für VS2005 ??

MfG ChrisProg
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

@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.
ChrisProg
myCSharp.de - Member

Avatar #avatar-3533.jpg


Dabei seit:
Beiträge: 168
Herkunft: Cloppenburg

Kalender Control

beantworten | zitieren | melden

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:
Zitat
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
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

Zitat
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.
Aratar
myCSharp.de - Member



Dabei seit:
Beiträge: 126

Themenstarter:

beantworten | zitieren | melden

Zitat von JAck30lena
@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
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

Beschäftige dich mit OOP. Dann wird dir das bestimmt klarer :-)
Aratar
myCSharp.de - Member



Dabei seit:
Beiträge: 126

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Aratar am .

Moderationshinweis von herbivore (22.06.2011 - 08:12:42):

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

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

private Nachricht | Beiträge des Benutzers
fod
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Hamburg (früher Brandenburg/Havel)

beantworten | zitieren | melden

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
Attachments
private Nachricht | Beiträge des Benutzers
Aratar
myCSharp.de - Member



Dabei seit:
Beiträge: 126

Themenstarter:

beantworten | zitieren | melden

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

Moderationshinweis von herbivore (22.06.2011 - 08:14:14):

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

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

private Nachricht | Beiträge des Benutzers
fod
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Hamburg (früher Brandenburg/Havel)

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von fod am .
Attachments
private Nachricht | Beiträge des Benutzers
Aratar
myCSharp.de - Member



Dabei seit:
Beiträge: 126

Themenstarter:

beantworten | zitieren | melden

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

Moderationshinweis von herbivore (30.06.2011 - 08:01:09):

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

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

private Nachricht | Beiträge des Benutzers
BigBalls
myCSharp.de - Member



Dabei seit:
Beiträge: 1

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Maffi1986
myCSharp.de - Member

Avatar #avatar-3437.gif


Dabei seit:
Beiträge: 54
Herkunft: Soest

beantworten | zitieren | melden

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 :(
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Maffi1986 am .
private Nachricht | Beiträge des Benutzers
steffen_dec
myCSharp.de - Member



Dabei seit:
Beiträge: 325

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers