Laden...

Forenbeiträge von MrWasabi Ingesamt 33 Beiträge

20.11.2018 - 17:23 Uhr

Zeig mal deinen Code, ne vermutung habe ich schon, vor allem weil du anscheinend mit MYSQL genau das gleiche gemacht hast.

23.01.2018 - 08:42 Uhr

Hi UltraEdit,

sehe ich das richtig das du die Email über den link (A) "erstellst" und dann
mit dem Standard-Email-Client versendest/versenden möchtest ?

mfg
Wasabi

12.01.2018 - 15:55 Uhr

Schau dir den von Pinki verlinken Artikel an.

private void CmdUebertragen_Click(object sender, EventArgs e)
        {
            //Übertragung an Form1

            FrmDokPrint Form1uebergang = new FrmDokPrint();
            Form1uebergang.Anform1Str1 = TxtStrasse1.Text;
        }

Du erstellst eine neue Instanz von FrmDokPrint, diese siehst du aber nicht da Form1uebergang unsichtbar ist. Änder das mal in :

private void CmdUebertragen_Click(object sender, EventArgs e)
        {
            //Übertragung an Form1

            FrmDokPrint Form1uebergang = new FrmDokPrint();
            Form1uebergang.Show();
            Form1uebergang.Anform1Str1 = TxtStrasse1.Text;
        }

dann siehst du was wirklich passiert ...

mfg
Wasabi

10.01.2018 - 14:40 Uhr

Ja das sollte die ID des Objekts sein damit du nicht die JSON-Daten nach der ID durchsuchen musst.

10.01.2018 - 12:30 Uhr

Natürlich kommt das ein bisschen auf die Komplexität der Daten an aber ich würde
vorerst eine "einfache" Lösung anstreben.

z.B. das original Objekt Serialisieren und ablegen z.b. als JSON


public class ObjectDump
    {
        public int Id { get; set; }
        public int UserId { get; set; }
        public DateTime DumpTime { get; set; }
        public int ObjectKey { get; set; }
        public string ObjectTypeName { get; set; }
        public string ObjectJsonDump { get; set; }
    }

Dann könntest du später via Reflection die Änderungen nachvollziehen
und ggf. Teile des Objects oder das ganze Object wieder herstellen.

Natürlich kenne ich den Umfang deiner Daten und auch die Performance-Anforderung nicht 😃

10.01.2018 - 11:37 Uhr

@pinki
Willst du denn die Veränderung nur sehen oder ggf. auch wieder rückgängig machen ?!?

01.09.2017 - 14:01 Uhr

Hey,

also die Systemvorraussetzungen sind wohl nicht das Problem 😃

Hast du denn VS, wie von unconnected vorgeschlagen , schon mal im Log Modus gestartet ?

Klingt dumm, aber , schon mal als Admin ausgeführt ?

Vielleicht das Projekt mal auf ne andere Platte gepackt und von dort Probiert ?

mfg

Wasabi

01.09.2017 - 13:19 Uhr

Hi,

ich hab zwar nur die Community-Version aber kann keinen deiner Abstürze bestätigen...

Auf was für einem System hast du denn ? Win-Ver, CPU, RAM ?

mfg
Wasabi

30.08.2017 - 15:50 Uhr

Etwas mehr Code braucht man schon um dir zu helfen, z.B. wo ruft du FindAnchestor auf

und ....

Wenn ich den Sourcecode so kopiere, wie er dort erwähnt wird, kriege ich direkt eine ArgumentNullException an der Stelle:

Versuch fremden Code nicht einfach zu kopieren sondern schreib ihn besser ab, dann fallen Fehler schon etwas füher auf.

mfg

Wasabi

29.08.2017 - 16:12 Uhr

Bzw. kennt wer eine andere Möglichkeit, wo man zwischen manuell und automatisch wechseln kann. Es geht um die Darstellung auf einem Monitor.

Naja es gibt mehrere Möglichkeiten dies umzusetzen. Ich habe dir mal ein Beispiel auf codepen
bereit gestellt. Schön ist es nicht aber darum gehts ja grad garnicht....

DemoSlideShow

mfg
Wasabi

29.08.2017 - 09:36 Uhr
function switchPrev() {
            $("#SlideshowImages > div:gt(0)").hide();
            $("#SlideshowImages > div:first").fadeOut(2000).prev().fadeIn(2000).end().appendTo("#SlideshowImages");
        }

Deine Funktion ermittelt das erste Div-Element in #SlideshowImages, jQuery´s prev()
liefert dir das element davor auf der gleichen Ebene, aber davor ist kein Element mehr ....

https://api.jquery.com/prev/

mfg Wasabi

18.07.2017 - 15:47 Uhr

Dann mach aus einem Full-Stack einen "nur" Entwickler bitte.

Das man im Bereich Software nicht "ALLES"-können kann, ist heute
wohl nachvollziehbar 😃

mfg
Wasabi

18.07.2017 - 15:19 Uhr

zum Thema

Full Stack zähle ich persönlich nicht, da ich persönlich der Ansicht bin: es gibt heute keine Full Stack Entwickler mehr.

wie nennt man denn den Esel der alles machen muss (Frontend, Backend, Windows, Web, Datenbank), weil es nur einen Entwickler im Haus gibt ?

mfg
ein Esel

07.07.2017 - 11:08 Uhr
DataAdded?.Invoke(this, new DataAddedEventArgs<MyDataClass>(ds));

ist die "neue" Kurzschreibweise für ....


var handler = DataAdded;
if(handler!=null)
{
 handler.Invoke(this, new DataAddedEventArgs<MyDataClass>(ds));
}

welche .Net Version peilst du an ?

05.07.2017 - 16:45 Uhr

Vielleicht könntest du mal mehr Code posten,
ich vermute der Fehler liegt "woanders" ....

mfg
Wasabi

11.04.2017 - 08:57 Uhr

Hey CaptainAndre,

wenn man dein Programm auf das kürzt was wirklich im Moment wirklich macht,
sähe es so aus

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace CCX_Installation
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ProcessStartInfo P = new ProcessStartInfo();
                P.FileName = "powershell";
                P.Arguments = "Set-ExecutionPolicy unrestricted";
                Process.Start(P);
                Process.WaitForExit(P);
            }

            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
    }
}

Du hast zwar eine Liste mit allen Programmen die du ausführen willst und
auch eine Liste mit allen Argumenten die du zum Start angeben willst benutz aber nur
jeweils das letzte Element in den Listen weil du die Properties "FileName" und
"Arguments" immer wieder überschreibst.

Wenn du direkt vor "Process.Start(P);" mal


Console.WriteLine(P.FileName);
Console.WriteLine(P.Arguments);

einfügst wirst du sehen was ich oben beschrieben habe.

Versuch dein Installations-Programm doch mal ohne Listen umzusetzen, denn deren
Arbeitsweise & Verwendung solltest du dir nochmal ansehen !

ich bin blutiger Anfänger und versuche mir eine Installationsroutine für einen speziellen PC zu basteln

Auch wenn der Zugang zu C# einfach scheint sollte man sich vor Augen führen das
es eine Programmiersprache ist und nichts mit Basteln zu tun hat.

Bitte lies dich in die Grundlagen der Sprache ein !

mfg

MrWasabi

10.04.2017 - 18:02 Uhr

Öhm.....

vll. stehe ich ja aufm Schlauch aber wenn das dein Code ist startest du
genau einen Prozess und zwar die "powershell" mit
dem argument "Set-ExecutionPolicy unrestricted"

Oder hast du den Code fürs Forum verändert ?!?

mfg

Mr.Wasabi

10.04.2017 - 13:19 Uhr

Hallo DaNeubi,

eine Settings Window würde ich immer mit
"settings_window.ShowDialog();" anzeigen,
der rest der Anwendung ist dann nicht mehr zugänglich
solange der Dialog "Settings Window" geöffnet ist.

Somit kann nicht mehr wie ein Settings Window geöffnet werden.

IMO die saubere Variante 😃

06.04.2017 - 16:47 Uhr

Hallo Ntc,

du musst das Value auf NULL prüfen also


if(oSheets("Tabelle1").Range("C" + n).Value !=null)

der Aufruf "oSheets("Tabelle1").Range("C" + n).Value" gibt dir wenn vorhanden
ein Objekt zurück das eine Funktion "ToString()" implementiert,
gibt "Value" wie in deinem Fall kein Objekt zurück also "NULL" gibt
es auch keine "ToString()"-Funktion .... 😃
und schon kracht es.

Bitte schau dir die von MrSparkle verlinkten Artikel an !

mfg
Mr.Wasabi

[Edit]Text schön[/Edit]

06.04.2017 - 16:29 Uhr

Google treffer in 2 Minuten,

bevor du das Value benutzt solltest du auf NULL prüfen 😃

Google-Treffer z.B. ->Googletreffer

09.03.2017 - 15:02 Uhr

Also ohne alle Parameter deiner Anwendung zu kennen (Forms/WPF/ASP.NET), kann
ich hier nur ins blaue schiessen. Aber vielleicht gibt es dir wenigstens eine Idee.


public bool IsNameValid(string hostName)
{
    List<Computer> loadedComputers = bindingSourceComputer.DataSource as List<Computer>;
    if(loadedComputers!=null)
    {
         return !loadedComputers.Where(c =>c.HostName.Equals(hostName)).Any();
    }
    return false;
}

oder innheralb deines Controllers über EntityFramework


   public bool ContainsHostName(string hostName)
  {
     return db.Computers.Where( c => c.HostName == hostName).Any();
  }

14.02.2017 - 11:45 Uhr

Versuchs dochmal mit


Task[] tasks = new Task[] {
    new Task(()=>{object1.run();}),
    new Task(()=>{object2.run();}),
    new Task(()=>{object3.run();}),
    new Task(()=>{object4.run();})
};
12.01.2017 - 18:26 Uhr

Also wo fange ich an .....

Ohne entsprechende Vorkenntnisse in C# so ein Projekt zu verwirklichen ist einfach nicht "Ergebnis-orientiert", schon gar nicht wenn du das auch noch alleine machen möchtest.

Ich würde sagen du hast folgende Optionen :

A) In C# und OOP einarbeiten = Lesen -> Probieren -> Scheitern -> Nachlesen -> Probieren .......
und dein Chef muss halt warten bis zu soweit bist ( dein Praktikum wird dann schon einige
Monde in der Vergangenheit liegen )

B) Ihr bleibt bei Excel und du machst ein Praktikum wo du auch was beigebracht bekommst

C) Schlag deinem Chef vor eine CRM/WAWI-Software zu nutzen,
bei deren Installation kannst du schon mal sehen was so ein Projekt
am Ende können müsste, kannst bei Konfiguration & Installation ein bisschen Erfahrung
mitnehmen.

Hier könnte man vielleicht auf http://www.cao-faktura.de/produkte/cao-faktura schauen oder https://www.jtl-software.de/Warenwirtschaft-JTL-Wawi um nur zwei zu nennen die es gibt.
Es gibt hinreichend Auswahl -> Google -> suchen : "open source wawi"

Aber auch hier solltest du dich vorher informieren welche zum Unternehmen passt.

D) Wenn von deinem gelernten PHP noch was hochsprudeln sollte, damit kann man eine CRUD - Kundenliste erstellen, aber auch hier gilt Grundlagen sind das "A" und "O".

Wenn du C# lernen willst, bleib am Ball !

mfg
Wasabi

29.12.2016 - 14:18 Uhr

Haupsache ihr habt Spass 😃

29.12.2016 - 11:51 Uhr


public interface ISeasonGreeting
{
    PleasentYear SwapDate(DateTime toDate);
}

public class MyCSharpGreetings : ISeasonGreeting
{
    public PleasantYear SwapDate(DatetTime toDate)
    {
         return new PleasantYear(){
              Success = "unlimited",
              Income = "max possible",
              Healthiness = "well",
              Bugs = null,
              CodeRevisions = null,
              Greeting = "Happy new year !"
         };
    }
}


21.12.2016 - 14:58 Uhr

So könnte es mit explizitem StreamReader aussehen.... (wie gehabt ohne Fehlerbehandlung)


        public static List<ListItem> FileToItemsExplicit(string fileName)
        {
            List<ListItem> Result = new List<ListItem>();

            string RowFromReader = String.Empty;

            using (System.IO.FileStream fileStream = new System.IO.FileStream(fileName, System.IO.FileMode.Open))
            {
                using (System.IO.StreamReader streamReader = new System.IO.StreamReader(fileStream))
                {
                    while (streamReader.Peek() != -1)
                    {
                        RowFromReader = streamReader.ReadLine();

                        if (RowFromReader.IndexOf("PP") == 0 || RowFromReader.IndexOf("TP") == 0)
                        {
                            string[] Tocken = RowFromReader.Replace(',','.').Split(';');

                            Result.Add(new ListItem()
                            {
                                TpIdentifier = Tocken[0],
                                TpRotation = Convert.ToDouble(Tocken[1]),
                                TpPositionX = Convert.ToDouble(Tocken[2]),
                                TpPositionY = Convert.ToDouble(Tocken[3]),
                                TpColorValue = 1,
                                TpType = 1
                            });
                        }
                    }
                }
            }

            return Result;
        }

mfg
MrWasabi

20.12.2016 - 16:22 Uhr

Da war ich wohl nicht schnell genug.

Man könnte es auch so Umsetzen, wenn man mal davon absieht das hier keinerlei Fehlerbehandlung implementiert ist....

public class ListItem
    {
        public string TpIdentifier { get; set; }
        public double TpRotation { get; set; }
        public double TpPositionX { get; set; }
        public double TpPositionY { get; set; }
        public int TpColorValue { get; set; }
        public int TpType { get; set; }
    }

    public class DemoHandling
    {
        public static List<ListItem> FileToItems(string fileName)
        {
            List<ListItem> Result = new List<ListItem>();

            IEnumerable<string> LinesInFile = System.IO.File.ReadLines(fileName);

            foreach (string line in LinesInFile.Where(x => x.IndexOf("PP") == 0 || x.IndexOf("TP") == 0))
            {
                string[] Tocken = line.Replace('.', ',').Split(';');

                Result.Add(new ListItem()
                {
                    TpIdentifier = Tocken[0],
                    TpRotation = Convert.ToDouble(Tocken[1]),
                    TpPositionX = Convert.ToDouble(Tocken[2]),
                    TpPositionY = Convert.ToDouble(Tocken[3]),
                    TpColorValue = 1,
                    TpType = 1
                });
            }

            return Result;
        }
    }
01.12.2016 - 16:35 Uhr

Danke das war der richtige Hinweis, 😃

und ein Lösungsansatz für alle die es vll. interessiert,
ich prüfe hier gegen die "Signature" Property



using System.Management;

...
...

    bool TargetDiskfound = false;

    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");

    foreach (ManagementObject mo in searcher.Get())
    {
        if(Check(mo["Signature"]))
        {
            TargetDiskfound = true;
            break;
        }
    }
...
...
...


vll. auch nützlich zu Win32_DiskDrive : Win32_DiskDrive class

Danke Danke !

01.12.2016 - 15:11 Uhr

Hallo Stefan,

danke für deine Antwort 😦

Um Dir deine Bedenken zu nehmen die wichtigen Verkehrsdaten die wiederherzustellen sind
sind eigentlich nur die Sql-Daten, und ja Lösung ist vll. nicht optimal, aber die
Wiederherstellung funktioniert einwandfrei !

01.12.2016 - 14:58 Uhr

Hi liebe Foristi,

direkt vorab, ich hab keine Kategorie gefunden in die mein Eintrag passen könnte,
somit veröffentliche ich diesen hier.

Unser SBS 2008 Server wird täglich auf eine USB-Platte gesichert, d.h. ein Mitarbeiter wechselt jeden Abend die am Server hängende Sicherungsplatte, hierbei treten
2erlei Fehler auf,

A) der Mitarbeiter vergisst die Platte zu wechseln
B) beim Wechsel der Platte wird diese nicht erkannt ( blinkt und brummt aber der Server "merkt" es nicht )

Nun wollte ich mit meinem Programm checken ob eine Platte gewechselt wurde oder nicht,
bzw. ob eine der Sicherungsplatten am Server angeschlossen ist oder nicht.

Generell ist das Auslesen der Angeschlossenen Laufwerke über System.IO.DriveInfo kein Problem, aber die Sicherungsplatten werden keinem Laufwerk zugeordnet und erscheinen
nicht in der Collection die System.IO.DriveInfo.GetDrives(); in der Datenträgerverwaltung
des Servers ist die angeschlossene Platte zu sehen.

Habt ihr einen Tipp wie ich die Platte trotztem mit C# "Bordmitteln" finden kann ?

mfg
Wasabi

02.08.2012 - 13:48 Uhr
  1. Was steckt den hinter der Application Instanz die du nutzt.
  2. Hast du denn zusätzliche Verweise eingebunden ?

Guck mal hier -> An Introduction to Programming Outlook 2003 Using C#: Outlook 2003 as an Object Model

31.07.2012 - 16:58 Uhr

Hi dN!3L,

danke für deine Antwort ! In der Tat ist es so das ich in der Aufrufliste selbst
hätte sehen können wo der Fehler liegt, danke für den Hinweis !!!!

Das Problem ist das der Tree sehr einseitig gefüllt wird, und somit
durch viele TreeNodes navigiert werden muss, dies führt schliesslich dazu
das ich die Maximale Recursionstiefe erreiche und VS die entsprechende
StackOverflowException auslöst. Bestätigt hat sich dies dadurch das die
Exception bei geänderter Sortierung an anderer Stelle im Code auftritt.

Hier ist bei mir beim Debugging ab ca. 4656 Recursionen Ende im Release
funktioniert es einwandfrei.

Dein Hinweis mit mit dem Comparer ist nicht unberechtigt, der Tree soll nur eigentlich
ganz andere Daten aufnehmen und der entsprechende Vergleichs-Delegate für die Daten
soll nur -1,0 oder 1 zurückgeben.

Danke nochmals für den Denkanstoß, hätte ich selbst drauf kommen müssen !

mfg
MrWasabi

Jetzt gehts ans optimieren 😃 würg

31.07.2012 - 12:46 Uhr

Hallo liebe Forumsgemeinde,

beim Testen meier BinTree-Klasse erhalte ich in meiner Konsolen-Test-Anwendung einen Stackoverflow Fehler den mir Visual Studio bei der verwendung der Funktion System.String.Compare markiert.


  private void AddAtNode(BinTreeNode<T> Node, T Obj)
        {
            if (Node != null)
            {
                int CompRes = Comparer(Node.Data[0], Obj);  // <---- Hier Meckert Visual Studio 
             // Comparer verweist als delegate auf System.String.Compare
...........

Wobei Node.Data[0] nicht null ist und Obj nicht null !

Ich fülle meinen BinTree mit ca. 24.000 Strings mit einer Länge von 1 bis max 35 Zeichen.

Es scheint mir so als ob der BinTree ein Übergewicht bekommt,
denn füge ich die Daten in einer anderen Reihenfolge in den BinTree,
wird keine StackOverflowException ausgelöst.

Warum kann ich die StackOverflowException eigentlich nicht abfangen ?
Kann mir jemand erklären warum das so passiert ?

Sorry es ist echt viel Code aber zum selbst ausprobieren habe ich einfach alles angehangen.

mfg

MrWasabi

Fehlermeldung:
System.StackOverflowException wurde nicht behandelt.
{Der Ausdruck kann nicht ausgewertet werden, weil sich der aktuelle Thread in einem Stapelüberlaufzustand befindet.}

Der Test Code :


public static void SampleTest(List<String> Data)
        {
            try
            {
                Console.WriteLine("Start Mem : {0}", GC.GetTotalMemory(true));

                BinTree<String> Tree = new BinTree<string>(String.Compare);

                Console.WriteLine("AfterTreeCreate Mem : {0}", GC.GetTotalMemory(true));
                
                DateTime StartFill = DateTime.Now;

                foreach(string s in Data)
                {
                    Tree.Add(s);
                }

                TimeSpan T = DateTime.Now - StartFill;

                Console.WriteLine("Fill the Tree took {0} time", T.ToString());
                
                Console.WriteLine("AfterTreeFill Mem : {0}", GC.GetTotalMemory(true));

                Console.WriteLine("Tree holds {0} items Minor/Major {1}/{2}", Tree.NodesCount, Tree.MinorNodes, Tree.MajorNodes);

                Console.ReadKey();

                Console.WriteLine("Start Traversing Tree");
                DateTime S = DateTime.Now;
                foreach (string s in Tree.GetValues(BinTree<string>.FlowDir.ASC))
                {
                    string X = s;
                }
                Console.WriteLine("Taversing ASC took {0}", DateTime.Now - S);
                Console.ReadKey();
                S = DateTime.Now;
                foreach (string s in Tree.GetValues(BinTree<string>.FlowDir.DESC))
                {
                    string X = s;
                }
                Console.WriteLine("Taversing DESC took {0}", DateTime.Now - S);
            }
            catch (Exception ex)
            {
                Console.WriteLine("-------------------------");
                Console.WriteLine("an error occured : " + ex.Message);
                Console.WriteLine("-------------------------");

            }

        }

Der BinTree und die BinTreeNodes sind folgendermaßen implementiert :


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace myBinTree
{
    public class BinTreeNode<T>
    {
        public T[] Data;
        public BinTreeNode<T> Left = null;
        public BinTreeNode<T> Right = null;
        public BinTreeNode<T> Parent = null;
        public BinTreeNode(T Obj,BinTreeNode<T> P)
        {
            Parent = P;
            Data = new T[] { Obj };
        }

        public int DataCount
        {
            get
            {
                return Data.Length;
            }
        }

        public delegate int Compare<T>(T A, T B);
        public delegate void Invoke<T>(T A);

    }

    public class BinTree<T>
    {
        private BinTreeNode<T> Root = null;
        private BinTreeNode<T>.Compare<T> Comparer;

        public BinTree(BinTreeNode<T>.Compare<T> CompareDelegate)
        {
            if (CompareDelegate == null) throw new Exception("BinTree can#t be initialized without CompareDelegate");
            Comparer = CompareDelegate;            
        }

        public int NodesCount
        {
            get
            {
                if (Root != null)
                {
                    return CountNodes(Root);
                }
                return -1;
            }
        }

        public int MinorNodes
        {
            get
            {
                if (Root.Left != null)
                {
                    return CountNodes(Root.Left);
                }
                return -1;
            }
        }

        public int MajorNodes
        {
            get
            {
                if (Root.Right != null)
                {
                    return CountNodes(Root.Right);
                }
                return -1;
            }
        }

        private int CountNodes(BinTreeNode<T> StartNode)
        {
            int R = 0;
            R += StartNode.DataCount;
            if (StartNode.Right != null) R += CountNodes(StartNode.Right);
            if (StartNode.Left != null) R += CountNodes(StartNode.Left);
            return R;
        }

        public void Add(T Obj)
        {
            if (Root != null)
            {
                AddAtNode(Root, Obj);
            }
            else
            {
                Root = new BinTreeNode<T>(Obj, null);
            }
        }

        private void AddAtNode(BinTreeNode<T> Node, T Obj)
        {
            if (Node != null)
            {
                int CompRes = Comparer(Node.Data[0], Obj);
                if (CompRes == 0)
                {
                    T[] NData = new T[Node.DataCount + 1];
                    int i;
                    for (i = 0; i < Node.DataCount; i++)
                    {
                        NData[i] = Node.Data[i];
                    }
                    NData[i] = Obj;
                    return;
                }

                if (CompRes == 1)
                {
                    // Object is minor;
                    if (Node.Left != null)
                    {
                        AddAtNode(Node.Left,Obj);
                    }
                    else
                    {
                        Node.Left = new BinTreeNode<T>(Obj, Node);
                    }
                    return;
                }

                if (CompRes == -1)
                {
                    // Object is major
                    if (Node.Right != null)
                    {
                        AddAtNode(Node.Right, Obj);
                    }
                    else
                    {
                        Node.Right = new BinTreeNode<T>(Obj, Node);
                    }
                    return;
                }

                throw new Exception("unexpected compareresult expexted [-1/0/1] result is " + CompRes +" !");

            }
            else
            {
                throw new Exception("Node to insert at is null");
            }
        }

        private BinTreeNode<T> MostLeftNode()
        {
            BinTreeNode<T> Cursor = Root;
            while (Cursor.Left != null)
            {
                Cursor = Cursor.Left;
            }
            return Cursor;
        }

        private BinTreeNode<T> MostRightNode()
        {
            BinTreeNode<T> Cursor = Root;
            while (Cursor.Right!= null)
            {
                Cursor = Cursor.Right;
            }
            return Cursor;
        }

        public enum FlowDir
        {
            ASC=0,
            DESC=1
        }

        public List<T> GetValues(FlowDir Dir)
        {
            List<T> Result = new List<T>();
            switch (Dir)
            {
                case FlowDir.ASC:
                    Result.AddRange(GetASC(MostLeftNode()));
                    break;
                case FlowDir.DESC:
                    Result.AddRange(GetDESC(MostRightNode()));
                    break;
            }
            return Result;
        }

        private List<T> GetASC(BinTreeNode<T> Start,bool GetMinorNodes = false,BinTreeNode<T> CommingFrom = null)
        {
            if (Start == null) throw new Exception("node is null");
            List<T> Result = new List<T>();

            // 1: Minor Nodes.Data
            if (GetMinorNodes && Start.Left != CommingFrom && Start.Left != null)
            {
                Result.AddRange(GetASC(Start.Left, true,Start));
            }

            // 2: focused Nodes.Data
            Result.AddRange(Start.Data);

            // 3: major Nodes.Data
            if (Start.Right != CommingFrom && Start.Right != null)
            {
                Result.AddRange(GetASC(Start.Right, true, Start));
            }
            
            // 4: parent Nodes.Data
            if (Start.Parent != CommingFrom && Start.Parent!=null)
            {
                    Result.AddRange(GetASC(Start.Parent, false,Start));
            }

            return Result;
        }

        private List<T> GetDESC(BinTreeNode<T> Start, bool GetMajorNodes = false, BinTreeNode<T> CommingFrom = null)
        {
            if (Start == null) throw new Exception("node is null");
            List<T> Result = new List<T>();

            // 1: major Nodes.Data
            if (GetMajorNodes && Start.Right != CommingFrom && Start.Right != null)
            {
                Result.AddRange(GetDESC(Start.Right, true, Start));
            }
            
            // 2: focused Nodes.Data
            Result.AddRange(Start.Data);

            // 3: minor Nodes.Data
            if (Start.Left != null && Start.Left != CommingFrom)
            {
                Result.AddRange( GetDESC(Start.Left,true,Start));
            }
            
            // 4: parent Nodes.Data
            if(Start.Parent != CommingFrom && Start.Parent!=null)
            {
                Result.AddRange(GetDESC(Start.Parent,false,Start));
            }

            return Result;
        }


    }

}