Beschreibung:
ein grid, das zeitbasierte anzeigen ermöglich. also sowas wie "etwas-start-ende"
verwendungsbeispiel und screenshot folgen.
erstmal die 3 relevanten klassen um mit dem timechart arbeiten zu können.
das ist das eigendliche control. es besitzt einige zusätzliche properties und methoden, die alle dokumentiert sind. ich denke die namen sind sprechend. wichtig ist, das die liste von timechartlabel die eigendlichen anzeigeinformationen enthält.
in dieser klasse steht alles, was das grid braucht, um eine row anzeigen zu können. um auch mehrere zeitintervalle (z.b. 01:00 - 02:00 und 03:00 - 18:00) zu ermöglichen, habe ich ihm eine liste von startendtimepairs gegeben.
wichtig: hier findet (noch) keinerlei validation statt. überschniedungen solltet ihr also vermeiden, genauso wie endzeit vor der startzeit. die sourcen liegen bei also könnt ihr das auch nachträglich einfügen.
hier wird nur eine startzeit und eine endzeit ohne jegliche validation abgelegt. momentan ist es ncoh eine klasse. ich überlege ob ich das später nicht ienfach in einen struct umbaue.
Schlagwörter: TimeChart, Custom Chart
verwendung und screenshot:
innerhalb eines form-constructors:
TimeChart t = new TimeChart();
t.BackgroundCornerColor = Color.LightBlue;
t.BackgroundCenterColor = Color.White;
List<StartEndTimePair> startEndPairList = new List<StartEndTimePair>();
//02:00 - 14:20
DateTime startTime = DateTime.Today.AddHours(2);
DateTime endTime = DateTime.Today.AddHours(14).AddMinutes(20);
startEndPairList.Add(new StartEndTimePair(startTime, endTime));
//16:50 - 20:20
startTime = DateTime.Today.AddHours(16).AddMinutes(50);
endTime = DateTime.Today.AddHours(20).AddMinutes(20);
startEndPairList.Add(new StartEndTimePair(startTime, endTime));
TimeChartLabel chartLabel = new TimeChartLabel (Color.DimGray,Color.DeepSkyBlue, "tester 1", startEndPairList);
t.TimechartLabels.Add(chartLabel);
t.Dock = DockStyle.Fill;
this.Controls.Add(t);
ein beispiel, wobei die erste row dem oberen code entspricht:
und nun der source inklusive demoprojekt:
wünsche und kritik höre ich mir gerne an.
so, neue version.
neu ist:
zusätzlich geplant ist:
und hier noch ein screenshot des neuen grids:
edit: ach ja der mousezeiger ist hier leider nicht mit drauf aber er ist innerhalb des selektierten bereiches (hottracking) ^^
Würdest nochmal den aktuellen Code posten? Danke dir 😉
Signatur.Text = "Greetz, Neals";
Hallo JackLena,
das sieht Klasse aus !
Kann ich vielleicht gebrauchen 😉
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Hallo
Das sieht sehr gut aus. Kann man das dargestellte Zeitinterval einstellen?
chrische
neuer tag, neue version.
version 3 ist es nun mittlerweile und ich habe sie weiter oben bereits hochgeladen.
(sourcen inklusive demoprojekt)
neu ist:
was noch fehlt:
edit: ich sehe gerade, das cih vergaß den grund für das indirekte setzen der intervalzeit und start und endzeit zu erläutern. also:
das ganze funktioniert nur, wenn ((startzeit - endzeit) modulo intervall == 0) ergibt
soll heißen das die anzahl der intervalle zwischen start und ende eine gerade zahl ergeben muss. z.b. geht das nicht: start 01:00 ende: 02:00 intervall 00:45
daher habe ich changemethoden in allen variationen und trychange-methoden in allen variationen implementiert.
zu guter letzt ein screenshot des neuen TimeCharts:
Hi JAck30lena,
super Control was du da zusammengebaut hast!
Ich bin gerade dabei es für mich etwas anzupassen...
Was mir noch irgendwie fehlt, wäre verschiedene Tage untereinander anzuzeigen.
Momentan wird ja nur angezeigt, was in den 24Std des heutigen Tages liegt.
Ich denke, das dein Sinn in dem Programm darin liegt Überschneidungen eines Tages zu betrachten. Interessant wäre meiner Meinung nach auch ein Vergleich mehrere Tage.
Ansonsten habe ich bis jetzt keinerlei Fehler oder Bugs feststellen können!
Es läuft äußerst performant, auch mit etlichen Einträgen.
Dank dir,
TriB
Hallo trib,
danke für dein feedback.
Was mir noch irgendwie fehlt, wäre verschiedene Tage untereinander anzuzeigen.
Momentan wird ja nur angezeigt, was in den 24Std des heutigen Tages liegt.
das stelle cih mir ein wenig komplex vor. da wäre ein usercontrol mit mehreren timecharts und ein wenig zusätzlichen code schneller zu implementieren.
Ansonsten habe ich bis jetzt keinerlei Fehler oder Bugs feststellen können!
freut mich das nur ich bis jetzt bugs gefunden habe ^^
ci hwürde dir aber empfehlen nicht das control selbst zu verändern, sondern wenn möglich nur zu erben und dann das geerbte anzupassen, da ich parallel zu dir an dem control arbeite und ein update meinerseits dann inkompatibel zu deiner veränderung wäre. (wie gesagt -> wenn möglich)
hierzu habe ich auch die wichtigsten methoden virtual gemacht.
momentan z.b. arbeite cih daran, das änderungen in der anzeigecollection sofort auf der anzeige selbst zu sehen sind und nicht erst ein manuelles refresh benötigen.
hierbei kommen auch ein paar neue events (item add usw.) zum control hinzu.
Es läuft äußerst performant, auch mit etlichen Einträgen.
das ist mir persönlich sehr wichtig. ich ahb da allerdings noch einen fehler. wenn du z.b. an die 1000 einträge hast, werden immer alle einträge durchsucht, um die anzuzeigenden einträge zu finden. das werde cih in den nächsten versionen ebenfalls umstellen (evtl eine sorted-binding-list oder ein sorted-obeservable-collection)
Hallo Zusammen,
wieder habe ich eine neue version gemacht und das wird vorerst die letzte sein.
ich habe hier ein paar bugs behebt und ein paar wesentliche umstellungen vorgenommen.
somit ist das control an sich von meiner seite aus fertig. wenn jemand noch einen wunsch hat, dann immer her damit. ggf. werde ich ihn umsetzen.
die datei habe ich weiter oben wieder geupdated (TimeChart_V4.zip)
viel spaß mit dem teil. mir hat es auf jeden fall spaß gemacht es zu schreiben.
ps: wen es interessiert, ich habe in etwa 15 stunden arbeit hereingesteckt. (die zeitangabe ist inklusive der sackgassen, in die ich geraten bin)
edit: bild vergessen^^
Hi,
also erstmals dickes Lob... für 15 Stunden finde ich das eine gelungene Komponente...
Ich hätte aber noch einen Verbesserungsvorschlag:
Wenn es möglich wäre, dass man in einer Zeile mehre Zeiten angeben kann und diese unterschiedlich betittlen kann.
Also so ala Terminkalender
Montag: 10-11 Tuwas 14-15 Was anderes
Dienstag: 9-10 Nochwasanderes usw...
Dazu wäre es auch noch toll, wenn in dem Zeitbalken (sofern er lang genug ist) ein teil des Textes visualisiert wird. So das bei Montag im ersten Zeitbalken "Tuwas" und im zweiten "Was anderes" steht.
Sowas wäre hier echt nicht schlecht.
Wäre echt super wenn du das einbauen würdest.
Ansonsten weiter so...
Grüße
Matrix
No Risk, No Fun
Hallo Matrix-NTN,
danke für dein feedback.
Wenn es möglich wäre, dass man in einer Zeile mehre Zeiten angeben kann
wenn du dir die erste zeile vom screenshot ansiehst, dann siehst du, das das bereits geht.
und diese unterschiedlich betittlen kann
das habe ich für meine zwecke nciht eingebaut. hierfür besteht aber die möglichkeit vom TimeChart zu erben, die methode "DrawChartInformation" zu überschreiben und nachdem man die basismethode aufgerufen hat, noch einen text darüber zu zeichnen. das alles lässt sich in wenigen zeilen erledigen. den größten teil kann man sich sogar direkt aus dem Timechart aus der oben genannten methode kopieren (also die berechnung, wo genau gezeichnet wird)
wenn man sich ncoh anschaut, wie die labels in "DrawLabels" mithilfe des textrenderers gezeichnet werde, dann hat man sogar mit dem zu kleinen platz keine probleme mehr.
Juhu!
Echt sehr gelungen dein "Upgrade".
Habe die dll gestern Abend ausgetauscht und sie funktionierte weiterhin perfekt.
Nur hatte ich mich gewundert wo der Kalender abgeblieben ist 😉
Hat auch echt einen Moment gedauert zu verstehen wo er sich versteckt.
Gibt es da eigentlich eine sinnvolle Möglichkeit, beides in einem Projekt zu benutzen?
Also, das ich in meinem Programm sage: Mit oder ohne Kalender starten.
Dann müsste ich ja das TimeChartControl oder TimeChart laden, bzw. darauf verweisen.
2 gleiche Funktionen mit unterschiedlichem Control zu erstellen erscheint mir sehr stümperhaft...
Vielleicht hast du neben deinem wunderbaren Control noch einen kleinen Ansatz für mich 🙂
Gruß,
TriB
Hallo trib,
Das TimeChartControl (also das mit dem kalender) ist nur ein usercontrol um eine möglichkeit zu demonstrieren.
Ich habe dort das scrolling mit der verticalScrollBar des frameworks implementiert, sowie den MonthCalendar hinzugefügt. ein paar wenige zeilen code hingeschreiben und die funktion als solches war vollständig.
Natürlich kann man es so verwenden (wenn man möchte) oder aber man kann in seinem projekt ein eigenes usercontrol erstellen und dort das einfache TimeChart verwenden und evtl ein paar codeschnipsel aus dem TimeChartControl klauen.
Ich hätte ihn so implementieren können, das der kalender ausblendbar ist, jedoch wäre dann der wunsch gekommen, das er oberhalb oder unterhalb sein soll, oder das er frei versetzbar sein soll... all das hat an sich nichts mit dem TimeChart als solches zu tun und eine implementierung in dieser richtung, um alle möglichen bedürfnisse abdecken zu können erachte ich nciht als sinnvoll.
wenn du den kalender optional haben möchtest, dann kannst du entweder vom TimechartControl erben und eine entsprechende funktionalität einbauen, oder aber einfach den code vom TimeChartControl kopieren und die anpassung direkt im code umsetzen.
die lizensbedingungen im übrigen erlauben dir alles mit dem code anzustellen, was du möchtest. nur solltest du im hinblick auf evtl zukünftige upgrades eher erben oder code kopieren anstatt direkt zu ändern.
Gruß Jack
Hi JAck30lena,
ich bin nun doch auf einen Bug gestoßen.
Und zwar killt die Scrollbar den MousOver-Effekt.
Scrollt man etwas herunter, werden die nicht mehr sichtbaren Zeilen markiert und nicht die, auf denen man steht...
Leider ist die Maus nicht zu erkennen. Aber anhand des Tooltips kann man sehen, das ich eigentlich mit dem Cursor 3 Balken weiter unten bin.
Hallo trib,
oha, danke für den hinweis. also noch ein indexbug.
als hotfix kannst du die methode ersetzen:
public int GetLabelIndexFromPoint(Point clientPoint)
{
int result = -1;
if (clientPoint.Y < HeaderHeight
|| clientPoint.Y > this.Height
|| clientPoint.X > LabelWidth + IntervalSpace * m_IntervalCount)
{
return -1;
}
result = (clientPoint.Y - HeaderHeight)/
(CurrentRowHeight == 0 ? 1 : CurrentRowHeight) +
(m_FirstDisplayedTimechartRowIndex < 0 ? 0 : m_FirstDisplayedTimechartRowIndex);
if (result >= m_TimechartLabels.Count)
{
return -1;
}
return result;
}
den fix werde ich in der nächsten version des timecharts einbauen aber das wird noch eine weile dauern, da ich noch an einem datechart arbeite.
Hallo zusammen,
wie bereits erwähnt, habe ich mcih an einem DateChart versucht, das nciht nur z.b. einen tag anzeigen kann, sondern tage bis jahrzehnte. je nach wunsch.
die besondere herausforderung in solch einem fall, war das zusammenspiel mit den intervallen. jetzt weiß ich warum timespan keine monate oder jahre hat (hab auch vorher nie darüber nachgedacht^^)
es gibt nun also 2 controls. ein TimeChart und ein DateChart. ersteres arbeitet im wesentlichen innerhalb eines tages und letzteres ist vollkommen unabhängig.
jedenfalls konnte ich trotz zeitmangel die probleme bewältigen und dennoch meinen urlaub genießen. dummerweise musste ich für das intervallproblem ein eigenes Intervallstruct schreiben und konnte daher keine .net typen hierfür verwenden.
das erlaubt aber skurile intervalle wie im beispiel
1 monat, 13 tage, 5 stunden, 2 minuten
(den beweis seht ihr im bild)
wie man sieht, sind intervalltechnisch keine grenzen gesetzt.
davon mal abgesehen, ist die benutzung dieses controls analog zum TimeChart
beispiel:
tChart.Dock = DockStyle.Fill;
tChart.BackgroundCornerColor = Color.Lavender;
tChart.BackgroundCenterColor = Color.WhiteSmoke;
// die anzuzeigende zeitspanne berechnen
DateChartInterval dcInterval = new DateChartInterval(1,13,5,2);
DateTime startTime = DateTime.Now.Date;
for (int i = 0; i < 10; i++ )
{
// 10 intervalle in die vergangenheit
startTime = dcInterval.SubtractFrom(startTime);
}
DateTime endTime = DateTime.Now.Date;
for (int i = 0; i < 10; i++)
{
// 10 intervalle in die zukunft
endTime = dcInterval.AddTo(endTime);
}
tChart.SetTimeSettings(startTime,endTime,dcInterval);
TimeChartLabel tcl = new TimeChartLabel (Color.Black, Color.White,
"ein langer text in einem viel zu kurzem bereich", null);
tcl.StartEndTimeList.Add (new StartEndTimePair (DateTime.Today.Subtract(new TimeSpan(45, 0, 0, 0, 0)),
DateTime.Today.AddMonths (3).AddDays(12)));
tChart.TimechartLabels.Add(tcl);
.
.
.
bild:
(edit: die controls inklusive dem demoprojekt habe ich weiter oben bereits hochgeladen. den fix für den indexbug des timecharts habe ich auch bereits eingefügt)
Hallo JAck30lena
wirklich geil, ist genau das was ich suche. Respekt! Allerdings könnte es sein dass da noch ein kleines Buglein drin ist. Ich habe Vista Ultimate 64 und da flackert der Tooltip ständig, auf meinem XP System funzt es einwandfrei. Das aber nur mal so zur Info. Auf jeden Fall vielen Dank fürs posten.
Gruß Paula
PS: Hast Du eigentlich vor noch so "nice to have" Teile wie Drag and Drop einzubauen?
Hallo Private Paula,
danke für dein feedback.
Allerdings könnte es sein dass da noch ein kleines Buglein drin ist. Ich habe Vista Ultimate 64 und da flackert der Tooltip ständig, auf meinem XP System funzt es einwandfrei.
leider habe ich nur xp hier, daher kann ich das nciht testen oder reproduzieren.
Hast Du eigentlich vor noch so "nice to have" Teile wie Drag and Drop einzubauen?
da ich von control erbe, ist drag&drop schon integriert. es sei denn du meinst, das der user die balken hin und her-draggen kann, dann habe ich das nciht vor, da das eigendlich keine standardfunktionalität ist und das eigendlich auch kein mir bekanntes control standardmässig zulässt, rows verschieben zu können. man kann das aber wie bei jedem anderen control einfach implementieren, indem man isch an die entsprechenden events hängt.
Hi,
wenn ich deinen ControllTester ausführe, bekomme ich folgende Exception:
Message: intervalmodulo of Start-End-Timespan must retrive a zero. check start, endtime and interval
StackTrace:bei ProcessWatcher.Controls.DateChart.SetTimeSettings(DateTime newStartDisplayTime, DateTime newEndDisplayTime, DateChartInterval newInterval, Boolean check) in C:\timechart\Controls\DateChart.cs:Zeile 1429.
TargetSite:Void SetTimeSettings(System.DateTime, System.DateTime, Controls.DateChartInterval, Boolean)
Ich habe am Projekt keine Modifikationen vorgenommen...
Wenn ich dann diese Funktion in einen Try-Catch block setze und im Catch block die Exception ignoriere, kommt die Form hoch und es funktioniert meines erachtens alles...
Grüße
Matrix
No Risk, No Fun
Sehr schöne Arbeit.
Aber... Zum rumpumpelblitz und Donnerklapps, habe ich eine Wut im Bauch.
Ich könnt mich in Grund und Boden reinärgern!
Genau während du das hier geschrieben hast, habe ich meine
eigene TimeChart für c++/QT geschrieben.
Hätte ich das gewusst, wär's schneller gegangen. -.-
Naja, shit happens.
**:::
@Matrix-NTN
danke für den hinweis. mir ist zwar schleierhaft, wie sich dieser fehler einschleichen konnte, zumal ich das projekt vor dem zippen getestet habe aber ich habe den fehler nun behoben. im datechart hab ich bei einer validierung innerhalb der "if" das ausrufezeichen vergessen^^ so hat er nun bei validen eingaben exceptions geschmissen und bei ungültigen war alles für ihn ok 🙂
wie dem auch sei. danke für den hinweis -> gefixt und wie gehabt oben hochgeladen.
@Asmodiel
hehe. naja sowas kann eben passieren^^
Hallo,
super, dass Du das DateChart entwickelt hast. Ist in etwa das, was ich brauchen kann. Ich hatte kurz Gelegenheit es etwas zu testen, will es mir aber noch genauer ansehen. Gestatte mir ein paar Fragen und Anmerkungen:
IsValidInterval scheint "gewöhnungsbedürftig" zu sein -). Erst als ich die Funktion "ausgeklammert" hatte, konnte ich eine für mich passende Darstellung( Plus/minus ein Jahr, Intervall 1 Monat) einstellen.
Bei TimeChartLabel wäre es schön, wenn man die Textfarbe unabhängig von der Barfarbe setzen könnte.
Eventuell wäre es sinnvoll, bei TimeChartLabel ein Objekt übergeben zu können,dessen Inhalt (z.B. ein Datensatz) beim ToolTipString verwendet werden könnte.
Vielen Dank für die Arbeit, die Du bisher schon investiert hast.
Gruß
Thomas
hallo tomtom62,
auch dir danke für dein feedback.
zu 1:
ja ich musste zwecks sicherstellung der präzision der anzeige, diese emthode wählen, damit immer sichergestellt ist, das start und enddatum eine gerade anzahl an intervallen hat.
zu 2:
da ich es so einfach wie möglich halten wollte und nicht eine erschlagende featurefülle implementieren wollte, habe ich solche dinge bewusst weggelassen, jedoch habe ich die entsprechenden methoden virtual gemacht, weshalb dieses feature recht leicht umzusetzen wäre.
zu 3:
da die methode "GetToolTipString" virtual ist, kann man einfach nur vom timechartlabel erben und die entsprechende methode überschreiben.
Hallo JAck30lena,
erstklassige Arbeit! Wirklich ein feines Steuerelement.
Gruß
Rainbird
Hallo!
Hab' nun die Controls auch mal ausprobiert. Unter Windows 7 flackern bei mir auch die ToolTips, da OnMouseMove durchgehend aufgerufen wird (auch, wenn die Maus nicht bewegt wird). Wenn man Die Maus schnell rausbewegt, bleibt das (der?) Tooltip oft stehen (und flackert dann logischerweise nicht mehr).
EDIT: Wenn man im ToolTip OwnerDraw auf true setzt, dann flackert es nicht mehr (zumindest unter Win7, andere habe ich noch nicht getestet). Muss man dann natürlich bei beiden Controls machen.
Nobody is perfect. I'm sad, i'm not nobody 🙁
Hallo!
Evtl. noch ein Bug: Wenn man nach oben oder rechts mit der Maus raus geht, wird das/der ToolTip geschlossen, wenn man nach links rausgeht, dann nicht. Wenn man nach unten rausgeht, und die Scrollbar aktiv ist, weil die Anzeige nicht ins Fenster passt, bleibt's ToolTip ebenfalls sichtbar.
Nobody is perfect. I'm sad, i'm not nobody 🙁
Hallo,
erstmal ein FETTES Lob für dieses Hammer Programm - echt klasse !!!
Ich hätte nur noch eine Frage:
Ist es möglich eine horizontale ScrollBar zu erstellen, bei der die Texte fixiert werden?
Danke
Schönen Tag
Hallo Tobinho jr,
erstmal Danke, das es dir gefällt. Es freut mich sehr, wenn sich Leute für meine Arbeit interessieren.
Was die Scrollbar angeht, so tue dir keinen Zwang an. Der Sourcecode liegt ja bei.
Ich habe aktuell und auch in näherer Zukunft keine Zeit dieses Control noch zu erweitern. außerdem würde ich es heutzutage eher mit WPF machen 😃
Gruß
Jack