Laden...

Forenbeiträge von dannyyy Ingesamt 62 Beiträge

23.11.2010 - 11:00 Uhr

Benutzen bei uns:

* CruiseControl.NET: automatische Builds (Zeit und andere Trigger), Staging, Tests, ...
* MSTest: Für die Unit-Tests
* Sharepoint: Für Tickets, Task, Bug-Tracking, Wiki, ...
* MSBuild zusammen mit CCnet fürs Builden
* Und die CodeCoverage Tools von VS für Metriken und CodeCoverage
* SVN als Code-Repository

Sind soweit zufrieden mit dieser Konstellation. CCnet macht alles was wir wollen, benötigt aber einiges an Zeit bis alles Konfiguriert ist.

27.03.2009 - 08:30 Uhr

Guten Tag,

Ich bin auf der suche nach einem Algorithmus / Pattern um folgendes Problem zu lösen:

  • Es gibt einen zentralen Datastore, der Datensätze enthält die einen Status von 0-2 haben.
    0 = Nicht erledigt
    1 = In bearbeitung
    2 = Erledigt

  • Eine oder mehrere Instanzen eines Verarbeitungsprogrammes, welche auf den selben Datenstore zugreifen.
    Die Instanzen kennen sich untereinander nicht! Weder Anzahl noch direkte Kommunikationsmöglichkeit.

Nun gibt es folgenden funktionierenden Ablauf:

  • Jede Instanz holt sich vom Datenstore eine Menge von Datensätzen die den Status 0 haben und setzt diesen auf 1 (atomar).
  • Verarbeitet die Datensätze und setzt bei jedem verarbeiteten den Status 2.
  • Die Datensätze werden in einer PriorityQueue in der Instanz verwaltet.

Das Problem was nun gelöst werden muss ist folgendes: Wie kann bei einer abgestürzten Queue detektiert werden, welche Datensätze noch in der Queue waren mit dem Status 1
und somit noch nicht abgearbeitet wurden.

Zwei mögliche Ansätze die dabei in Frage kommen sind:

  • Alle vorhandenen Instanzen leeren ihre Queues und bauen Sie neu auf in dem Status mit 0 und 1 berücksichtigt werden
    (Setzt voraus, dass alle Instanzen vom Absturtz der Queue erfahren haben und garantiert ihre Queues leeren)
  • Es werden nur jene mit Status 1 neu zugeteilt, die vorhin von einer abgestürzten Queue nicht mehr verarbeitet wurden
    (Setzt voraus, dass zu jedem Datensatz bekannt ist, wer diese in seiner Queue hat)

Wie kann dies bewerkstelligt werden, ohne dass bekannt ist wieviele Instanzen zur Zeit laufen und diese Untereinander kommunizieren könnten.
Einzige Kommunikation die möglich ist, ist eine Tabelle in der gemeinsamen Datenbank (Datastore) zu benutzen um eine resync. anzuzeigen.

Besten Dank für jeden lösungsbringenden Vorschlag
Freundliche Grüsse
Danny Meier

23.03.2009 - 21:15 Uhr

1 In der produktiven Umgebung wird sich Dispatched immer 0/1 sein.
Beim Mailcode wird es wohl +/- 10 verschiedene geben und das Datum wir immer anders sein. Wo wäre es sinnvoll einen Index zu setzten und wo nicht?
Das WHERE Kriterium wird auch im produktiven Teil so bleiben (dies drei genannten)

  1. Kleine Erklärung wieso die Transaktionen / Locks so gewählt wurden.
    Mehrere Controller-Threads (ca. 2-8) übernehmen die Aufgabe den nächsten unbearbeiteten Datensatz zu holen (soll heissen, nur die Zeile Locken und auf Dispatched = 1 zu setzten), der Datensatz wird für die effektive Verarbeitung an einen Worker-Thread im ThreadPool übergeben (dieser Teil funktioniert sehr gut und Performant). Daher ist es wichtig, das die Controller Thread sich nicht schneiden, resp. gelockte Datensätze mit Readpast übersprungen werden.

Wie kann dieser Teil optimiert werden? Sehe zur Zeit keinen anderen Weg als mit Locks und Transaktionen zu arbeiten. Die Controller laufen permanent also nicht einfach eine verarbeitung mit alles gelesen oder so.

EDIT:
Ich habe 25'000 Einträge generiert mit Dispatched = 0!
Danach 4 mal obiges Programm laufen laufen --> Resultat:


0 / 25'000 bereits verarbeitet
00:00:12.1838645

5'000 / 25'000 bereits verarbeitet
00:00:22.0532166

10'000 / 25'000 bereits verarbeitet
00:00:36.9791626

15'000 / 25'000 bereits verarbeitet
00:00:53.4077915

Komisch finde ich, das bei jedem Durchlauf die Zeit massiv höher wird.

23.03.2009 - 20:34 Uhr

Guten Tag,

Zur Zeit habe ich mit einem Problem zu kämpfen, welches für mich nicht ganz nachvollziehbar ist.

Verwendet wird MSSQL 2008 Enterprise als DBMS.

Mein Problem ist, dass mit jeder Abfrage die ich tätige, die Verarbeitung länger dauert und immer mehr in Performance Probleme laufe.

Die Tabelle sieht in etwa so aus:


CREATE TABLE Message ( 
	MessageId bigint identity(0,1)  NOT NULL,
	Guid char(32) NOT NULL,
	SenderName varchar(50) NULL,
	SenderEmail varchar(255) NOT NULL,
	Applicationcode varchar(10) NOT NULL,
	Mailtype varchar(10) NOT NULL,
	Reference varchar(50) NULL,
	Dispatched bit NOT NULL,
	ScheduledDispatch datetime NOT NULL,
	CreateDate datetime NOT NULL,
	DispatchDate datetime NULL,
	DeleteDate datetime NULL,
	Signed bit NOT NULL,
	Subject varchar(255) NOT NULL
);

Ein Index wurde auf die drei Felder Dispatched, ScheduledDispatch und Mailtyp gelegt. Probehalber, eimal als einzelnen Index pro Feld und einmal einen über alle drei hinweg.

Der Workflow welcher Probleme bereitet wie folgt:

  1. Abfragen eines Datensatzes (Im Code wird kein * verwendet! Führt aber zum selben Resultat, daher hier die vereinfachte Schreibweise)

SELECT TOP 1 * 
FROM Message WITH (UPDLOCK, ROWLOCK, READPAST) 
WHERE Dispatched = 0 AND Mailtype = 'PLAIN' AND ScheduledDispatch <= '2009-03-24';

  1. Sobald ich das Resultat habe, aktualisiere ich in der selben geöffneten Transaktion den Datensatz damit Dispatched = 1 wird.

Es wurden verschiedene Tests gemacht. Zum einen 5000 Einträge generiert, danach Zeit gemessen um 5000 Einträge auszulesen und zu updaten. Danach weitere 5000 generiert und wieder ausgelesen und geupdated.
Mit jeder weiteren Abfrage (und weiteren 5000 Einträgen) verlängert sich der ganze Prozess um 15-20s!!
Ein anderer Test ist 25'000 Einträge generieren und danach immer 5000 verabreiten (abfrage und updaten) und Zeit anzeigen lassen. Danach die nächsten 5000 in Angriff nehmen. Auch hier, mit jedem weiteren durchlauf erhöht sich die Zeit um 15-20s.

Woran kann das liegen? Wo liegt der Fehler?

Folgender Code wurde zum Testen verwendet. Hier ist mit Absicht kein Excpetion-Handling etc. vorhanden! Nicht das es den wirklichen Programmierstil währe 😉 Auch ist im produktiven Code SqlParameter etc. vorhanden. Und keine anfälligen String-Konkatenationen.


    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch sw = Stopwatch.StartNew();

            SqlConnection conn = new SqlConnection(@"Data Source=LOCALHOST\SQL2008;Initial Catalog=SMTP_MAILER_DB_TEST;Integrated Security=SSPI;");
            conn.Open();


            for (int i = 0; i < 5000; i++)
            {
                SqlTransaction trans = conn.BeginTransaction();
                SqlCommand select =
                    new SqlCommand(
                        "SELECT TOP 1 MessageId FROM Message WITH (UPDLOCK, ROWLOCK, READPAST) WHERE Dispatched = 0 AND Mailtype = 'PLAIN' AND ScheduledDispatch <= '2009-03-24';",conn);
                select.Transaction = trans;
                SqlDataReader reader = select.ExecuteReader(CommandBehavior.SingleResult);
                reader.Read();
                if (reader.IsDBNull(0))
                    continue;
                SqlCommand update =
                    new SqlCommand(string.Format("UPDATE Message SET Dispatched = 1 WHERE MessageId={0};",
                                                 reader.GetInt64(0)),conn);
                reader.Close();
                update.Transaction = trans;
                update.ExecuteNonQuery();
                trans.Commit();
            }

            conn.Close();

            sw.Stop();
            Console.WriteLine(sw.Elapsed);
        }
    }

Bin um jeden Tipp dankbar.

Gruss Danny

28.12.2008 - 18:24 Uhr

Das Entity-Framework kann die Vererbung mittels den drei gebräuchlichen Patterns abbilden. Für meinen Zweck eignet sich das Table-per-Type am besten.

Ein Problem das ich aber habe ist wie ich mit der Parallelität umgehen soll beim Update-Prozess. Die einzige Möglichkeit die Paralellität gestützt durch das Framework zu handhaben ist das setzten des Concurrency-Flag auf fixed. Ist das wirklich die einzige Option? Bei LinqToSql gibts ja verschiedene Lösungen angefangen bei einer Row welche als Version (timestamp) definiert ist, bis zur Möglichkeit beim Attachen jeweils original und geändertes Objekt mitzugeben.

Wenn ich nun beim Basistyp wie auch beim geerbten typ einige Spalten auf fixed setzte erhalte ich eine Exception die mir mitteilt, dass dies nicht möglich ist für abgeleitete Typen. Gibt es da eine gescheite Lösung dazu?

Und gibt es wirklich keine Möglichkeit eine ganze Entität/Klasse als Fixed zu markieren ohne dies für X Attribute einzeln zu erledigen?

Welche Ansätze verfolgt ihr für Optimistic Concurrency?

Es handelt sich schlussendlich um eine Webanwendung...oder lässt ihr die Parallelität aussenvor beim updaten von Datensätzen?

Vielen Dank und Gruss
Danny

28.11.2008 - 12:47 Uhr

Hallo,

Ich möchte gerne mal ein paar Meinungen höhren bzüglich dem einsetzten des neuen ASP.NET MVC Frameworks bei einem neuen kommerziellen Projekt.

Mir ist bekannt, dass es zur Zeit "noch" Beta ist. Genau hier stellen sich bei mir verschiedene Fragen:*Wird es definitiv eine Final Version geben des MVC-Frameworks oder ist dies bei einem Beta Stadium noch nicht garantiert? *Das Änderungen in der API folgen werden ist nichts neues und im Masse durchaus zu verkfragen, sofern aber die Prinzipien und Life-Cyles in etwa so stehen bleiben. Kann man sich auf keine all zu grosse Veränderungen mehr verlassen? *Würdet ihr generell auf ein Beta Framework setzen? Resp sehr ihr grosse negative Aspekte, welche einen kommerziellen Einsatz noch nicht zulassen? (Funktional, ...)

Ich für meinen Teil habe bereits zwei Projekte im schulischen und privaten Bereich damit umgesetzt und abgesehen von der fehlenden Dokumentation als durchaus gut befunden. Daher würde mein Bauchgefühl zu ja tendieren.

Vielen Dank für eure zahlreichen Antworten.
Grüsse Danny

10.11.2008 - 14:45 Uhr

Vielen Dank, genau so eine Library habe ich gesucht.
Für meinen Zweck genau ausreichend. Wobei die Qualität der Ausgabe noch etwas höher sein könnte. Erreiche da mit Tools wesentlich bessere Qualität, ermöglichen mir aber auch hunderttauschen einstellungen.

Sollte noch jemand eine ähnliche Bibliothek kennen, werde ich mir diese gerne auch anschauen. Ansonsten kann der Thread bei gelegenheit geschlossen werden.

Gruss Danny

10.11.2008 - 11:15 Uhr

Hallo,

Habe zu meinem Anliegen bereits Google wie auch die Forensuche bemüht, leider aber nichts zufriedenstellendes gefunden.

Gibt es ein Framework/Library in .NET welche es mir erlaubt Konvertierung an Videomaterial durchzuführen?
Hintergrund meiner Frage ist, dass mein MP3-Player kein MP4 abspielen will. Jetzt aber alle Podcasts von Hand zu konvertieren wird mir auf die Dauer zu mühsam. Daher will ich mir eine kleine App schreiben die fortlaufend meine Podcasts synchronisiert und diese auch in das Wunschformat umwandelt.

Neben dem ändern des Containers muss auch das skalieren des Bildmaterials wie auch der Bitraten, Fps etc möglich sein.

Eines der bekanntesten OpenSouce Projekte in dieser Hinsicht ist sicher ffdshow oder mencode. Wobei kein Interface anbieten, dass ich auf anhieb benutzen könnte, oder irre ich mich da?
Alternativ wäre ich auch mit einer Lösung zufrieden die eine externe .exe aufruft, welche die Konvertierung dann vornimmt. Aber auch hier habe ich bisher nur möglichkeiten gefunden über Umwege und keine direkte MP4->Xvid.

Vielen Dank für eure Hilfe und Informationen
Gruss Danny

17.09.2008 - 18:14 Uhr

Hallo,

Ich suche nach einer Library zum erzeugen von Charts, die anhand von vielen X, Y Koordinaten darstellen können, in welchen Bereichen viele Punkte vorhanden sind und wo wenige. Am schönsten wäre es, wenn sich das ganze mit einer Grafik unterlegen lässt, wie das beigefügte Beispiel zeigt. (Wurde händisch in einem Grafikprogramm gezeichnet).

Natürlich bin auch auch offen gegenüber anderen Darstellungsmöglichkeiten (3d?) die solche Hotspots hervorheben können.

siehe Anhang

Oder wie aufwändig wäre es so etwas selbst zu realisieren? Wie man zeichnet weiss ich. Die Frage ist mehr, welche Algorithmen ich verwenden soll/muss damit solche Punkkonzentrationen ersichtlich werden.

Vielen Dank
Gruss Danny

PS: Wie nennt man diese Art von Charts? Vielleicht habe ich deswegen nicht viel beim Suchen gefunden.

23.07.2008 - 18:12 Uhr

So hab mich vorhin dem ganzen nochmals angenommen und entsprechend kam mir dann auch die zur Lösung führende Idee.


        private void CreateChart(string uid, string name)
        {
            //zedGraphControl1.GraphPane = new GraphPane();
            GraphPane myPane = zedGraphControl1.GraphPane;

            myPane.Title.Text = "Active periods during the day of " + name;
            myPane.XAxis.Title.Text = "Today";
            myPane.YAxis.Title.Text = "Active";
            myPane.Chart.Fill = new Fill(Color.White, Color.Yellow, 75F);

            PointPairList list = new PointPairList();
            using (YfotDataContext ctx = new YfotDataContext())
            {
                var query = from i in ctx.YfotUsers
                            where i.uid == uid && (i.sessionStartTime.Date == DateTime.Today.Date)
                            orderby i.sessionStartTime ascending
                            select i;

                foreach (var session in query)
                {
                    list.Add(new XDate(session.sessionStartTime.AddMilliseconds(-1)), 0);
                    list.Add(new XDate(session.sessionStartTime), 1);
                    list.Add(new XDate(session.sessionEndTime), 1);
                    list.Add(new XDate(session.sessionEndTime.AddMilliseconds(1)), 0);
                }
            }

            myPane.CurveList.Clear();
            LineItem myCurve = myPane.AddCurve("", list, Color.Black, SymbolType.None);
            myCurve.Line.Fill = new Fill(Color.Yellow, Color.OrangeRed, Color.Red, 30F);

            myPane.XAxis.Type = AxisType.Date;
            myPane.YAxis.Scale.Min = 0.0;
            myPane.YAxis.Scale.Max = 2.0;
            myPane.YAxis.Scale.MinorStep = 1.0;
            myPane.YAxis.Scale.MajorStep = 1.0;
            myPane.XAxis.Scale.Min = new XDate(
                DateTime.Today.Year,
                DateTime.Today.Month,
                DateTime.Today.Day,
                0,
                0,
                0);
            myPane.XAxis.Scale.Max = new XDate(
                DateTime.Today.Year,
                DateTime.Today.Month,
                DateTime.Today.Day,
                24,
                0,
                0);

            zedGraphControl1.AxisChange();
            zedGraphControl1.Refresh();
        }

18.07.2008 - 16:10 Uhr

Hallo zusammen,

Ich möchte gerne ein paar Daten von mir grafisch auswerten, weiss jedoch nicht, wie ich diese am sinnvollsten darstellen kann.

Zuerst kurz, wie ich die Daten roh habe:

[pre]uid     sessionStartTime     sessionEndTime
1       18.07.2008 13:10     18.07.2008 13:20
1       18.07.2008 14.30     18.07.2008 13:50
...[/pre]

Bei den letzten beiden Spalten handelt es sich um DateTime Werte.

Jetzt würde ich gerne ein Diagramm kreieren das die Auswertung wie folgt zeigt:

[pre]  |
2 |
  |
1 |
  |      |---|   |------|
0 |______|___|___|______|____

     00 10  20  30  40  50

X = Uhrzeit, nicht Dauer
Y = Aktive Sessions[/pre]

Also für einen bestimmten Zeitraum x - y jeweils ob der Benutzer eine Session hatte. Unter Umständen könnte er auch zwei oder mehrere gehabt haben, ist aber unwichtig für die eigentliche Frage.

Gibt es sowas wie ReturnToZero, wenn für einen x-Wert kein y-Wert vorliegt?

Oder ganz generell beim erzeugen von Graphen, wie geht man mit nicht vorhandenen Werten um, die man als 0 dargestellt haben möchte?

Mir ist klar, bei einem Geldkurs, Auslastung, ... will man sehen wie die Entwicklung ist, entsprechend werden die Datenpunkte Verbunden. So wie es per Standard auch gezeichnet wird von ZedGraph.

Vielen Dank für die Unterstützung.
Freundliche Grüsse
Danny

19.04.2008 - 02:21 Uhr

Was mir noch aufgefallen ist, deine Variante zählt sehr wohl ob die Anzahl öffnenden Klammern der Anzahl der schliessenden entspricht. Die korrekte Verschachtelung wird dabei nicht berücksichtigt.

Eine sehr schöne und noch viel einfachere Möglichkeit dies zu erledigen ohne viel Code zu erzeugen (keine x Zähler, ...) ist das benutzen eines Stacks.

Beim starten fängst du an den Stack aufzubauen. Dabei wird für jede öffnende Klammer diese auf den Stack gelegt. Folgt nun eine schliessende Klammer die nicht dem letzten Element auf dem Stack entspricht, gab es einen Verschachtelungsfehler. Ansonsten einfach wieder bei jedem Vorkommen einer schliessenden Klammer den Stack abbauen. Bleibt am Schluss nicht mehr übrig, so gab es keine Fehler.

Dieses Prinzip kann auch sehr gut auf andere Dinge angewendet werden.

12.09.2007 - 14:34 Uhr

Hallo,

Da ich keinen Button gefunden habe, der meinen Wünschen entspricht, habe ich (auch aus Lernzwecken) einen eigenen geschrieben.


namespace ImageTextButton
{
    [DefaultEvent("MouseClick")]
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:ImageTextButton runat=server></{0}:ImageTextButton>")]
    public class ImageTextButton : WebControl
    {
        [Bindable(false)]
        [Category("C24")]
        [DefaultValue("")]
        [Localizable(false)]
        [DisplayName("Text")]
        public string ButtonText
        {
            get
            {
                String s = (String)ViewState["Text"];
                return (s ?? String.Empty);
            }

            set
            {
                ViewState["Text"] = value;
            }
        }

        [Bindable(false)]
        [Category("C24")]
        [DefaultValue("")]
        [Localizable(false)]
        public string ImageUrl
        {
            get
            {
                String s = (String) ViewState["ImageUrl"];
                return (s ?? String.Empty);
            }

            set
            {
                ViewState["ImageUrl"] = value;
            }
        }

        [Bindable(false)]
        [Category("C24")]
        [DefaultValue("")]
        [Localizable(false)]
        public string ImageUrlHover
        {
            get
            {
                String s = (String)ViewState["ImageUrlHover"];
                return (s ?? String.Empty);
            }

            set
            {
                ViewState["ImageUrlHover"] = value;
            }
        }

        [Bindable(false)]
        [Category("C24")]
        [DefaultValue("100")]
        [Localizable(false)]
        [DisplayName("Width")]
        public string ButtonWidth
        {
            get
            {
                String s = (String)ViewState["ButtonWidth"];
                return (s ?? String.Empty);
            }

            set
            {
                ViewState["ButtonWidth"] = value;
            }
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.WriteBeginTag("style");
            output.WriteAttribute("type", "text/css");
            output.WriteLine(">");
            output.WriteLine(String.Format(".ImageTextButton_{0} {{ color: black; font-size: 8.25pt; background: #e8f2f1 url('{1}') no-repeat left center; padding-right: 4px; padding-left: {2}px; border: solid 1px #c0c0c0; width: {3}px; height: 22px; cursor: pointer; text-align: left;}}",
                ClientID,
                ImageUrl,
                20,
                ButtonWidth));
            output.WriteLine(String.Format(".ImageTextButton_{0}:hover {{ color: #00008b; font-size: 8.25pt; background: #c9dbdb url('{1}') no-repeat left center; padding-right: 4px; padding-left: {2}px; border: solid 1px #c0c0c0; width: {3}px; height: 22px; cursor: pointer; text-align: left;}}",
                ClientID,
                (ImageUrlHover == String.Empty) ? ImageUrl : ImageUrlHover,
                20,
                ButtonWidth));
            output.WriteEndTag("style");

            output.WriteBeginTag("button");
            output.WriteAttribute("class", "ImageTextButton_" + ClientID);
            output.WriteLine(">");
            output.WriteLine(ButtonText);
            output.WriteEndTag("button");
        }       
    }
}

Wie kann ich jetzt meinem Control irgend welche Events beibringen? Da ich nicht von einer bestehenden Control erbe (wie Button), gibt es auch noch keinen Click Event.

Wie erzeuge ich einen eigenen Event (soweit noch klar) resp. wie kann ich den überhaupt abfeuern? Auf was muss/soll ich reagieren?

Am Schluss sollte er sich so verhalten wie ein normaler Button. SubmitBehavior ist aber nicht zwingend, da die Aktionen sowieso immer im Click-Ereignis definiert sind.

Freundliche Grüsse
Danny Meier ?(

28.08.2007 - 19:10 Uhr

Nachdem ich mit XPO keine guten Erfahrungen sammeln konnten, bin ich auf .NetTiers umgestiegen. Mit CodeSmith lässt sich dies sehr gut generieren, wenn die DB inkl. Beziehungen etc. bereits steht.

Leider erfordert es aber grössere Einarbeitungszeit, da wie ich finde die Doku nicht gerade sehr gelungen ist und es sehr wenig bis nichts im Internet gibt um nachzulesen oder Tipps zu holen. Ausgenommen das Forum von CodeSmith selbst.
Wenn jemand einen guten Literatur Tipp oder eine gute Webseite kennt dazu, wäre ich nicht unglücklich.

Wenn mir .NetTiers nicht zusagt (z.Z. sehr zufrieden) werde ich wohl als nächstes auch nHibernate probieren.

03.08.2007 - 15:08 Uhr

Das ganze ist etwa 1,5 Jahre her seit dem ich zuletzt etwas mit Mono und MySQL gemacht habe. Zu dieser Zeit habe ich den im Anhang befindlichen Provider verwendet (1.0.7). Ist auch jener, welcher von der Mono-Project Seite vorgeschlagen wird.
http://www.mono-project.com/MySQL

Unterdessen gibt es aber schon die 1.0.9 welcher sicher auch funktioniert (nicht getestet):
http://dev.mysql.com/downloads/connector/net/1.0.html

Die aktuellen Versionen 5.0 und 5.1 (Beta) kenne ich nicht und sind villeicht nicht Mono kompatibel.

Gruss Danny

03.08.2007 - 13:23 Uhr

Betreffend MySQL ist es wichtig, dass du den .NET Provider nimmst, welcher für das Mono-Framework ist. Mit jenem für das Microsoft Framework gibt es schwierigkeiten.

Das aufsetzen auf eine Linux maschine ist mehr oder weniger einfach.
Mit Debian (auch andere) einfach den Paketmanager benutzen und das Mono-Zeugs installieren, danach darauf achten das auch die Apache-Libs für Mono installiert sind und als Modul in Apache geladen werden.
Danach noch in der Config von Apache Mono in einem entsprechenden Ordner aktivieren und es läuft 😉

Solange keine Dritt-Komponenten im Spiel sind, habe ich sehr gute erfahrungen gemacht mit Mono. Sobald aber Steuerelemente (Webcontrolls) oder sonstige Assembleys benutzt werden, ist es ein riesen Kampf...

03.08.2007 - 11:25 Uhr

Hallo,

Bisher habe ich nur mit dem VisualStudio selbst entwickelt. Also keine zusätzlichen Plug-Ins zur Hilfe genommen. Nun ist mein Arbeits-Notebook wieder einmal frisch und wollte euch mal ein paar Sachen dazu fragen, bevor ich mir das falsche installiere.

Immer wieder liest man von den Plugins wie Visual Assist, ReSharper, Refactor! oder CodeRush.
Natürlich habe ich auf den Herstellerseiten, die Beschreibungen dazu gelesen und sind alle vielversprechend. Eigentlich kann ja jeder alles.

Da setzt eigentlich meine Frage an. Gibt es vergleiche von aktuellen Versionen? Auf englischen Seiten gibt es teilweise welche, aber die sind von 2004/2005 und da haben sich sicher X-Dinge verändert und X-Bugs sind dazu gekommen resp. verschwunden.

Durch die DevExpress Subscription in der Firma haben wir auch Refactor! und CodeRush zur Verfügung. Und seit neustem auch ReSharper Lizenzen.

Könnt Ihr mir irgend welche Tipps geben?
Wo habt ihr gute Erfahrungen gemacht und verlangsamen das System nicht erheblich?

Gruss Danny

27.05.2007 - 20:48 Uhr

Hallo,

Ich hab mal wieder ein Designtechisches Problem 😉
Und zwar soll ich eine Komponente erstellen die später an verschiedensten Orten genutzt wird und ein Aussehen hat wie dieses Bild hier:

Zudem sollten die Ordner wie auch die Subitems verschiebbar sein (Drag&Drop und AJAX requests um die positionen zu speichern) und die Verschachtelungstiefe sollte beliebig gross werden können.

Zu dem gehört zu jedem Eintrag ein Icon, wie auch ein Icon ganz rechts (ein rotes Flag).

Mit welchen Komponenten kann ich dies am besten nachbauen?
Die Standardkomponenten von VS2005 bringen mich nicht viel weiter und die DevExpress Komponenten haben leider kein Tree Objekt für ASP.NET.

Kann ich mir hier mit einem Grid weiterhelfen? Oder welche kostenlosen oder auch kostenpflichtigen Komponenten gibt es, die einen Tree mit mehreren Spalten unterstützen und auch Drag&Drop mittels AJAX zulasen? Wichtig, die verschiebungen sollten ohne Postbacks etc. auskommen.

Freue mich über jeden Tipp und Hinweis.

Freundliche Grüsse
Danny Meier

23.04.2007 - 09:28 Uhr

In meinem Fall jetzt hat es sich nur um eine kleine Demo gehandelt, welche möglich dynamisch sein musste. Und es ist gerade mal ein einziger Aufruf. Von dem her nicht weiter tragisch.

Aber danke für den Hinweis...werde mich demnächst mal näher mit dem Thema Reflection und dessen möglichkeiten befassen...

Gibt es gute Literatur oder noch besser Internet-Artikel, welche sich damit befassen? Deutsch bevorzugt, aber Englisch ist da auch kein Problem...

Gruss Danny

22.04.2007 - 20:42 Uhr

Besten Dank.
Hat sehr gut Funktioniert 😁

22.04.2007 - 20:16 Uhr

Ich habe ein kleines/gröseres Problem. Das die Lösung was mit Reflection zu tun haben muss, habe ich dan der Suche hier im Forum bereits rausgefunden, mehr aber auch noch nicht.

Das erstellen und Benutzen eines Objekts sieht normalerweise so aus (sofern der Typ bereits bekannt ist):


Customers customers = new Customers();
customers.name = "Müller";
customers.vorname = "Peter";
customer.save();

Nun, in meinem Fall ist die effektiv zu verwendende Tabelle (hier Customers) erst zu laufzeit bekannt.

Wie kann ich nun aus folgenden String-Variablen obiges nachbilden mittels Reflection?


string tabelle = "Customers";

string feld1 = "name";
string feld2 = "vorname";
string feld3 = ...

string inhalt1 = "Müller";
string inhalt2 = "Peter";
string inhalt3 = ...

Wäre sehr dankbar über ein Beispiel. Mit Reflections habe ich noch so gut wie keine Ahnung...

Gruss Danny

14.04.2007 - 11:53 Uhr

Vielen Dank für deine Antwort.
XPO habe ich bisher noch nicht bekannt...um so peinlicher ist es, dass wir mit DevExpress arbeiten also alles haben inkl. Source, aber noch keine was davon mitbekommen hat 😉
Manchmal ist man einfach zu versteift...

Habe mittels Google gesehen, dass es einen Artikel vor 1-2 Jahren in der DotNet Pro gegeben hat.
Besteht die Möglichkeit dass sich ein DotNetPro-Abonnent mir den einen Artikel zur Verfügung stellen könnte? Würde Ihn ja auch kaufen (den Artikel), aber leider ist nur das nachbestellen des ganzen Hefts möglich...und zudem von 2005, der Rest wird mich nicht mehr besonders interessieren, denke ich mal.
http://www.dotnetpro.de/articles/onlinearticle1671.aspx

Vielen Dank und Gruss
Danny meier

13.04.2007 - 18:14 Uhr

Hallo

Ich suche einen O/R-Mapper der kompatibel zu verschiedenen Datenbanken ist, welche über den Jet-Treiber via OleDb angesprochen werden können.

Leider Liefern alle mir bekannten O/R-Mapper nur Support für die gängigsten Datenbanksysteme wie MSSQL, Oracle, SQLite, Access, PostgreSQL, MySQL, ...

Systeme wie Paradox, Sybase, Interbase werden bei keinem von mir getesteten Mapper unterstützt. Wobei es genügen würde wenn nur gewöhnliche SELECT/INSERT/UPDATE/DELETE Befehle untersützt werden und noch Transaktionen. StoredProcedure, Caching, ... können wir z.Z. sowieso nicht gebrauchen, da unsere Paradox dies nicht kann.

Es geht darum ein in die Jahre gekommene Applikation (Modul basierend) auf C# (.NET 2.0) umzuschreiben (vorher C++ mit VCL teils OWL).
Ganz wichtig ist, da nur Teilmodule nach und nach ersetzt werden, dass die Applikation sowohl auf Paradox (alt) wie auch MSSQL 2005 (neu) lauffähig ist.
Bestehende Kunden, mit vielen Modulen werden/müssen weiterhin auf Paradox arbeiten können und Kunden die nur Module haben, welche dann bereits neu vorliegen, sollten mit MSSQL laufen.
Geplant ist auch der Einsatz von anderen Datenbanksysteme, um möglichst dem Kunden die Wahl zu überlassen.
Gibt es dazu eine alternative als auf einen O/R-Mapper zu setzten? Eigentlich benötien wir nur die DAL und den ganzen Rest wie z.B. .netTiers beherscht nicht.

Freundliche Grüsse
Danny Meier ⚠

10.04.2007 - 13:31 Uhr

Welchen Client soll ich dann einbinden?
Muss ich im Code (.netTiers) oder bei der generierung etwas austauschen?

Wenn ich beim Generieren einen ADOX Adapter wähle und dabei ein Verbindung zu

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\DB;Extended Properties=Paradox 7.x;

aufbauen will, dann folgt immer dieser Fehler:

Test failed. Unbekannter Fehler
09.04.2007 - 20:56 Uhr

Vielen Dank

Das Handling mit dem SQL-Server funktioniert unterdessen sehr gut.
Um nochmals auf die Problematik mit mehreren Datenbanken zurück zukommen, insbesondere Paradox...

Ich habe meine App.config soweit angepasst, dass nur noch der Connectionstring für Paradox vorhanden ist:

<configuration>
  <configSections>
    <section name="netTiersService" type="B2.Db.Data.Bases.NetTiersServiceSection, B2.Db.Data" allowDefinition="MachineToApplication" restartOnExternalChanges="true" />
  </configSections>
  <connectionStrings>
    <!-- <add name="MSSQL" connectionString="Database=B2;Server=(local);Integrated Security=SSPI;"
      providerName="System.Data.SqlClient" /> -->
    <add name="Paradox" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\DB;Extended Properties=Paradox 7.x;"
      providerName="System.Data.OleDb" />
  </connectionStrings>
  <netTiersService defaultProvider="SqlNetTiersProvider">
    <providers>
      <add 
	name="SqlNetTiersProvider" 
	type="B2.Db.Data.SqlClient.SqlNetTiersProvider, B2.Db.Data.SqlClient"
	connectionStringName="Paradox"
	providerInvariantName="System.Data.SqlClient" 
	entityFactoryType="B2.Db.Entities.EntityFactory"
	useEntityFactory="true"
	enableEntityTracking="true"
	enableMethodAuthorization="false"
	useStoredProcedure="false"
    />
    </providers>
  </netTiersService>
</configuration>

Leider wird bei mir jedes mal folgende Exception geworfen wenn ich eine Demo-Anwendung starten möchte:

System.ArgumentException was unhandled
Message="Schlüsselwort wird nicht unterstützt: 'provider'."
Source="System.Data"
StackTrace:
bei System.Data.Common.DbConnectionOptions.ParseInternal(Hashtable parsetable, String connectionString, Boolean buildChain, Hashtable synonyms, Boolean firstKey)
bei System.Data.Common.DbConnectionOptions..ctor(String connectionString, Hashtable synonyms, Boolean useOdbcRules)
bei System.Data.SqlClient.SqlConnectionString..ctor(String connectionString)
bei System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous)
bei System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(String connectionString, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions)
bei System.Data.SqlClient.SqlConnection.ConnectionString_Set(String value)
bei System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
bei Microsoft.Practices.EnterpriseLibrary.Data.Database.CreateConnection()
bei Microsoft.Practices.EnterpriseLibrary.Data.Database.OpenConnection()
bei Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteReader(DbCommand command)
bei B2.Db.Data.Utility.ExecuteReader(Database database, DbCommand dbCommand) in C:\Dokumente und Einstellungen\dannyyy\Eigene Dateien\Visual Studio 2005\Projects\B2\netTiers\B2.Db.Data\Utility.cs:Zeile 357.
bei B2.Db.Data.SqlClient.SqlADProviderBase.GetPaged(TransactionManager transactionManager, String whereClause, String orderBy, Int32 start, Int32 pageLength, Int32& count) in C:\Dokumente und Einstellungen\dannyyy\Eigene Dateien\Visual Studio 2005\Projects\B2\netTiers\B2.Db.Data.SqlClient\SqlADProviderBase.generated.cs:Zeile 644.
bei B2.Db.Data.Bases.EntityProviderBaseCore2.GetTotalItems(TransactionManager mgr, String whereClause, Int32&amp; count) in C:\Dokumente und Einstellungen\dannyyy\Eigene Dateien\Visual Studio 2005\Projects\B2\netTiers\B2.Db.Data\Bases\EntityProviderBaseCore.generated.cs:Zeile 240. bei B2.Db.Data.Bases.EntityProviderBaseCore2.GetTotalItems(String whereClause, Int32& count) in C:\Dokumente und Einstellungen\dannyyy\Eigene Dateien\Visual Studio 2005\Projects\B2\netTiers\B2.Db.Data\Bases\EntityProviderBaseCore.generated.cs:Zeile 228.
bei _netTiers_Shell.Program.Main(String[] args) in C:\Dokumente und Einstellungen\dannyyy\Eigene Dateien\Visual Studio 2005\Projects\B2_netTiers_Shell\Program.cs:Zeile 25.
bei System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()

Was und wo muss ich was abändern um eine OLEDB Verbindung nutzen zu können mit .netTiers

Vielen Dank
Gruss Danny

08.04.2007 - 12:27 Uhr

Für die Benutzung. Wie ich die x-tausend Zeilen Code generieren kann ist durchaus klar 😉

07.04.2007 - 20:12 Uhr

Hallo

Ich suche eine gute Einführung ins Thema O/R-Mapping insbesondere in .netTiers. Da ich demnächst damit arbeiten muss, aber nichts finde im Internet, dass mir hilft. Die offizielle Hilfe, finde ich absolut schlecht und Beispiele gibts auch keine.

Insbesondere würde ich mich über ein einfaches Beispiel freuen welches beim starten der Applikation z.B. die Auswahl zwischen zwei DBs bringt, und nachher ein paar Abfragen durchgeführt werden oder eine sonstige DB-Manipulation.

Wichtig ist, dass ich auch eine Paradox DB integrieren kann. Die Einbindung ober die normale OLEDB Schnittstelle und die Jet 4.0 Treiber funktioniert problemlos, aber ob das auch in zusammenarbeit mit .netTiers geht? (Die Klassen werden aber von einer MSSQL 2005 DB generiert).

Würde mich sehr über jeden Tipp oder gar eine Beispielapplikation freuen.
Wer sich die Zeit nehmen würde mir da eine Beispielapplikation zu basteln, wird sicher eine Entschädigung bekommen (kann ja dann vereinbart werden).

Gruss Danny

01.04.2007 - 13:03 Uhr

Verwende Privat/Studium VS 2005 Enterprise (durch die MSDNAA kostenlos) und bei der Arbeit VS 2005 Professional.

So komme ich in keine Lizenz konflikte.
#D habe ich noch nie versucht, wenn aber in zukunft keine VS Lizenz mehr zu verfügung stehen würde, wäre der Umstieg nach #D sicher beschlossene Sache 😉

30.03.2007 - 17:01 Uhr

An der Ausstattung meines Notebooks sollte es nicht liegen.
Ist ein Intel Core Duo T2600 2GHz, 2GB, .... (Thinkpad T60p)

Aber die PlugIns könnte ich mal durchgehen...Auslagern liegt leider nicht drin, da ich manchmal zu Hause, Studium, Arbeit entwickeln muss...Werde wohl bei der VMware Lösung bleiben...bis jetzt immer noch die beste Lösung für mich...

Höhre aber gerne wie andere das geregelt haben 😉

30.03.2007 - 16:45 Uhr

Hallo

Bis jetzt habe ich immer das VisualStudio, SQL Server, ... direkt auf mein Notebook installiert. Aber danach hat mein System nur noch rumgestockt, da die IDE etc. einfach zu viele Dienste am laufen hat, die oftmals nicht benutzt werden.

Wie habt ihr das gelöst? DualBoot? VMware?

Ich habe einen Versuch mit VMware gestartet, jedoch stockts vor allem beim Debuggen und bei grösseren Projekten, die compiliert werden sollen. Auch die DB-Zugriffe sind nicht all zu performant...

Wie sieht eure Entwicklungsumgebung aus?

19.03.2007 - 15:17 Uhr

Nach der Installation der BDE Treiber, funktionierte es auch mit meiner 9.x Version problemlos. Nur die Jet Treiber sind wohl nicht dafür geschaffen...

19.03.2007 - 11:32 Uhr

Leider funktionieren diese nicht.

19.03.2007 - 10:45 Uhr

Hallo

Ich bin auf der Suche nach einer Möglichkeit auf eine Paradox 9.0 Datenbank mittels VS.NET 2005 zu zugreifen.

Die OLE und ODBC Varianten die ich gefunden habe existieren nur für Versionen ≤ 5.x

Wichtig an dieser Stelle ist noch, dass eine Lösung für Paradox her muss. Ein einfaches portieren auf eine andere DB/DBMS ist nicht möglich!

Leider ist die Webseite von Borland sehr schlecht, dort habe ich absolut nichts gefunden.

Bin für jeden Hinweis sehr Dankbar.

Gruss Danny

25.01.2007 - 10:14 Uhr

Hallo

Gibt es eine Möglichkeit die Routing Tabelle von Windows zu verändern wie dies über den Konsolen Befehl "route" möglich ist? Resp. ich möchte nicht in meinem C# Programm einfach den "route" Befehl aufrufen.

Schlussentlich möchte ich ich eine neue Route hinzufügen und bei einer bestehenden die Metrik veränder...

In der Konsole mit "route add x.x.x.x MASK x.x.x.x x.x.x.x METRIC x" resp. "route change x.x.x.x MASK x.x.x.x x.x.x.x METRIX x" problemlos möglich.

Wenn es über WMI funktionierne sollte, welches Objekt habe ich da zu benutzen? Einfach das überschreiben der TCP/IP Einstellungen einer Netzwerkkarte ist hier nicht die Lösung, da ich dort weder spezielle Routen setzen kann noch sonst was.

Wäre über jede Hilfe Dankbar

Gruss Danny

11.08.2006 - 13:46 Uhr

Vielen Dank, für die verschiedenen Tipps und Hinweise.
Vielleicht zur Frage Mehrbenutzer und Transaktionen, Transaktionen werde ich in diesem Falle nicht benötigen, auch in Zukunft nicht! Mehrbenutzer, ist so eine Frage, die ich zur Zeit noch mit nein (Einzelbenutzer) beantworten würde, wie es in 6 Monaten ist kann ich nicht sagen.

Das ganze wird nur wenige Datensätze enthalten, auch in Zukunft. Vondem her sehe ich bei XML nicht so ein Problem. Zu dem muss die Performance nicht Top sein. Ist wirklich nur eine private Anwendung, da würde es nicht mal stören wenn 10 Sekunden benötigt würde, bis ein Datensatz ausgelesen ist. Was ich aber dennoch nicht hoffe 😉

@ TiTime
Mit Konfigurieren habe ich gemeint, das ein Dienst nur lesend auf die XML einwirkt. Änderungen an der XML und dem entsprechend Änderungen an den Datensätzen wird via ein Webinterface geschehen.

Danke für den Internet Link, werde den mir genauer anschauen 😉

@Lord Hessia
Da ich in Bezug auf XML wirklich noch ein Anfänger bin, sehe ich es auch als Übings Objekt und möchte ein bisschen Erfahrung sammeln. Werde mir mal XML Schemas anschauen 😉

Gruss Danny

10.08.2006 - 15:46 Uhr

Hallo

Bin gerade dabei eine neue Anwendung für den Privatgebrauch zu schreiben und stehe gerade vor der Wahl zwischen einer DB (z.B. SQL 2005 Express) oder XML Datei(en).
Da mir eigentlich eine XML reichen würde und eine DB als zu viel erachte, versuche ich es mittels XML. Kann es immer noch portieren 😉
Einen Dienst wird danach nur lesend auf die XML zugreifen (Wird per HTTP regelmässig angefordert) und die enthaltenen Dinge auswerten/ausführen.
Konfiguriert wird die XML aber durch eine Webanwendung. Wahrscheinlich PHP, da ich wenig Erfahrung mit ASP.NET habe und somit auch über kein Hosting oder eigenen Root unter Windows verfüge.

Dabei muss ich folegendes definieren können: (Ausgeschrieben in Worten)
Ein Prozess kann mehrere Daten enthalten mit mehreren Zeitabschnitten, in welchen eine bestimmte Aktion durchgeführt werden soll.

Natürlich gibt es mehrere Prozesse, die dann aber wieder auf ihr eigenes Zeit und Aktions-Schema zurück greifen sollen.

Zudem stellt sich bei mir jetzt auch die Frage, wie das Handling (Abfragen, Updaten, ...) vonstatteh gehen soll. Welche Objekte benutze ich dazu am besten unter .NET 2.0 ?

Habe schon einiges unter .NET Programmiert (Windows Applikationen), jedoch war ich nie auf Datenbanken oder XML angewiesen.
Somit kenne ich mich in erster Linie nur mit Datenbanken wie Postgres oder MySQL aus die ich aber mittels PHP benutze.

Etwas OT aber wenn ich schon dabei bin 😉 Wo kann ich den korrekten Umgang mit DataSets, ADO.NET und all diesen Dingen lernen? Blicke da absolut nicht durch.
Und wenn es mal dazukommt MySQL und .NET zu verwenden, nehme ich die Conntector-Klasse von der MySQL-Homepage und mache alle Queries von Hand à la "SELECT xyz FROM abc, ..." , "INSERT INTO xyz, ..."

Nehme gerne Ratschläge und Tipps entgegen.

Gruss Danny

03.01.2006 - 11:37 Uhr

Ja der gepostete Quellcode hier war noch der Fehlerhafte ^^
Habe es danach auch bemerkt...

Nun leuft alles so wie ich es mir Wünsche 😉

01.01.2006 - 18:22 Uhr

Besten Dank.
Jetzt folgt keine Exception mehr.

Jedoch wird auch nichts in die Tabelle gefüllt, ...aber woran das liegt habe ich eine Vermutung.

01.01.2006 - 17:17 Uhr

Hallo

Ich habe ein DataSet mit den enthaltenen Tabellen im Designer kreiert.
Nun möchte ich in einer Schlaufe die Tabelle mit Datensätzen füllen.

Leider kommt bei mir immer diese Exception:
"This row already belongs to this table"

Dies ist der Quellcode den ich versucht habe zu verwenden.


.
            int[] opCards;
            DataRow tmpRow;

            // Initalisieren des DataSets
            this._PicoData.ReadXmlSchema("PicoData.xsd");

            // Gibt ein Array zurück mit allen Karten des Gegners
            opCards = this.getBeginOpponentCards(myCards, middleCard);

            // TODO: Meine Karten wie die des Gegners in das DS eintragen
            tmpRow = this._PicoData.Tables["MyCards"].NewRow();
            foreach (int tmpNr in myCards)
            {
                tmpRow["CardNr"] = tmpNr;
                this._PicoData.Tables["MyCards"].ImportRow(tmpRow);
            }

            tmpRow = this._PicoData.Tables["OpCards"].NewRow();
            foreach (int tmpNr in opCards)
            {
                tmpRow["CardNr"] = tmpNr;
                this._PicoData.Tables["OpCards"].Rows.Add(tmpRow);
            }

Muss aber auch sagen, bin ganz neu im Gebiet ADO.NET.
Das DataSet verwende ich nur um meine Daten die wärend der Ausführung Anfallen zu bearbeiten. Ist also nicht an eine DB geknüpft.

22.08.2005 - 10:28 Uhr

Hi

Ich stehe zur Zeit vor der Situation ein Setup erstellen zu müssen.

Da die Firma nicht all zuviel Geld investieren möchte, da wir nur sehr selten Setups erstellen müssen ist die Vorgabe Kostenlos bis max 200-300 CHF.

Auf der suche nach etwas geeignetem bin ich auf Inno Setup gestossen welches Open Source und auch von Hand gescriptet werden kann um Anpassungen zu machen.

Soweit bin ich auch zufrieden, erfüllt genau die Ansprüche...

Wo ich aber hängenbelibe sind folgende beiden Punkte...

  • Setup Passwort soll nur abgefragt werden wenn als Setup-Typ Vollständig gewählt wird, bei Minimal nicht!
    -Alle Dateien die Automatisch resp. nach Benutzerbestätigung überschrieben werden sollen gesicher werden (Backup).

Kennt sich jemand damit aus, und könnte mir eine kleine Hilfestellung geben?

Ansonsten bin ich auch offen für andere Setup Tools.
Folgende Anforderungen muss ich mit dem Setup erfüllen.

Bei dem Standard Installations-Typ sollen einige DLL und OCX ins System-Verzeichnis kopiert werden. Jedoch keine Überschrieben, egal welches Datum / Version.

Wählt man den Überschreib-Modus (z.B. Vollinstallation) so soll zuerst eine Passwort Abfrage kommen, und alle Dateien die bereits vorhanden sind soll nach einer Nachfrage überschrieben werden! (Jedoch soll ein Backup dieser erstellt werden).

Bin für jeden Tipp Dankbar.

Wenn ihr mein bisheriges Inno Setup Script benötigt kann ich es gerne zu verfüfung stellen.

Freundliche Grüsse
Danny Meier

08.08.2005 - 19:08 Uhr

Ich habe nun die Variante mit der Tag Eigenschaft gewählt.
Und dort verstaue ich eine eigene per struct definierte Variable, welches alles enthält was ich immer benötige...

Funktioniert einwandfrei... 😁

08.08.2005 - 10:45 Uhr

Original von herbivore
coole Sache mit dem Video. Ist das einfach zu machen?

Habe dazu Camtasia verwendet von http://www.techsmith.de da wir dieses Produkt auch in der Firma im einsatz haben.
Gibt aber sicher auch andere Produkte (kosten günsterige)

08.08.2005 - 09:01 Uhr

Ja es sind 3 Events die ausgelöst werden.

Dabei hatte ich die Simple Abfrage


                if (node.IsSelected)
                {
                        g.DrawString(node.Text, Font, new SolidBrush(Color.White), pointtext);
                }
                else
                {
                    g.DrawString(node.Text, Font, new SolidBrush(Color.Black), pointtext);
                }

Nun wie ich rausgefunden habe, wenn ich mit der Maus auf ein anderes Node klicke und dabei gedrückt halte wird zwar das neue Node bereits Blaumarkiert (übernimmt ja das System, DrawNode-Event wird ausgeführt), aber ich bekomme ich weiss leider nicht a) welcher Node nun markiert ist (node.IsSelected resp. treeview.SelectedNode wird erst aktualisiert nachdem die Maustaste losgelassen wird...

Eine übergangs Lösung ist folgende:
Ich unterbinde wärend dem drücken der Maustaste das neu zeichnen bis die Maustaste losgelassen wird


        private void treeView3_MouseDown(object sender, MouseEventArgs e)
        {
            treeView3.BeginUpdate();
        }

        private void treeView3_MouseUp(object sender, MouseEventArgs e)
        {
            treeView3.EndUpdate();
        }

Nur ist dabei das Verhalten nicht 100% gleich dem Original, da nun die Markierung erst beim loslassen der Maustaste wechselt.

Hätte nie gedacht, dass es bei dem Steuerelement so viele Probleme geben kann gg

07.08.2005 - 22:53 Uhr

Das Zeichnen des Textes plus den Zusatz den ich möchte hat ein kleines Handycap bei der aktualisierung wenn ich ein anderes Node anklicke (beim springen mittels Curser gibt es dieses Artefakt nicht).

Hier ein kleines Video:
http://www.danflash.com/files/DotNet/treeviewscreen.avi

PS: Die unschärfe ist ein Artefakt der Kompression (DivX)

07.08.2005 - 21:51 Uhr

Zu meiner 3. Frage habe ich nun was gefunden...
Dabei bin ich wieder auf ein Problem gestossen (die Probleme woll einfach nicht hören)

Bezug auf folgenden Artikel: http://www.codeproject.com/cs/miscctrl/genmissingpaintevent.asp?target=TREEVIEW

Wenn ich das OnPaint Event verwende bekomme ich ein PaintEventArgs zurück geliefert, welcher mir aber keinerlei Informationen gibt welcher Node zurZeit gezeichnet wird resp. die Koordinaten...

Das Beispiel bei Codeproject beschränkt sich beim Paint erreignis darauf, dass nur was gezeichned wird wenn ein Node angeklickt wird.
So kann mittels treeview.SelectedNode.Bound.X / Y die Koordinate geholt werden.
Anders sieht es aber aus wenn auch gewisse Dinge gezeichned werden sollten bei jedem Node...
Wie bekomme ich das TreeNode Objekt welches gerade gezeichnet wird?


Andere Möglichkeit wäre folgende...
Wie ich bei .NET FW 2.0 gesehen habe gibt es beim TreeView ein Event mit dem Namen DrawNode. Dieses liefert mir dann auch ein DrawNodeEventArg zurück welches das aktuell zu zeichnende Node enthält.

Leider ist es aber hier so, dass dieser Event nur ausgelöst wird wenn die Eigenschaft DrawMode vom TreeView entweder auf "OwnerDrawText" oder "OwnerDrawAll" gesetzt ist. Bei der Stdardeinstellung "Normal" wird dieses Event leider nicht ausgelösst... 😭
Verwende ich eines der beiden anderen Modes so muss ich alles selbst zeichnen Text, Icon, ... Ist also nicht möglich nur was dazu zu zeichnen.
Gibts für diesen Lösungsweg eine Möglichkeit dem Event DrawNode bei zu bringen das er auch auslösen soll wenn DrawMode Normal ist?

Wenn es zu kompliziert oder unklar geschrieben ist bitte sagen...

Freundlicher Gruss
Danny

07.08.2005 - 10:48 Uhr

Vielen Dank
Dann werde ich nun mit dem Tag Objekt beginnen zu Arbeiten.
Hatte dies gesehen, war mir nicht sicher ob das für diese Art der Nutzung vorgesehen ist.

Wegen einer Komponente eines anderen Herstellers sehe ich irgend wie schwarz.
Sowohl Freeware/OpenSource/Kommerziell finde ich nur welche, die entweder einfacher in der bedienung sind oder dann ganze Grids zu verfügung stellen um in Tabellen eine Baumstruktur ab zu bilden. Ein einfaches TreeView nur mit der option eine Farbigeklammer an zu hängen, in welche ich dann z.B. die Anzahl Elemente schreiben kann habe ich niergends gefunden 😭

Vielleicht kann mir jemand anders noch behilfich sein 😁

06.08.2005 - 21:08 Uhr

Hallo Leute

So, bin bei meinem aktuellen Projekt auf weitere Fragen gestossen...dies liegt wohl eindeutig das ich in der Windows-Programmierung neu bin und bissher mehr mit der Webprogrammierung was am Hut hatte (mache das nur in meiner Freizeit, nichts berufliches g)

  1. Wenn ich TreeView (resp. die Nodes) dynamisch erstellen lasse, so funktioniert dies auch wie gewünscht. z.B. Habe ich in einer DB Tabelle alle Kategorien gespeichert welche ich mittels Rekursion dann in ein TreeView zaubere.

tnd = new TreeNode("Katname");

Nun je nachdem weller knoten der User anklickt, sollte dann eine entsprechende Form (oder Datensatz) erscheinen.
Auf das Ereignis kann ich dan mit dem Event AfterSelect eingehen.
Die eigentliche Frage, anhand was soll ich jetzt Werten was der User angeklickt hat? Den TreeNode Text zu verwenden ist da sicher nicht die Sauberste Methode denk ich mal.
Oder wie wird sowas gehandhabt?

  1. Das bringt mich zur nächsten Frage. Ich möchte gerne bei den einzelnen Endknoten angeben wieviele Datensätze sich dahinter verbergen.
    Dazu habe ich einfach vor dem anlegen des Knoten eine DB Abfrage gestartet welches mir die Anzahl Datensätze liefert und die an den Knoten gehängt:

tnd = new TreeNode(String.Format("Katname ({0})", anzahl));

Spätestens jetzt kann ich mit dem Knoten Text nichts mehr anfangen...

  1. In bezug auf Frage 2, wie kann ich einen Knoten herbei zaubern wie es bei jensten Mailsclients is. Also Knoten name danach in runden oder eckigen Klammern die Anzahl Elemente, jedoch andersfarbig dargestellt.
    Da wird meine obere Methode nicht die richtige sein...

Habe schon so einiges durchgelesen, jedoch nicht die Antwort bekommen die ich gesucht habe...
Vielen Dank an die helfenden User dankesag

Gruss
Danny

03.08.2005 - 22:04 Uhr

Vielen Dank, für den Gedanken Anstoss...

Habe es nun wie folgt gelöst:

        public void getTreeView(int eltern, TreeNode pnd)
        {
            ebene++;

            SqlCommand MyCmd = null;
            SqlDataReader MyReader = null;
            TreeNode nd = null;

            if (eltern == 0)
            {
                MyCmd = new SqlCommand("SELECT kategorie_id, name FROM kategorie WHERE eltern_idfs = 0", MyConn);
                MyReader = MyCmd.ExecuteReader();
            }
            else
            {
                MyCmd = new SqlCommand("SELECT kategorie_id, name FROM kategorie WHERE eltern_idfs = " + eltern, MyConn);
                MyReader = MyCmd.ExecuteReader();
            }

            while (MyReader.Read())
            {
                if (ebene - 1 == 0)
                {
                    nd = new TreeNode(MyReader.GetString(1));
                    treeView2.Nodes.Add(nd);
                }
                else
                {
                    nd = new TreeNode(MyReader.GetString(1));
                    pnd.Nodes.Add(nd);
                }
                getTreeView(MyReader.GetInt32(0), nd);
            }

            ebene--;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            TreeNode tn = null;
            treeView2.Nodes.Clear();
            getTreeView(0, tn);
            treeView2.ExpandAll();
        }

Wie schön diese Lösung ist kann ich schlecht beurteilen.
Kann ich im nachhinein auf die einzelnen Nodes zugreifen? Da ja keine feste Objektnamen vergeben werden?
Daher habe ich es mit einem zusätzlichen Parameter gelöst der beim aufruf der Rekursion übergeben wird...

03.08.2005 - 20:20 Uhr

So ich bin es mal wieder

Wie kann ich zur laufzeit ein TreeView dynamisch erstellen, anahnd von den Kategorien in der Datenbank?

Wie ich dies rekursiv zu lösen habe ist mir klar, und habe ich bereits gemacht, nur das ich das gante als MsgBox dann ausgebe.

        public void getTree(int eltern)
        {
            ebene++;

            SqlCommand MyCmd = null;
            SqlDataReader MyReader = null;

            if (eltern == 0)
            {
                MyCmd = new SqlCommand("SELECT kategorie_id, name FROM kategorie WHERE eltern_idfs = 0", MyConn);
                MyReader = MyCmd.ExecuteReader();
            }
            else
            {
                MyCmd = new SqlCommand("SELECT kategorie_id, name FROM kategorie WHERE eltern_idfs = " + eltern, MyConn);
                MyReader = MyCmd.ExecuteReader();
            }

            while (MyReader.Read())
            {
                for (int i = 0; i != ebene - 1; i++)
                {
                    baum.Append("  ");
                }
                baum.Append(MyReader.GetString(1) + "\r\n");
                getTree(MyReader.GetInt32(0));
            }

            ebene--;
        }
# SQL Tabelle
kategorie_id, name, eltern_idfs

Gibt es keine Eltern ist der Fremdschlüssel 0 ansonsten die Kategorie_id der Eltern.

1 Baum 0
2 Garten 0
3 Apfel 1
4 Beeren 2
5 Birnen 1

Gerne möchte ich daraus ein TreeView erstellen, jedohc bleibe ich an verschiedenen Punkten hangen.

  1. wie vergebe ich den Objekten Namen?
  2. wie kann ich zur laufzeit ein Event Abfangen (Click Ereigniss)
  3. Einzelne Nodes habe ich hinbekommen, jedoch die Subnodes bekomm ich nicht hin beim dynamischen erzeigen. (Von Hand ein statisches TreeView zu kreieren mit Subnodes funktioniert prima...)

Ich hoffe habe klar geschrieben wo meine Probleme liegen.
Nehme gerne jede Hilfe und Tipps in Anspruch

Gruss
Danny

02.08.2005 - 19:24 Uhr

Ja ich arbeite bereits mit der Beta 2 um, die neuen Features, ... etwas kennen zu lernen.

Leider sind mir gerade diese "schönen" komponenten nicht aufgefallen g

Danke an Noodles, genau das was ich gesucht habe 😁