|
» myCSharp.de Diskussionsforum |
|
|
|
Autor
 |
|
Aratar
myCSharp.de-Mitglied
Dabei seit: 28.10.2009
Beiträge: 118
|
|
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
Aratar hat dieses Bild (verkleinerte Version) angehängt:
 Volle Bildgröße
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Aratar am 30.06.2011 16:16.
|
|
31.08.2010 18:49
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
|
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ü
|
|
02.09.2010 22:03
|
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
JAck30lena unregistriert
|
|
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.
|
|
03.09.2010 00:41
|
|
|
Aratar
myCSharp.de-Mitglied
Dabei seit: 28.10.2009
Beiträge: 118
Themenstarter
|
|
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
Moderationshinweis von herbivore (22.06.2011 08:12):
Anhang entfernt, die aktuelle Version befindet sich oben im zweiten Beitrag
vorher: KalenderControl (5).zip (146 KB, 201 mal heruntergeladen)
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Aratar am 05.09.2010 18:46.
|
|
05.09.2010 15:47
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
JAck30lena unregistriert
|
|
@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.
|
|
16.09.2010 21:19
|
|
|
|
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
|
|
17.09.2010 08:18
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
JAck30lena unregistriert
|
|
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.
|
|
17.09.2010 09:10
|
|
|
Aratar
myCSharp.de-Mitglied
Dabei seit: 28.10.2009
Beiträge: 118
Themenstarter
|
|
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
|
|
21.09.2010 19:14
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
JAck30lena unregistriert
|
|
Beschäftige dich mit OOP. Dann wird dir das bestimmt klarer :-)
|
|
21.09.2010 21:50
|
|
|
Zwischen diesen beiden Beiträgen liegen mehr als 3 Monate. |
Aratar
myCSharp.de-Mitglied
Dabei seit: 28.10.2009
Beiträge: 118
Themenstarter
|
|
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
Moderationshinweis von herbivore (22.06.2011 08:12):
Anhang entfernt, die aktuelle Version befindet sich oben im zweiten Beitrag
vorher: Calendar-Control.rar (8,11 KB, 180 mal heruntergeladen)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Aratar am 03.01.2011 17:38.
|
|
03.01.2011 17:37
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
fod
myCSharp.de-Mitglied
Dabei seit: 25.07.2008
Beiträge: 84
Entwicklungsumgebung: Visual Studio 2010 Prof. Herkunft: Hamburg (früher Brandenburg/Havel)
|
|
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.
fod hat dieses Bild (verkleinerte Version) angehängt:
 Volle Bildgröße
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von fod am 20.06.2011 22:53.
|
|
20.06.2011 22:44
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
Zwischen diesen beiden Beiträgen liegen mehr als 9 Monate. |
BigBalls
myCSharp.de-Mitglied
Dabei seit: 12.04.2012
Beiträge: 1
Entwicklungsumgebung: C#, VB.NET (VS 2010)
|
|
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:
C#-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!
|
|
12.04.2012 14:25
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
Zwischen diesen beiden Beiträgen liegt mehr als ein Jahr. |
Maffi1986
myCSharp.de-Mitglied
Dabei seit: 12.12.2012
Beiträge: 53
Entwicklungsumgebung: VS2017 Herkunft: Soest
|
|
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?
C#-Code: |
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
C#-Code: |
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 16.12.2013 00:25.
|
|
15.12.2013 23:17
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
|
|