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

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von uNki
Thema: Ausführung ans GUI delegieren per async+await oder per Thread+Control.Invoke
Am im Forum: GUI: Windows-Forms

danke!

Thema: Ausführung ans GUI delegieren per async+await oder per Thread+Control.Invoke
Am im Forum: GUI: Windows-Forms

hallo herbivore,

danke für die erläuterungen und den tipp mit dem datetime.now!

du sagst, es wäre am sinnvollsten das mit einem system.windows.forms.timer zu realisieren.

gibt es hier auch eine begründung?

danke und beste grüße!

Thema: Ausführung ans GUI delegieren per async+await oder per Thread+Control.Invoke
Am im Forum: GUI: Windows-Forms

hi!

da meine frage thematisch ganz gut in diesen thread passt, mache ich keinen neuen auf.

ich habe ein label in der statusleiste meiner applikation. dies zeigt einfach nur die uhrzeit an und wird sekündlich aktualisiert. normalerweise würde ich einfach einen timer nehmen, interval auf 1000ms setzen und das label entsprechend aktualisieren.

ich möchte aber "am ball bleiben" und versuche es daher mal mit async/await.

im konstruktor der form rufe ich diese methode auf:


private async void RefreshDateTimeLabel()
        {            
            while (true)
            {
                await Task.Delay(1000);
                lblDateTime.Caption = String.Format("{0} {1}", DateTime.Now.Date.ToLongDateString(), DateTime.Now.ToLongTimeString());
            }
        }

zum verständnis: ich könnte das auch mit einem thread machen, hat das dann den gleichen effekt/technischen hintergrund wie die async/await methode oben?


private void RefreshDateTime()
        {
            Thread thread = new Thread(delegate()
            {
                while (true)
                {
                    if (this.InvokeRequired)
                    {
                        this.Invoke(new MethodInvoker(delegate()
                        {
                            Task.Delay(1000);
                            lblDatumUhrzeit.Caption = String.Format("{0} {1}", DateTime.Now.Date.ToLongDateString(), DateTime.Now.ToLongTimeString());
                        }));
                    }
                }
            });
            thread.Start();
        }

wenn ja, ist das async/await procedere ja wesentlich bequemer und lesbarer :)

danke und beste grüße!

Thema: Problem beim Erstellen einer SQL Server Compact Datenbank
Am im Forum: Datentechnologien

hi, ja genau so mache ich es seit gestern dann auch.
speichere mir die sdf-datei als ressource und packe sie bei programminstallation ins ausführungsverzeichnis. von da an steht sie dort als speicher für settings zur verfügung.

Thema: Problem beim Erstellen einer SQL Server Compact Datenbank
Am im Forum: Datentechnologien

hi,

ich möchte zum speichern von benutzereinstellungen und programmeinstellungen auf eine sql server compact db ausweichen.

ich habe visual studio 2010 ultimate inkl. sp1 und sql server compact 3.5 (auch mit 4.0 probiert) installiert.

wenn ich meinem projekt ein neues element hinzufügen möchte und lokale datenbank auswähle, sollte ja egtl. ein wizard kommen.

es erscheint lediglich eine fehlermeldung:

"Der für die Verbindung mit der lokalen Datendatei erforderliche Datenanbieter konnte nicht gefunden werden. die Datei wird dem Projekt hinzugefügt, aber das eingegebene, mit der Datei verknüpfte DataSet wird nicht generiert."

das problem gibts nur wenige male bei google, nirgends eine lösung.
habe auch schon etliche male neuinstalliert (bis auf vs2010, das ist mir dann doch zu viel, da frage ich lieber erst einmal).

habt ihr eine idee?

grüße,
uNki

Thema: Technologieentscheidung im Unternehmen - Desktopanwendung vs. Webanwendung
Am im Forum: Rund um die Programmierung

hi!

ich möchte gern zu einem thema die meinung von profis, die womöglich selbst in ihren unternehmen vor der gleichen frage standen.
ich hoffe, dass ich hier fündig werde :-)

ich bin bei einem mittelständischen unternehmen der größenordnung ~300 MA beschäftigt und dort für interne projekte, speziell für interne softwareentwicklung zuständig.

da wir eine tochter eines größeren unternehmens sind, kommen wir auch in den genuss dessen it-infrastruktur (sql server, gigabit netzwerk, sap system, etc).

ich bin in meinem speziellen bereich (software entwicklung) der zweite mitarbeiter im unternehmen. der andere ist seit 2007 dabei. bisher wurden tools entweder in access erstellt und den mitarbeitern über netzlaufwerke zugänglich gemacht, oder es wurden asp webseiten erstellt, für auf dem hauseigenen server ruhen. zumeist handelt es sich um datenbank-tools und schnittstellen-programme zwischen verschiedenen systemen, bis hin zur kommunikation mit sap.

ich komme eher aus der ecke desktop-anwendungen und habe mit webanwendungen bisher nicht viel am gut gehabt.

der vorteil von webanwendungen liegt klar auf der hand: weitestgehend unabhängig vom zielsystem, aktualisierungen erfolgen zentral.

die nachteile sehe ich persönlich hier:
um eine asp.net webseite mit der gleichen funktionalität zu füllen, wie z.b. ein desktop-programm auf winforms-basis, braucht man (ich denke da geht es nicht nur mir so) wesentlich mehr zeit und es ist einfach umständlicher.
fast alles was client-seitig funktionalität mitbringen soll, muss - m.m.n. zeitaufwendig - mit javascript implementiert werden und ist letzten endes doch nicht das gelbe vom ei. weiterhin stören mich die ständigen ladezeiten beim postback.

privat arbeite ich derzeit z.b. mit devexpress controls und bin fasziniert in welch kurzer zeit man funktionalität und ansprechenede oberfläche vereinen und erstellen kann.

ich habe jetzt nach 3 monaten mein erstes - sehr umfangreiches - projekt abgeschlossen. auf webbasis ist das tool für mich undenkbar, das handling wäre für mich als anwender eine qual. die entwicklungszeit wäre sicher wesentlich länger gewesen.

nun zum wesentlichen:
im unternehmen ist die meinung was die zugrundeliegende technologie für interne applikationen angeht festgefahren - webanwendung auf asp.net basis. das liegt sicher daran, dass mein kollege überzeugter webentwickler ist.
seiner ansicht nach ist winforms "schrott" (überzogen ausgedrückt) und wird nicht mehr / sollte nicht mehr verwendet werden. plausible und wirklich stichhaltige argumente fehlen mir allerdings.
mit den devexpress controls z.b. vermisse ich NICHTS bei der erstellung von umfangreichen und überaus funktionalen desktopanwendungen.

er kritisiert:
desktopanwendungen lassen sich schlecht aktualisieren.
man kann sie schlecht den mitarbeitern zur verfügung stellen.

ganz ehrlich.. wir sind nicht im internet unterwegs und bieten endanwendern applikationen, die diese erst downloaden und installieren müssen. wir haben ein funktionierendes netzwerk, schnelles intranet, einen sql server der nicht im ansatz ausgelastet ist und damit alle möglichkeiten desktopanwendungen ohne probleme und langwierige download- und installationsphasen im haus zu verbreiten.

mir schwebt folgendes vor:

entweder man platziert die applikationen auf dem server, so dass sie über netzlaufwerke im intranet zugänglich sind. rechtevergabe kann man entweder über ordnerrechte oder über eine zentrale, selbst erstellte rechteverwaltung (über sql server + active directory) managen.
--> updateproblematik gelöst, einfach datei austauschen.
--> verteilung der applikation gelöst, da zentral im intranet.
--> keine rechte-probleme.

mein zweiter - und liebster - gedanke ist ein programm, eine art application-center, das auf den anwender-rechnern installiert ist und praktisch der ausgangspunkt für alle unternehmens-anwendungen darstellt - wie ein "homescreen".
es verfügt über ein rechtesystem, das ausgehend vom angemeldeten user weiß, welche applikationen dieser benutzen darf, diese aus dem intranet bezieht, in einer navigationsleiste auflistet und bei bedarf in einem mdi-child darstellt - ein konsistenter look vorausgesetzt, bemerkt niemand, dass es unterschiedliche "module" sind. mir schwebt sowas wie office 2010 vor. das menu als navigation bar und alles ist perfekt. ein eingebauter updater überprüft versionen und sorgt automatisch für die aktuellen programmstände.
praktisch wie sap, das auch ausgehend vom startbildschirm diverse transaktionen starten kann.
es wäre sogar denkbar, das bereits umgesetzte webanwendungen in einem eingebauten browserfenster laufen können.


so. laaaange rede gehalten.
wie seht ihr den sachverhalt und die verschiedenen standpunkte/argumente?

vielen dank und beste grüße,
steffen

Thema: Unterscheidung 00:00 Uhr und 24:00 Uhr
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat
Die Frage die ich mir stelle ist, wozu sollte man sowas brauchen?
Dies darzustellen ist genauso unsinnig wie damit zu rechnen :/

etwas vermessen diese aussage, oder? ;)

wenn du einen kalender hast, wie im outlook beispielsweise, in dem volle tage nebeneinander abgebildet werden, hast du pro woche z.b. 7 spalten von 0 bis 24 uhr.
24 uhr in der spalte montag ist zwar nach allgemeinem verständnis die selbe zeit wie 0 uhr am dienstag, jedoch sind es zwei verschiedene punkte auf dem kalender. der eine ist unten, der andere ist oben. wenn man dann termine grafisch darstellt, wird das thema durchaus relevant.

Thema: Beim Verstecken eines mit ShowDialog() geöffneten Fensters verschwindet das MainForm im Hintergrund
Am im Forum: GUI: Windows-Forms

in seinem fall scheint er ihn nicht zu schließen und auch nicht erst auf button_click in der mainform zu erstellen.

sieht mir fast so aus, als wäre die loginform als private deklariert und schon zu programmstart oder wann auch immer instanziiert.

das ist m.m.n. die falsche herangehensweise.

die login form sollte auf knopfdruck deklariert und instanziiert werden.
und "verstecken" würde ich die schon gar nicht, wenn ich fertig bin.
einfach schließen und bei bedarf neu öffnen.
wie gesagt, zwei zeilen, mehr nicht.

EDIT:

Zitat
mit this.Hide() verstecke ich das LoginForm wieder.
Das mache ich damit ich später wieder darauf zugreifen kann.

yo.. dachte ich mir. nicht so machen. bei bedarf erstellen und gut ist.

Thema: Beim Verstecken eines mit ShowDialog() geöffneten Fensters verschwindet das MainForm im Hintergrund
Am im Forum: GUI: Windows-Forms

du hast eine mainform und eine loginform.
wenn du einen button auf der mainform drückst, soll die loginform via ShowDialog() gezeigt werden.

wenn ich in den button click event in der mainform schreibe:


Form2 frm2 = new Form2();
frm2.ShowDialog();

und die frm2 schließe, ändert das bei mir nichts an der mainform!?
wozu dieses

 
Program.login.Activate();
Program.login.BringToFront();
Program.login.Focus();

und wann/wozu benötigst du


this.Hide();

??

also um es kurz zu machen, um das zu erreichen, was du geschildert hast, benötigst du die zwei zeilen von oben:


Form2 frm2 = new Form2();
frm2.ShowDialog();

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

korrekt.
46 zeilen... 8o
irre, ich brauche 200

aber ganz ehrlich.. habe auch nichts anderes von herbivore erwartet


hier meine alternative lösung, bitte ausgrauen, wenn zuviel.

(Divider würde sich in meinem fall ergeben aus ownConflictDivider/maxConflictDivider)


    public void CalculateAppointmentPositions()
    {
        //appList sortieren
        AppointmentList.Sort((x, y) => x.Start.CompareTo(y.Start));

        //konfliktlisten erstellen
        //---------------------------------------------------------------------

        //temporäre conflictGroups löschen
        foreach (List<CAppointment> conflictGroup in groupList)
        {
            conflictGroup.Clear();
        }

        //temporäre groupList löschen
        groupList.Clear();

        //temporäre ConflictApps der appointments löschen
        foreach (CAppointment app in AppointmentList)
        {
            app.ConflictApps.Clear();
        }

        foreach (CAppointment appToCheck in AppointmentList) //appList enthält ALLE apps, die auf dem screen sichtbar sind und ist nach startzeit sortiert
        {
            appToCheck.MaxConflictDivider = 1;
            //konfliktpartner von appToCheck ermitteln
            foreach (CAppointment appToCompare in AppointmentList)
            {
                if ((appToCompare != appToCheck))
                {
                    if ((appToCheck.End > appToCompare.Start) && (appToCheck.Start < appToCompare.End))
                    {
                        appToCheck.ConflictApps.Add(appToCompare);
                    }
                }
            }

            if (groupList.Count < 1) //wenn noch keine conflictGroup existiert (--> erstes zu prüfendes appointment in dem fall), neue gruppe erstellen und appToCheck hinzufügen
            {
                List<CAppointment> conflictGroup = new List<CAppointment>();
                conflictGroup.Add(appToCheck);
                groupList.Add(conflictGroup);
            }

            else
            {
                bool listFound = false;
                foreach (List<CAppointment> conflictGroup in groupList)
                {
                    foreach (CAppointment app in appToCheck.ConflictApps)
                    {
                        if (conflictGroup.Contains(app))
                        {
                            conflictGroup.Add(appToCheck);
                            listFound = true;
                            break;
                        }
                    }
                }

                if (listFound == false) //eine neue konfliktliste erstellen --> neue gruppe von appointments mit konflikten untereinander
                {
                    List<CAppointment> conflictGroup = new List<CAppointment>();
                    conflictGroup.Add(appToCheck);
                    groupList.Add(conflictGroup);
                }
            }

        }
        //konfliktlisten erstellt. alle appointments die miteinander konflikte haben, stehen jetzt jeweils in einer eigenen liste "conflictGroup"
        //---------------------------------------------------------------------

        foreach (CAppointment appToCheck in AppointmentList)
        {
            appToCheck.OwnConflictDivider = appToCheck.ConflictApps.Count + 1;
        }

        //maximalen conflictDivider feststellen
        //---------------------------------------------------------------------
        foreach (List<CAppointment> conflictGroup in groupList)
        {
            if (conflictGroup.Count > 1)
            {
                List<int> dividers = new List<int>();

                foreach (CAppointment appToCheck in conflictGroup)
                {
                    appToCheck.MaxConflictDivider = 1;
                    foreach (CAppointment appToCompare in conflictGroup)
                    {
                        if ((appToCompare.Start.Date == appToCheck.Start.Date) && (appToCompare != appToCheck))
                        {
                            if ((appToCompare.Start.TimeOfDay ≤ appToCheck.Start.TimeOfDay) && (appToCompare.End.TimeOfDay > appToCheck.Start.TimeOfDay))
                                appToCheck.MaxConflictDivider++;
                        }
                    }
                    dividers.Add(appToCheck.MaxConflictDivider);
                }

                foreach (CAppointment app in conflictGroup)
                {
                    app.MaxConflictDivider = dividers.AsQueryable().Max();
                }
                dividers.Clear();
            }
        }
        //---------------------------------------------------------------------



        //horizontalen index der appointments ausgehend von ihrer startzeit ermitteln
        //---------------------------------------------------------------------
        List<List<CAppointment>> groupListSorted = new List<List<CAppointment>>();
        foreach (List<CAppointment> conflictGroup in groupList)
        {
            groupListSorted.Add(conflictGroup.OrderBy(app => app.Start).ThenByDescending(app => app.End).ToList());
        }

        foreach (List<CAppointment> conflictGroup in groupListSorted)
        {
            foreach (CAppointment app in conflictGroup)
            {
                app.HorizontalIndex = 0;
            }

            foreach (List<CAppointment> horizontalIndexGroup in horizontalIndexGroups)
            {
                horizontalIndexGroup.Clear();
            }
            horizontalIndexGroups.Clear();

            for (int j = 0; j < conflictGroup[0].MaxConflictDivider; j++)
            {
                List<CAppointment> xFactorGroup = new List<CAppointment>();
                horizontalIndexGroups.Add(xFactorGroup);
            }

            foreach (CAppointment appToCheck in conflictGroup)
            {
                foreach (List<CAppointment> horizontalIndexGroup in horizontalIndexGroups)
                {
                    bool containsConflictApp = false;
                    foreach (CAppointment conflictApp in appToCheck.ConflictApps)
                    {
                        if (horizontalIndexGroup.Contains(conflictApp))
                        {
                            containsConflictApp = true;
                            break;
                        }
                    }
                    if (containsConflictApp == false)
                    {
                        horizontalIndexGroup.Add(appToCheck);
                        break;
                    }

                }
            }
            //-----------------------------------------------------------------


            //eigenen conflictDivider ermitteln
            //-----------------------------------------------------------------
            foreach (List<CAppointment> horizontalIndexGroup in horizontalIndexGroups)
            {
                foreach (CAppointment app in horizontalIndexGroup)
                {
                    app.HorizontalIndex = horizontalIndexGroups.IndexOf(horizontalIndexGroup);
                    app.OwnConflictDivider = app.MaxConflictDivider;

                        foreach (var conflictApp in app.ConflictApps)
                        {
                            if (conflictApp.HorizontalIndex == app.HorizontalIndex + 1)
                            {
                                app.OwnConflictDivider = conflictApp.OwnConflictDivider;
                                break;
                            }
                            else
                            {
                                app.OwnConflictDivider = app.MaxConflictDivider - app.ConflictApps.Count < 1 ? 1 : app.MaxConflictDivider - app.ConflictApps.Count;
                            }
                        }

                }
            }

            foreach (List<CAppointment> horizontalIndexGroup in horizontalIndexGroups)
            {
                foreach (CAppointment app in horizontalIndexGroup)
                {
                    foreach (CAppointment conflictApp in app.ConflictApps)
                    {
                        for (int i = 0; i < app.MaxConflictDivider; i++)
                        {
                            if (conflictApp.HorizontalIndex == app.HorizontalIndex + i)
                            {
                                if (app.OwnConflictDivider > (conflictApp.HorizontalIndex - app.HorizontalIndex))
                                    app.OwnConflictDivider = (conflictApp.HorizontalIndex - app.HorizontalIndex);
                                break;
                            }
                        }
                    }
                }
            }
            //-----------------------------------------------------------------
        }

        //temporäre conflictGroups löschen
        foreach (List<CAppointment> conflictGroup in groupListSorted)
        {
            conflictGroup.Clear();
        }

        //temporäre groupListSorted löschen
        groupListSorted.Clear();
        //---------------------------------------------------------------------

        Invalidate();
    }

Thema: Unterscheidung 00:00 Uhr und 24:00 Uhr
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat
Insofern ist das Ergebnis, dass Du bisher bekommst völlig korrekt.

habe nicht behauptet, dass es falsch ist. habe explizit gesagt, dass es für mich nicht brauchbar ist.

dass 24 uhr und 00 uhr für die selbe zeit stehen, habe ich auch nicht bestritten.
Zitat
(auch wenn das im grunde das selbe sein mag)


@herbivore

ja, so habe ich mir das gedacht. hatte nur gehofft, dass es im framework evtl. doch eine möglichkeit gibt, das ende eines tages gesondert zu interpretieren.

danke

Thema: Unterscheidung 00:00 Uhr und 24:00 Uhr
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

hi!

ich suche eine möglichkeit, 24 uhr eines tages darzustellen.

wenn ich zu "17.02.2012 23:55:00" 5 minuten addiere, ist das ergebnis "18.02.2012 00:00:00". das ist für mich aber nicht brauchbar. ich benötige "17.02.2012 24:00:00".
möchte das ende eines tages und nicht den anfang des nächsten tages haben. (auch wenn das im grunde das selbe sein mag)

gibt es da eine möglichkeit? evtl. über globalization-einstellungen o.ä.?

Thema: Rechteck um seinen Mittelpunkt gedreht zeichnen
Am im Forum: Grafik und Sound

hmm, ist zwar ein anderer ansatz als deiner, aber so funktioniert es auch:



            Rectangle rect = new Rectangle(100, 50, 50, 50);
            e.Graphics.FillRectangle(new SolidBrush(Color.Red),rect);


zeichnet ein normales rechtecht.



Matrix matrix = new Matrix();
            Rectangle rect = new Rectangle(100, 50, 50, 50);
            matrix.RotateAt(45, new PointF(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2));
            e.Graphics.Transform = matrix;
            e.Graphics.FillRectangle(new SolidBrush(Color.Red),rect);


rotiert das rechteckt um 45 grad im uzs an der gleichen stelle.

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

dann vielleicht direkt die daten für das beispiel im bild:

blau: 09:00 - 15:30 uhr
grün: 09:00 - 14:30 uhr
braun: 09:30 - 11:30 uhr
rot: 11:30 - 12:00 uhr
orange: 14:30 - 15:00 uhr
gelb: 15:30 - 16 uhr

breite eines tages: 96px (durch 3 teilbar für unser beispiel)



termine.Add(new CTermin(Convert.ToDateTime("16.02.2012 09:00:00"), Convert.ToDateTime("16.02.2012 15:30:00")));
termine.Add(new CTermin(Convert.ToDateTime("16.02.2012 09:00:00"), Convert.ToDateTime("16.02.2012 14:30:00")));
termine.Add(new CTermin(Convert.ToDateTime("16.02.2012 09:30:00"), Convert.ToDateTime("16.02.2012 11:30:00")));
termine.Add(new CTermin(Convert.ToDateTime("16.02.2012 11:30:00"), Convert.ToDateTime("16.02.2012 12:00:00")));
termine.Add(new CTermin(Convert.ToDateTime("16.02.2012 14:30:00"), Convert.ToDateTime("16.02.2012 15:00:00")));
termine.Add(new CTermin(Convert.ToDateTime("16.02.2012 15:30:00"), Convert.ToDateTime("16.02.2012 16:00:00")));

EDIT:

nur zur erinnerung, es geht nicht darum, die zeichenroutine etc umzusetzen!
nur eine funktion, die die 3 werte Divider, HorizontalIndex und Width berechnet!

klasse CTermin wurde um ctor ergänzt

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

da ich selbst einige nachmittage daran gesessen habe, und man im netz nicht viel dazu findet, bin ich gespannt wie ihr das löst:

es geht darum, termine in einem kalender (typischer office kalender z.b.) so anzuordnen, dass sie sich grafisch nicht überdecken, aber dennoch den vorhandenen platz sinnvoll ausnutzen. bild siehe anhang.

gegeben sei dazu jetzt folgende klasse, die einen termin darstellt:



class CTermin
{
    //wieviel Platz braucht der Termin im Kalender? Divider = 1/3 --> Termin.Width = 1/3 * Breite des Tages in Pixeln
    public double Divider { get; set; }

    //an welcher Stelle beginnt der Termin im Kalender? HorizontalIndex = 0 --> ganz am Anfang, HorizontalIndex = 1 --> an 2. Stelle
    public int HorizontalIndex { get; set; }

    //Start- und Endzeit 
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }

    //Breite in Pixeln
    public int Width { get; set; }

    public CTermin(DateTime start, DateTime end)
    {
        StartTime = start;
        EndTime = end;
    }
}



sowie eine liste von terminen, die ihr selbst füllen könnt:


List<CTermin> termine = new List<CTermin>();


eure aufgabe ist es, eine funktion/methode zu schreiben, die diese liste so bearbeitet, dass die werte für Divider, HorizontalIndex und Width korrekt gesetzt werden, um diese termine anhand dieser angaben wie im bild unten zeichnen zu können.

(das schema mit Divider, HorizontalIndex und Width ist meine idee, ich denke wir bleiben für diese aufgabe dabei, denn so kann ich es am schnellsten überprüfen)

anforderungen, die schon aus dem bild hervorgehen:

- termine dürfen sich nicht überlagern
- je "früher" die startzeit, desto weiter links steht der termin
- je länger die dauer des termins, desto weiter links steht der termin
- der platz muss voll ausgenutzt werden (war für mich der schwerste part, habe ich selbst erst am wochenende fertig bekommen ^^)


die lösungen/werte für Divider, HorizontalIndex und Width für das beispiel im bild wären unter der annahme, dass die tagesbreite 100px ist wie folgt (meine zeichenroutine ermittelt automatisch eine "größte teilbare" tagesbreite für in diesem falle 3 termine nebeneinander --> 96px)

blau: 1/3, 0, 32
grün: 1/3, 1, 32
braun: 1/3, 2, 32
rot: 1/3, 2, 32
orange: 2/3, 1, 64
gelb: 1/1, 0, 96


bin gespannt :)

(ich brauche mehr als 50 zeilen, aber ich bin mir sicher, dass mein code nicht der effizienteste ist.. ist über mehrere wochen gewachsen)

Thema: [erledigt] List<MyClass> an DataGridView binden (per DataSource): DGV bleibt leer
Am im Forum: GUI: Windows-Forms

okay... ich bin davon ausgegangen, dass deine klasse 'skillresy' über properties verfügt :)

EDIT:

deine klasse sollte auf jeden fall mit properties arbeiten...

statt also nur

public Int32 id = 0;


zu schreiben, benutze mindestens:

public int ID { get; set; }

oder "volle" properties:


private int _id;
    public int ID
    {
        get { return _id; }
        set { _id = value; }
    }

(Int32 = int) ... die properties musst du nicht per hand schreiben

"prop" oder "propf" (für volle) tippen und TAB drücken genügt.

jetzt kannst du objekte deiner klasse auch an steuerelemente binden.

du solltest dich aber auf jeden fall über properties belesen. die sind wichtig :)

Thema: [erledigt] List<MyClass> an DataGridView binden (per DataSource): DGV bleibt leer
Am im Forum: GUI: Windows-Forms


skillresy _v = new skillresy();
_v.ReadFile(br);
sk.Add(_v);

sofern deine ReadFile() methode auch wirklich daten in dein _v objekt schreibt (damit meine ich, auch wirklich im _v objekt irgendwelche properties mit daten füllt), sollten die auch in deinem datagrid angezeigt werden.

du würdest ja - sofern du keine properties eingrenzt, bei der zuweisung der datasource - je property deiner klasse skillresy eine spalte erhalten.

hast du mal probiert, deine liste sk zu durchlaufen und die objekte mal auszulesen? evtl. sind sie ja tatsächlich leer, weil seine methode ReadFile() nicht funktioniert.



foreach (skillresy item in sk)
{
Console.WriteLine(item.DEINE_PROPERTY.ToString());
}

wenn da was rauskommt, kannst du ja noch einmal bescheid sagen


EDIT:
(kannst natürlich auch nen brakepoint setzen und die liste im debugger anschauen)

Thema: GDI - Unscharfe Schrift mit DrawString()
Am im Forum: Grafik und Sound

aber irgendwas stimmt noch nicht ganz...

die abstände zwischen den buchstaben sind im office/outlook ein wenig größer. meine wirkt recht gedrungen.

schrift ist wohl nicht gleich schrift, auch wenn in beiden fällen segoe ui dran steht :)

Thema: GDI - Unscharfe Schrift mit DrawString()
Am im Forum: Grafik und Sound

also, der tipp mit dem cleartype war gut.

lösung hat folgendes bei mir gebracht:


g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
                   
                    using (Font fntDay = new Font("Segoe UI", 11, FontStyle.Regular, GraphicsUnit.Pixel))
                        g.DrawString(sTodaysName, fntDay, SystemBrushes.WindowText, rect, format);
                    
                    using (Font fntDayDate = new Font("Segoe UI", 12, FontStyle.Bold, GraphicsUnit.Pixel))
                        g.DrawString(" " + date.ToString(" d"), fntDayDate, SystemBrushes.WindowText, rect, formatdd);

also

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

und GraphicsUnit.Pixel statt GraphicsUnit.Point

ergebnis:

Thema: GDI - Unscharfe Schrift mit DrawString()
Am im Forum: Grafik und Sound

hallo herbivore,

an cleartype habe ich nicht gedacht. habe das grundsätzlich deaktiviert. daher konnte ich mir nicht vorstellen, dass office 2010 unterschiedliche schrift (bei gleicher schriftart!) zaubert, als mein c#!?

naja, ich schau mal, ob ich was finde. hatte gehofft, dass hier sofort jmd. aufschreit "ach... alter hut.. stell das und das um!" :) schade

Thema: 12-Volt-Relais per PC und C# ansteuern?
Am im Forum: Rund um die Programmierung

gut dokumentiert sind auch:

io-warrior

phidget interface kit

Thema: GDI - Unscharfe Schrift mit DrawString()
Am im Forum: Grafik und Sound

hi!

ich versuche mich daran, den office scheduler nachzubauen.

offensichtlich wird standardmäßig segoe ui als schriftart verwendet.
wenn ich versuche meine steuerelemente im scheduler damit zu beschriften, erscheint die schrift allerdings hässlich (unscharf/matschig) und nicht so schön wie im office.

hier der code:


                    using (Font fntDay = new Font("Segoe UI", 8, FontStyle.Regular, GraphicsUnit.Point))
                        g.DrawString(sTodaysName, fntDay, SystemBrushes.WindowText, rect, format);
                    
                    using (Font fntDayDate = new Font("Segoe UI", 10, FontStyle.Regular, GraphicsUnit.Point))
                        g.DrawString(" " + date.ToString(" d"), fntDayDate, SystemBrushes.WindowText, rect, formatdd);

habe schon mit g.SmoothingMode experimentiert. ändert nichts am erscheinungsbild.

habt ihr eine idee, woran es liegt?

in der vergleichsgrafik ist oben office und unten mein scheduler zu sehen.

danke!

Thema: Wie bekomme ich Designer/Toolbox-Unterstützung für eigene Modifikation von Telerik Controls?
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

hi!

ich habe einige änderungen an einem telerik control vorgenommen.
habe das projekt kompiliert, daraus entstanden entsprechende dll's.
so z.b. "Telerik.WinControls.dll"

wenn ich die standard telerik controls installiere, erscheinen sie in meinem visual studio und ich kann sie im designer bearbeiten/verschieben/... .

wenn ich nun mein verändertes control (einfach alle dll's die es im bin ordner gab - sind alle controls von telerik) nun in meinem visual studio projekt hinzufüge und entsprechend referenzen zu meinen dll's setze, kann ich die controls zwar aus der toolbox in die form ziehen, dort erscheinen sie aber nicht im designer - habe keinen designer-support.

sage ich ihm telerik menü, dass er MEINE dll's laden soll, kann ich sie erst gar nicht in die form ziehen, weil er mir eine fehlermeldung bzgl. unterschiedlicher assemblies ausgibt.


meine frage also:

wie gehe ich vor, wenn ich die telerik-controls meinen bedürfnissen anpassen möchte, und dann meine dll's erstellt habe. wohin damit? wie kriege ich designer-support?

vielen dank!!

Thema: [erledigt] Plot verwischt im MDI Child wenn focus() = false
Am im Forum: Grafik und Sound

Zitat
Wie kann ich denn bei "Verschieben von Child 2" das "Child 1" refreshen?

z.b. mit einem event, der dann gefeuert wird, wenn dein ereignis (child 2 wurde verschoben) eintritt.

würde es dann aber nicht während des verschiebens (nicht im Move-Event) refreshen, sondern erst, wenn das fenster verschoben und die maustaste losgelassen wurde. bei jeder mausverschiebung (Move) invalidaten könnte evtl. ruckeln

Thema: [erledigt] Plot verwischt im MDI Child wenn focus() = false
Am im Forum: Grafik und Sound

gibt es performance probleme, wenn du beim verschieben eines fensters die übrigen refreshed? in deinem fall wäre es ja nur eins, das du zusätzlich zu dem, das durch das verschieben ohnehin refreshed wird (?), refreshen müsstest.

EDIT

evtl. ist auch "nur" der inhalt des fensters, das nicht verschoben wird zu refreshen/repainten.

Thema: Walzen eines Spielothek-Automaten animieren
Am im Forum: Grafik und Sound

ich würde oben und unten an jeder walze einen verlauf einfügen, das wirkt eher wie eine walze.

weiterhin würde ich mit einem timer arbeiten, damit der effekt zu stande kommt, dass die walzen sich anfangs schneller drehen als zum ende hin.

so wie bei einem iphone die zeit-walzen bei wecker und co.

startest den timer mit einer hohen "IMAGE_SPEED" einstellung und lässt ihn diese immer kleiner setzen, bis die walze schließlich zum ende kommt.

Thema: WPF: Datensätze einer SQL DB mit DataGrid anzeigen
Am im Forum: GUI: WPF und XAML



string conStr = dein connection-string;
            SqlConnection con = new SqlConnection(conStr);
            con.Open();
            SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM datal", con);
            DataTable dt = new DataTable();
            da.Fill(dt);
            dataGrid1.ItemsSource = dt.DefaultView;


im xaml-code "AutoGenerateColumns" auf true setzen.

dann hast du ein erstes ergebnis.

Thema: Gibt es Webseiten, wo viel Quellcode (Console Applications in C#) zur Verfügung stehen?
Am im Forum: Buchempfehlungen

http://www.codeproject.com/
http://www.java2s.com/Code/CSharp/CatalogCSharp.htm
http://www.planetsourcecode.com

Thema: DataGridViewCheckBoxColumn und Datenbindung
Am im Forum: GUI: Windows-Forms

vielleicht keine DIREKTE antwort auf deine frage, aber ein vorschlag:
ich würde es so machen/mache es immer so:

erstell dir eine klasse COrder, die einen auftrag repräsentiert:


public class COrder
{
    internal int _id;
    public int ID
    {
        get { return _id; }
    }

    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    private bool _finished;
    public bool Finished
    {
        get { return _finished; }
        set { _finished= value; }
    }

    //...

    public COrder()
    {

    }
}


erstell eine klasse (z.b. eine statische klasse "CData"), die die ganze datenbanklogik enthält und dir auf wunsch eine menge von aufträgen als objekte der klasse COrder zurückgibt.

z.b. mit so einer methode:


public static List<COrder> GetAllOrders()
    {
        List<COrder> orders = new List<COrder>();

        try
        {
            using (SqlConnection connection = new SqlConnection(conStr))
            {
                connection.Open();
                SqlCommand command = connection.CreateCommand();
                command.CommandText = "SELECT * FROM Aufträge";
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        COrder order = new COrder();
                        order._id = Convert.ToInt32(reader["ID"]);
                        order.Name = reader["Name"].ToString();
                        order.Finished = Convert.ToBoolean(reader["Ist_Abgeschlossen"].ToString());
                        orders.Add(order);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            //event-handling 
        }
        return orders;
    }


jetzt kannst du einfach im designer hergehen und dein datagridview ohne eine zeile code so anpassen wie du es magst.

kleines kästchen oben rechts im datagridview --> spalten bearbeiten
im fall von oben 3 spalten hinzu, 2 DataGridViewTextBoxColumns und eine DataGridViewCheckBoxColumn.

DataPropertyName ist jetzt - wie der name es erahnen lässt - das property deiner klasse COrder, das du in der spalte anzeigen möchtest. bei der CheckBoxColumn wäre es "Finished".

jetzt einfach das datagridview mit deinen objekten füllen:


DataGridView1.DataSource = CData.GetAllOrders();

das war's.

sieht für mir nach der saubereren lösung aus, weil man a) mengen von objekten verwendet und b) nicht per code aufgaben vom designer erledigt.

mit den comboboxen geht das natürlich genauso..

Thema: List of List - nicht möglich? [new List<List>() funktioniert nicht, new List<List<String>>() schon]
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

List<List<String>>


ergibt:


List<String> list01 = new List<String>();

            List<List<String>> frank = new List<List<String>>();
            frank.Add(list01);

            foreach (List<String> item in frank)
                {
                    
                } 

[EDIT] kommentare aus code entfernt