Laden...

Forenbeiträge von Pardasus Ingesamt 63 Beiträge

25.03.2021 - 20:13 Uhr

Vielen Dank, werde ich mir mal ansehen.

25.03.2021 - 19:48 Uhr

Moin zusammen,
ich habe einen Windows Dienst laufen der 24/7 dinge tut. Nun möchte ich mir eine ASP.NET Seite bauen die Informationen darüber anzeigt, was der Dienst den gerade so treibt.
Wie gehe ich das nun am schlauesten an, wenn ich möchte das die beiden miteinander sprechen?

p.s.: Der Dienst schaut sich XML Files an und schieb diese dann unter gewissen bedingen in ein anderes Verzeichnis weiter.

07.09.2019 - 21:50 Uhr

Ups, ja ich meine 2017 natürlich. Vielen Dank für die schnelle Antwort!
Dann brauche ich wohl ein Kostenpflichtiges Update.

07.09.2019 - 21:10 Uhr

Moin zusammen,
auf der Arbeit habe ich eine Pro Lizenz von Visual Studio in der 2018er Version. Kann man hier einfach auf 2019 wechseln oder muss dafür ein Update gekauft werden?

10.08.2018 - 10:51 Uhr

@Khalid
Das ist die Lösung! Ich bin begeistert 😃 nicht nur das ich jetzt mit einer DLL auskomme, es funktioniert auch wunderbar!

Vielen Dank!

10.08.2018 - 10:13 Uhr

@Th69 leider nein, dass hatte ich auch schon gefunden.

@Khalid
Meinst Du die ODP.NET_Managed_ODAC122cR1 bzw. Oracle.ManagedDataAccess.dll ?

10.08.2018 - 08:41 Uhr

verwendetes Datenbanksystem: Oracle

Ich habe ein kleines Programm geschrieben welches kein Installierten Oracle Client benötigt, da im Verzeichnis selbst die passenden DLL liegen. Es läuft auf jeden System, bis auf einem wo ein Oracle 11.2 Installiert ist. Dort sagt er mir, er findet die OraOps12.dll nicht.
Ich habe im Netz einfach keine Lösung gefunden, vielleicht hat hier noch jemand eine Idee?

Fehlermeldung:
************** Ausnahmetext **************
System.DllNotFoundException: Die DLL "OraOps12.dll": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.
bei Oracle.DataAccess.Client.OpsInit.CheckVersionCompatibility(String version)
bei Oracle.DataAccess.Client.OracleInit.Initialize()
bei Oracle.DataAccess.Client.OracleConnection..cctor()

************** Geladene Assemblys ************** mscorlib Assembly-Version: 4.0.0.0. Win32-Version: 4.7.2563.0 built by: NET471REL1. CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll.

BobImport Assembly-Version: 1.0.0.0. Win32-Version: 1.0.0.0. CodeBase: file:///D:/BobImport/BobImport.exe.

System.Windows.Forms Assembly-Version: 4.0.0.0. Win32-Version: 4.7.2558.0 built by: NET471REL1. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.

System Assembly-Version: 4.0.0.0. Win32-Version: 4.7.2558.0 built by: NET471REL1. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.

System.Drawing Assembly-Version: 4.0.0.0. Win32-Version: 4.7.2558.0 built by: NET471REL1. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.

System.Configuration Assembly-Version: 4.0.0.0. Win32-Version: 4.7.2558.0 built by: NET471REL1. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll.

System.Core Assembly-Version: 4.0.0.0. Win32-Version: 4.7.2563.0 built by: NET471REL1. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll.

System.Xml Assembly-Version: 4.0.0.0. Win32-Version: 4.7.2612.0 built by: NET471REL1LAST_B. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll.

Oracle.DataAccess Assembly-Version: 4.122.1.0. Win32-Version: 4.122.1.0. CodeBase: file:///D:/BobImport/Oracle.DataAccess.DLL.

System.Data Assembly-Version: 4.0.0.0. Win32-Version: 4.7.2623.0 built by: NET471REL1LAST_C. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_64/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll.

System.Transactions Assembly-Version: 4.0.0.0. Win32-Version: 4.7.2558.0 built by: NET471REL1. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_64/System.Transactions/v4.0_4.0.0.0__b77a5c561934e089/System.Transactions.dll.

mscorlib.resources Assembly-Version: 4.0.0.0. Win32-Version: 4.7.2558.0 built by: NET471REL1. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.

System.Windows.Forms.resources Assembly-Version: 4.0.0.0. Win32-Version: 4.7.2558.0 built by: NET471REL1. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.

22.07.2018 - 12:48 Uhr

@Abt
der zweite Link hat geholfen 😉 gefällt mir was ich dort sehe.

@Th69
Ja, das habe ich auch probiert. Allerdings bis jetzt ohne Erfolg.

Ich bin gerade ein Stück weiter gekommen. => Hier ≤ hatte jemand ein änhliches Problem und hat unter anderem die "\r"Zeichen entfernt.

Wenn ich nun das erstellen des Triggers in ein separaten SQL Skript lege und dort mit .Trim() die "\r" Zeichen durch ein leeren String austausche, funktioniert es 😃

Jetzt muss ich nur noch ein weg finden wie ich beides in ein SQL Skript wieder bekomme der Übersichtlichst halber.

22.07.2018 - 12:28 Uhr

Danke für den Tip, muss aber zugeben nicht zu verstehen was das macht bzw. wie man dies nutzt.

22.07.2018 - 11:35 Uhr

verwendetes Datenbanksystem: <Oracle 18.2>

Nach viele Stunden des Probierens und des Suchens, seit ihr nun meine letzte Hoffnung.

Ich möchte, das wenn eine Tabelle nicht in der Datenbank vorhanden ist, neu erstellt wird. Dies ist
ja keine große Sache. Auch den Primary Key setzten und eine Sequence erstellen, alles kein Problem über C#.

Aber wenn ich ein Trigger mit einbauen möchte, der die ID Automatisch hochzählt, will das einfach über C# nicht Funktionieren.

Hier mal ein minimal Beispiel:


CREATE TABLE CUSTOMERS 
(
  ID NUMBER NOT NULL 
, NAME VARCHAR2(20) 
, CONSTRAINT CUSTOMERS_PK PRIMARY KEY 
  (
    ID 
  )
  ENABLE 
);

CREATE SEQUENCE CUSTOMERS_SEQ;

CREATE TRIGGER CUSTOMERS_TRG 
BEFORE INSERT ON CUSTOMERS 
FOR EACH ROW 
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF INSERTING AND :NEW.ID IS NULL THEN
      SELECT CUSTOMERS_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;
/

Ich lese das SQL Skript mit C# ein, entferne die Leerzeichen und mache ein COMMIT nach jedem ';'
Aber irgendwie will der Trigger nicht. Klar ich kann auch selbst bei jeden Statement ein 'CUSTOMERS_SEQ.NEXTVAL' machen, aber das irgendwie doof.

Ich habe beim Trigger auch mal die ';' entfernt. Dann wird der Trigger zwar in die DB eingespielt, lässt sich aber nicht Kompilieren, da die ';' fehlen.

HILFE... 😉

09.07.2018 - 18:10 Uhr

Super, danke für den Link!

Ich stimme dir zu @Abt, dass man das Passwort da nicht drin speichern sollte. Darum ja meine frage 😃

08.07.2018 - 20:40 Uhr

verwendetes Datenbanksystem: <Oracle>

Moin

Wir haben bei uns auf der Arbeit nur ein gemeinsamen Git Zugang (lange Geschichte).
Ich habe nun ein Programm, welches sich mit einer Oracle Datenbank Verbindet. Nun möchte ich aber
nicht das Passwort in Klartext dort abspeichern.

Gibt es da ein Trick, wie ich das Passwort in Quelltext "Verschlüsseln" kann?

29.06.2018 - 21:29 Uhr

Vielen Dank für die Links!

Ich hatte dazu bereits im Netz gesucht, aber nur Beispiele gefunden wie man über ein Process auf die arp zugreift.

28.06.2018 - 20:01 Uhr

Ich habe im Internet ein Code-Snippet gefunden mit den man die MAC Adresse über die IP heraus bekommt. Das Funktioniert auch wunderbar, aber geht das auch in "schöner" oder ein Process zu nutzen?

So schaut die Methode aus:


private string GetMacAddress(string ipAddress)
        {
            string macAddress = string.Empty;
            System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
            pProcess.StartInfo.FileName = "arp";
            pProcess.StartInfo.Arguments = "-a " + ipAddress;
            pProcess.StartInfo.UseShellExecute = false;
            pProcess.StartInfo.RedirectStandardOutput = true;
            pProcess.StartInfo.CreateNoWindow = true;
            pProcess.Start();
            string strOutput = pProcess.StandardOutput.ReadToEnd();
            string[] substrings = strOutput.Split('-');
            if (substrings.Length >= 8)
            {
                macAddress = substrings[3].Substring(Math.Max(0, substrings[3].Length - 2))
                         + "-" + substrings[4] + "-" + substrings[5] + "-" + substrings[6]
                         + "-" + substrings[7] + "-"
                         + substrings[8].Substring(0, 2);
                return macAddress;
            }

            else
            {
                return "not found";
            }

17.06.2018 - 21:18 Uhr

Moin

Das "Item Selection Changed Event" wird ausgelöst, wenn sich die Auswahl in einem ListView ändert.
Wenn man in der GUI nun von Zeile A in Zeile B wechselt, wird diese Event drei mal ausgelöst.

  • Zeile A ist Markiert
  • keine Zeile ist Markiert
  • Zeile B ist Markiert

Ich habe eine GUI wo sich einige Label Texte ändern, wenn man in dem ListView einen Eintrag auswählt. Wenn allerdings kein Item in dem ListView ausgewählt ist, wird der Label Text gelöscht.

Alles keine große Sache und läuft auch Wunderbar. Das Problem dabei ist, dass das Label anfängt zu "blinken" wenn man zwischen den Eintragen wechselt.

  • Zeile A ist Markiert ( Label Text = "XYZ" )
  • keine Zeile ist Markiert ( Label Text = "" )
  • Zeile B ist Markiert ( Label Text = "ZXH" )

Das sieht irgendwie doof aus, dieses "Blinken". Wie Programmiere ich es, dass nur wenn wirklich nichts ausgewählt ist, der Label Text auf = "" sich ändert?

06.06.2018 - 22:56 Uhr

Ich war mal so frei und habe den Code leicht korrigiert und um die Ausgabe des Values ergänst.


/// <summary>
/// Diese Methode lädt ein XML-Dokument, geht es hierarchisch durch und fügt jeweils die Value Eigenschaft 
/// eines XML-Nodes in eine TreeView als Node ein
/// </summary>
/// <param name="treeView"></param>
public void XmlToTreeView(TreeView treeView)
{
    XmlDocument myXmlDocument = new XmlDocument();
    myXmlDocument.Load("yourXMLFile.xml");
    treeView.Nodes.Clear();
    XmlRekursivImport(treeView.Nodes, myXmlDocument.DocumentElement.ChildNodes);
}

private void XmlRekursivImport(TreeNodeCollection elem, XmlNodeList xmlNodeList)
{
    TreeNode treeNode = new TreeNode();

    foreach (XmlNode myXmlNode in xmlNodeList)
    {
        if (myXmlNode.Value == null)
        {
            treeNode = new TreeNode(myXmlNode.Name);
        }
        else
        {
            treeNode = new TreeNode(myXmlNode.Value);
        }

        if (myXmlNode.ChildNodes.Count > 0)
        {
            XmlRekursivImport(treeNode.Nodes, myXmlNode.ChildNodes);
        }
        elem.Add(treeNode);
    }
}

13.02.2018 - 23:22 Uhr

WoW, vielen Dank für dein sehr ausführlichen Beitrag und tollen Tipps! Ich habe den Code mal angepasst.
Ist das Dispose() nun auch richtig?


    public class LabelFlash : IDisposable
    {
        private System.Timers.Timer _timer = new System.Timers.Timer(1000);

        /// <summary>
        /// Gibt das Aktuell genutzte Label zurück.
        /// </summary>
        public Label LabelObj { get; } = null;

        /// <summary>
        /// Gibt das Intervall in dem das Label blinken soll in ms zurück oder legt dieses fest.
        /// </summary>
        public double Interval
        {
            get { return _timer.Interval; }
            set { _timer.Interval = value; }
        }

        /// <summary>
        /// Legt fest ob das Label weiter Blinken soll wenn der Text geändert wird. Standard ist Deaktiviert
        /// </summary>
        public bool ChangeStop { get; set; } = false;

        /// <summary>
        /// Legt den Text des Label fest oder ruft diesen ab.
        /// </summary>
        public string Text
        {
            get
            {
                if (LabelObj.InvokeRequired)
                {
                    return (string)LabelObj.Invoke(new Func<string>(() => LabelObj.Text));
                }
                else
                {
                    return LabelObj.Text;
                }
            }
            set
            {
                LabelObj.ForeColor = System.Drawing.Color.Black;

                if (LabelObj.InvokeRequired)
                {
                    LabelObj.Invoke(new Func<string>(() => LabelObj.Text = value));
                }
                else
                {
                    LabelObj.Text = value;
                }
            }
        }

        /// <summary>
        /// Legt den Text des Labels fest und ändert die Farbe auf Rot ab.
        /// </summary>
        public string AlertText
        {
            set
            {
                LabelObj.ForeColor = System.Drawing.Color.Red;

                if (LabelObj.InvokeRequired)
                {
                    LabelObj.Invoke(new Func<string>(() => LabelObj.Text = value));
                }
                else
                {
                    LabelObj.Text = value;
                }
            }
        }

        /// <summary>
        /// Bringt ein Label zum Blinken in einem festgestelten ms Interval.
        /// </summary>
        /// <param name="labelObj">Label weches blinken soll.</param>
        public LabelFlash(Label labelObj)
        {
            this.LabelObj = labelObj;
            _timer.Elapsed += _timer_Elapsed;
            this.LabelObj.TextChanged += LabelObj_TextChanged;
        }

        /// <summary>
        /// Bringt ein Label zum Blinken in dem übergebenen ms Interval.
        /// </summary>
        /// <param name="labelObj">Label welches blinken soll.</param>
        /// <param name="interval">Interval in ms.</param>
        public LabelFlash(Label labelObj, double interval) : this(labelObj)
        {
            _timer.Interval = interval;
        }

        /// <summary>
        /// Startet das Blinken des Labels.
        /// </summary>
        /// <returns></returns>
        public LabelFlash Start()
        {
            _timer.Start();
            return this;
        }

        /// <summary>
        /// Startet das Blinken des Labels.
        /// </summary>
        /// <param name="changeStop">Legt fest ob das Label weiter Blinken soll wenn der Text geändert wird.</param>
        /// <returns></returns>
        public LabelFlash Start(bool changeStop)
        {
            _timer.Start();
            ChangeStop = changeStop;
            return this;
        }

        /// <summary>
        /// Stop das Blinken des Labels und macht es wieder sichtbar.
        /// </summary>
        public void Stop()
        {
            _timer.Stop();
            LabelObj.Visible = true;
        }

        // Wenn Aktiviert, hört das Label auf zu Blinken wenn der Text geändert wird.
        private void LabelObj_TextChanged(object sender, EventArgs e)
        {
            if (ChangeStop)
            {
                Stop();
            }
        }

        // Wird im Defenierten Interval ausgeführt und lässt das Label Asynchron Blinken.
        private void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (LabelObj.InvokeRequired)
            {
                LabelObj.Invoke(new Action(() => _timer_Elapsed(sender, e)));
            }
            else
            {
                LabelObj.Visible = !LabelObj.Visible;
            }
        }

        ~LabelFlash()
        {
            Dispose(false);
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                _timer.Dispose();
            }

            LabelObj.TextChanged -= LabelObj_TextChanged;
            _timer.Elapsed -= _timer_Elapsed;
        }
    }

13.02.2018 - 19:21 Uhr

Erst einmal Danke für das Feedback!

Mir scheint es so, als würdest Du zwei Aufgaben vermischen.
Zum Einen lässt die Klasse das Label blinken und zum Anderen schreibt sie den Text des Labels mit verschiedenen Farben. Abgesehen davon, dass die Farben von außen nicht geändert werden können, hat das Text und Farbe ändern nichts mit dem Blinken an sich zu tun, oder?
Das würde ich daher komplett raus lassen, immerhin verschenkst Du dadurch Flexibilität und erhöhst unnötig die Komplexität.
Abgesehen davon würde das Ändern der Farbe aus einem anderen Thread heraus wahrscheinlich crashen 😉

Da hast Du recht, es sieht aus als würde ich was vermischen. Ich habe ein kleines Programm was im Hintergrund z.b. Daten einliest und es soll Signalisiert werden "Hey ich tun gerade was im Hintergrund". Wenn dann etwas schief läuft, soll der Text aufhören zu Blinken und Rot werden. Damit ich aus einen beliebigen Thread heraus das machen kann, habe ich mir auch gleich noch gedacht das sich das Objekt darum kümmern kann, dass der Text auch wirklich ausgegeben wird (die ganze Invoke Geschichte).
Aus meiner Perspektive sah das alles klar aus und gehört zusammen 😃

Die ChangeStop-Property kannst Du auch automatisch implementieren lassen, das spart eine Zeile Code 😄

Da stehe ich gerade auf dem schlauch, wie meinst Du das?

Ich würde - nur meine subjektive Ansicht - das Label nicht von außen ändern lassen, die Label-Property würde ich also entfernen. Alles was von außen geändert werden kann, musst Du verwalten bzw. Du musst die Änderungen beachten können. Wenn das nicht unbedingt notwendig ist, erhöht es nur die Komplexität ohne wirklichen Gewinn.

Du meinst, das _labelObj sollte nicht nach dem Instanzieren des Objekts änderbar sein? Mmh, das stimmt. Wenn man das möchte, muss man sich ein neues Objekt Instanzieren, dann kann nichts schief gehen. Danke!

Ich persönlich versuche Konstruktoren immer so zu bauen, dass alle Überladungen nichts weiter tun als ihre Parameter aufzubereiten und an einen anderen Konstruktor weiter zu reichen - oder Default-Werte übergeben. Daraus resultiert, dass von vielen Konstruktoren nur Einer die eigentliche Arbeit tut und die Anderen nur weiter leiten. Spätestens bei komplexen Initialisierungen wird das hilfreich.
Du könntest z.B. für den interval-Parameter optional deklarieren und mit einem sinnvollen Default-Wert versehen. Oder die Überladung ohne diesen Parameter gibt diesen Default-Wert weiter.
Das geht natürlich nur, wenn die Initialisierungs-Varianten sich nicht zu stark von einander unterscheiden, aber da muss man dann je nach Situation schauen.

Wie ruft den der eine Konstruktor den anderen auf?

Methoden-Parameter werden mit kleinem ersten Buchstaben geschrieben 😉 Das ist zumindest sehr weit verbreitet, ich glaub Microsoft hat das in einer Guideline veröffentlicht.

Super, danke! 😃 ich bin immer noch dabei mein Stil zu finden. Versuche mich aber sehr an "feste" Regeln zu halten.

Zu den Dispose() mal Grundsätzlich. Da ich bis jetzt sehr kleine, unbedeutsame Anwendung geschrieben habe, habe ich mich nie damit ernsthaft Beschäftigt bei meinen eigenen Objekten.
Klar, wenn ich z.b. ein Objekt benutzt wie FileStream etc. wo ein Dispose() dabie ist, nutze ich diesen auch. Habe aber nie wirklich selbst ein in mein Objekt eingebaut.
Ist vielleicht jetzt der falsche bereich im Forum, aber wie würde ich für diese Objekt von mir ein Dispose() richtig hinterlegen?

12.02.2018 - 21:40 Uhr

@anideath
solltest Du das hier noch Lesen und das Programmieren nicht aufgegeben haben dann Kaufe dir diese Buch "Visual C# 2015 – Grundlagen, Profiwissen und Rezepte".
Ich habe unheimlich viel dadurch gelernt. Wenn man dann noch 1-2 Jahre an Erfahrung Sammelt kommt so langsam brauchbar Code zusammen 😉

12.02.2018 - 21:16 Uhr

Moin,
ich habe mir etwas gebaut, womit ein beliebiges Label Objekt zum Blinken gebracht werden kann und selbst aus einem "fremden" Thread heraus, über das Objekt der Text einfach abgeändert werden kann.

Eigentlich bin ich ganz zufrieden damit, bis auf das Dispose() vielleicht hat da jemand noch ein Tipp für mich? Wenn man nach dem Dispose() z.b. wieder Start() ausführt, kommt eine Fehlermeldung, irgendwie noch unschön. Ich weis das man nach dem Dispose() den Start() nicht wieder ausführen kann 😉 freue mich auf Feedback zum Code.


    public class LabelFlash : IDisposable
    {
        private System.Timers.Timer _timer = new System.Timers.Timer(1000);
        private Label _labelObj = null;
        private bool _changeCanStop = false;

        /// <summary>
        /// Gibt das Aktuell genutzte Label zurück oder legt dieses fest.
        /// </summary>
        public Label Label
        {
            get { return _labelObj; }
            set
            {
                _labelObj.Visible = true;
                _labelObj = value;
            }
        }

        /// <summary>
        /// Gibt das Intervall in dem das Label blinken soll in ms zurück oder legt dieses fest.
        /// </summary>
        public double Interval
        {
            get { return _timer.Interval; }
            set
            {
                _timer.Interval = value;
            }
        }

        /// <summary>
        /// Legt fest ob das Label weiter Blinken soll wenn der Text geändert wird. Standard ist Deaktiviert
        /// </summary>
        public bool ChangeStop
        {
            get { return _changeCanStop; }
            set { _changeCanStop = value; }
        }

        /// <summary>
        /// Legt den Text des Label fest oder ruft diesen ab.
        /// </summary>
        public string Text
        {
            get
            {
                if (_labelObj.InvokeRequired)
                {
                    return (string)_labelObj.Invoke(new Func<string>(() => _labelObj.Text));
                }
                else
                {
                    return _labelObj.Text;
                }
            }
            set
            {
                _labelObj.ForeColor = System.Drawing.Color.Black;

                if (_labelObj.InvokeRequired)
                {
                    _labelObj.Invoke(new Func<string>(() => _labelObj.Text = value));
                }
                else
                {
                    _labelObj.Text = value;
                }
            }
        }

        /// <summary>
        /// Legt den Text des Labels fest und ändert die Farbe auf Rot ab.
        /// </summary>
        public string AlertText
        {
            set
            {
                _labelObj.ForeColor = System.Drawing.Color.Red;

                if (_labelObj.InvokeRequired)
                {
                    _labelObj.Invoke(new Func<string>(() => _labelObj.Text = value));
                }
                else
                {
                    _labelObj.Text = value;
                }
            }
        }

        /// <summary>
        /// Bringt ein Label zum Blinken in einem festgestelten ms Interval.
        /// </summary>
        /// <param name="LabelObj">Label welches blinken soll.</param>
        public LabelFlash(Label LabelObj)
        {
            _labelObj = LabelObj;
            _timer.Elapsed += _timer_Elapsed;
            _labelObj.TextChanged += _labelObj_TextChanged;
        }

        /// <summary>
        /// Bringt ein Label zum Blinken in dem übergebenen ms Interval.
        /// </summary>
        /// <param name="LabelObj">Label welches blinken soll.</param>
        /// <param name="Interval">Interval in ms.</param>
        public LabelFlash(Label LabelObj, double Interval)
        {
            _labelObj = LabelObj;
            _timer.Interval = Interval;
            _timer.Elapsed += _timer_Elapsed;
            _labelObj.TextChanged += _labelObj_TextChanged;
        }

        /// <summary>
        /// Startet das Blinken des Labels.
        /// </summary>
        /// <returns></returns>
        public LabelFlash Start()
        {
            _timer.Start();
            return this;
        }

        /// <summary>
        /// Startet das Blinken des Labels.
        /// </summary>
        /// <param name="ChangeCantStop">Legt fest ob das Label weiter Blinken soll wenn der Text geändert wird.</param>
        /// <returns></returns>
        public LabelFlash Start(bool ChangeCantStop)
        {
            _timer.Start();
            _changeCanStop = ChangeCantStop;
            return this;
        }

        /// <summary>
        /// Stop das Blinken des Labels und macht es wieder sichtbar.
        /// </summary>
        public void Stop()
        {
            _timer.Stop();
            _labelObj.Visible = true;
        }

        // Wenn Aktiviert, hört das Label auf zu Blinken wenn der Text geändert wird.
        private void _labelObj_TextChanged(object sender, EventArgs e)
        {
            if (_changeCanStop)
            {
                Stop();
            }
        }

        // Wird im Defenierten Interval ausgeführt und lässt das Label Asynchron Blinken.
        private void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (_labelObj.InvokeRequired)
            {
                _labelObj.Invoke(new Action(() => _timer_Elapsed(sender, e)));
            }
            else
            {
                _labelObj.Visible = !_labelObj.Visible;
            }
        }

        protected virtual void Dispose(bool disposing)
        {
            if(disposing)
            {
                ((IDisposable)_timer).Dispose();
                _timer = null;
            }
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(true);
        }
    }

17.12.2017 - 22:48 Uhr

Vielen Dank für die Hinweise! Jetzt habe ich erst einmal was zu lesen 😉

17.12.2017 - 21:07 Uhr

Moin,
ich habe mal ein Simples Objekt gebastelt was einfach nur ein Label Blinken lässt in 1 Sek. Takt.
Ich bin nie so wirklich schlau draus geworden, wie man so eine Objekt von Aufbau "richtig" macht. In vielen Beispielen fließt eine Persönliche Note mit ein.
Wie würde man mein kleines Objekt ordentlich Aufbauen und was sollte man mit einem Kommentar versehen und wann ist es überflüssig?
Wo fügt man Leerzeilen ein? Gibt es da eine "regel" oder macht das jeder wie er es für "hübsch" Empfindet?

Ganz nebenbei, würde das Objekt auch noch schlanker gehen?


    public class LableBlinking
    {
        private Label _Label = null;
        private string _Text = string.Empty;
        bool _Show = false;
        System.Timers.Timer timer = new System.Timers.Timer(1000);

        /// <summary>
        /// Lässt ein Label Blinken
        /// </summary>
        /// <param name="label"></param>
        public LableBlinking(Label label)
        {
            _Label = label;
            _Text = label.Text;

            timer.Elapsed += Timer_Elapsed;
        }

        private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if(_Label.InvokeRequired)
            {
                _Label.Invoke(new Action(() => Timer_Elapsed(sender, e)));
            }
            else
            {
                _Label.Text = _Show ? _Text : string.Empty;
                _Show = !_Show;
            }
        }

        // Startet den Timer fürs Blinken.
        public LableBlinking Start()
        {
            timer.Start();
            return this;
        }

        // Beende den Timer fürs Blinken.
        public void Stop()
        {
            timer.Stop();
            _Label.Text = _Text;
        }
    }

26.02.2017 - 11:29 Uhr

Habe den Fehler nun finden können...

Im Code vom Desinger steht folgende Zeile für das Form1


this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

wenn ich diese Lösche, sieht der Button wieder normal aus und auch der Abstand stimmt. Aber das scheint ja kein Fehler zu sein sonder gewollt.

26.02.2017 - 11:22 Uhr

Anchor: Top, Left
Margin: 3; 3; 3; 3;

So wie es von VS vorgegeben wird also quasi unverändert.

26.02.2017 - 11:17 Uhr

Hier noch ein schönes Beispiel wie stark ein Button verändert wird, nach dem Compilieren.

26.02.2017 - 11:09 Uhr

Moin,
ich habe da etwas was mich schon sehr nervt.

Habe bereits VisualStudio 2016 / 2017 RC und C# SharpDevelop Final und die Aktuelle Beta probiert. Überall tritt folgender Fehler auf.

Ich starte ein neues WinForm Projekt. Wenn ich dann ein Button, PictureBox ect. unten rechts im Designer schiebe und es kompiliere, ist es immer stark nach rechts verschoben und teilweise nicht mehr sichtbar. Habe ein Bild angehängt welches diese etwas verdeutlichen.

Es ist zwar nicht ganz deutlich zu erkenne auf den Bild, aber die Form rutscht immer nach rechts etwas. Im Designer sieht immer alles super aus und nach dem Compilieren eben verschoben.

Ich bin ratlos...

08.01.2017 - 21:24 Uhr

Ich habe diese nun so gelöst


public class FileSplitter
{	
	public void ReadFiles(List<FileInfo> files)
	{
		foreach (var file in files) {
			var filialName = Path.GetFileNameWithoutExtension(file.FullName);
			var datenWithoutEOF = new List<string>();
			foreach (var line in File.ReadAllLines(file.FullName)) {
				if(line.Length > 1)
					datenWithoutEOF.Add(line.Replace("\x1A", ""));
			}
			var tage = datenWithoutEOF.GroupBy(line => line.Substring(34,2) + "." + line.Substring(36,2) + "." + line.Substring(38,4));
			foreach (var tag in tage) {
				File.WriteAllLines(filialName + "_" + tag.Key + ".txt", tag);
			}
		}
	}
}

Dieser Code läuft nun wunderbar, aber ich bin mir sicher, ihr habt noch ein paar Tips für mich.
Ich muss zugeben, wie ich das mit dem DateTime einbinden soll, nicht ganz verstanden zu haben.

Dadurch, dass ich nun das EOF Zeichen aus der Datei entfernt habe, kann ich mit Substring auch wieder exakt Arbeiten.

Warum EOF-Zeichen?
Ein anderes Programm, kopiert mehrerer Dateien aneinander. Komischerweise taucht danach das EOF Zeichen in der Datei auf.
Es verschiebt mir dann ein paar Zeilen um ein Zeichen nach rechts und am ende der Datei findet sich auch noch ein einzelnes EOF Zeichen.
Ich habe eine ganze weile gebraucht, um heraus zu bekommen, was das überhaupt für ein Zeichen ist.

08.01.2017 - 20:07 Uhr

@MrSparkle / @T-Virus
da habt ihr recht. Aber muss ich dann nicht wieder in ein String zurück Konventieren, wenn ich diese als Dateinamen verwenden will?

Für das EOF Interessiere ich mich nicht direkt. Die Dateien, die ich verarbeite, werden von einen anderen Programm oft aneinander gehängt. Dann gibt es immer mal eine Zeile in der Datei, wo das EOF Zeichen die ganze Zeile nach rechts verschiebt.

08.01.2017 - 15:47 Uhr

@T-Virus
das mit den DatumParsen hatte ich schon umgestellt (siehe weiter oben). Suche mir das Datum nun mit


var tag = block.Select(b => Regex.Match(b, "[0123][0-9][01][0-9](20)[01][0-9]").Value);

Jetzt wo ich drüber nachdenke, wäre es ja wirklich viel leichter, würde ich mit ReadAllLines alles einlesen und dann mit Linq Datums-Gruppen Bilden und diese dann einfach Speicher.

Was mich aber dennoch Interessiert, warum das


yield return currentLine.Replace("\x1A", "");

nicht funktioniert. In einem anderen Programm, lässt sich damit das EOF Zeichen aus einem string einwandfrei entfernen...

p.s.: @T-Virus, ich hatte es nicht DataBlock sonder DateBlock genannt 😉

08.01.2017 - 13:09 Uhr

@Sir Rufo
ups 😉 da hast du recht, aber bis jetzt ist mir eine Datei noch nicht unter gekommen wo ein Datum nach einem anderen, nochmals vorgekommen ist.

Hast du eine schnelle Lösung diese vielleicht komplett auszuschließen?

p.s.: suche das Datum nun mit einem RegEx => [0123][0-9][01]0-9[01][0-9] das sollte für dieses Jahrtausend reichen 😉 ich hoffe ja nicht, dass jemand in nächsten Jahrtausend das Programm noch nutzt...

08.01.2017 - 12:54 Uhr

@ujr
das mit den Try / Catch war eine gute Idee. Habe den Fehler nun finden können 😃

Diese Dateien enthalten hin und wieder ein EOF Zeichen "\x1A". welches ich mit


yield return currentLine.Replace("\x1A", "");

herausfilter. In älteren Version von dem Programm, hat diese auch immer gut Funktioniert. Jetzt filtert er aber das Zeichen nicht raus. Was Probleme im Nachgang gibt.

08.01.2017 - 12:25 Uhr

@ujr
Ja ist sie, wie schon ganz oben geschrieben. Taucht der Fehler innerhalb der


foreach (var block in dateBlocks) {
   var tag = block.Select(b => "(" + b.Substring(34,2) + "." + b.Substring(36,2) + "." + b.Substring(38,4) + ")");
   File.WriteAllLines(fileName + "_" + tag.First() + ".txt" , block);
}

auf. Ohne diese, durchläuft er alle Dateien.

Habe nun festgestellt, dass er eine schon fertige Datei nochmals neu schreibt. Obwohl diese bereits schon fertig ist.

das spiegelt sich auch im Debugger wieder. Nur weis ich nicht, warum er diese macht. Es ergibt kein Sinn...

08.01.2017 - 12:12 Uhr

@ujr
das ist ja mein Problem. Es hängt nicht, macht keine Fehlermeldung sonder hört einfach auf Dateien zu erstellen.
Habe die Quelldateien schon gegen andere Daten ausgetauscht, aber er hört einfach mitten drinnen auf bzw. ist wohl fertig.

Habe nun festgestellt, dass er eine schon fertige Datei nochmals neu schreibt. Obwohl diese bereits schon fertig ist.

08.01.2017 - 10:58 Uhr

@Th69
das mit .ToList() hat leider nicht geklappt.
Dann erzeugt er mir einfach nur Kopien der Dateien, ohne die Tage zu filtern. Aber durchläuft immer noch nicht alle Dateien.

Habe auch mal das "using" komplett weggelassen und ein "reader.Close()" am ende gehangen. Leider ohne erfolg. Das gleiche Ergebnis.
Habe aber auch das gefühl, das je mehr Dateien er bearbeite hat kreuz und quer durch die Dateien springt beim schreiben bzw. Lesen.

EDiT: habe nun mal komplett das Einlesen durch


var dateBlocks = dateBlock(File.ReadAllLines(file.FullName));

ersetzt. Aber das hat auch nichts geändert. Es Liegt wohl ausschließlich am schreiben oder an einlesen der Blöcke.

08.01.2017 - 07:49 Uhr

Moin,
ich habe hier etwas kurioses wo ich einfach nicht den Fehler finden kann.
Ich habe simple Text-Dateien. In einer Datei können mehrere Tage enthalten sein. Diese lasse ich komplett einlesen, auf einzelne Tage Splitten und neu Speichern.
Das Programm läuft wunderbar, ohne jegliche Fehlermeldung. Aber wenn er ca. 25-30 Dateien geschrieben hat, hört er einfach auf. Ich habe auch die Dateien, die eingelesen werden, ausgetauscht ohne das sich an dem verhalten etwas ändert.

Ich konnte es auf die stelle reduzieren, in der die Datei geschrieben wird. Irgendwo dort muss der Fehler sein. Ohne diese stelle, durchläuft er alle Dateien. Also irgendwo in der "foreach (var block in dateBlocks)" schleife passiert es.


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace FileSplitter
{
	public class FileCheck
	{
		public void ReadFiles(List<FileInfo> files)
		{
			foreach (var file in files) {
				var dateBlocks = dateBlock(ReadFileLines(file.FullName));
				var fileName = Path.GetFileNameWithoutExtension(file.FullName);
				
				foreach (var block in dateBlocks) {
					var tag = block.Select(b => "(" + b.Substring(34,2) + "." + b.Substring(36,2) + "." + b.Substring(38,4) + ")");
					File.WriteAllLines(fileName + "_" + tag.First() + ".txt" , block);
				}
			}
		}
		
		private IEnumerable<string> ReadFileLines(string file)
		{
			using (var reader = File.OpenText(file)) {
				string currentLine = reader.ReadLine();
				while (currentLine != null) {
					yield return currentLine.Replace("\x1A", "");
					currentLine = reader.ReadLine();
				}
			}
		}
		
		private IEnumerable<IList<string>> dateBlock(IEnumerable<string> lines)
		{
			IList<string> currentBlock = null;
			string findDate = null;
			
			foreach (var line in lines) {
				if(currentBlock == null) {
					findDate = line.Substring(34,8);
					currentBlock = new List<string>();
				}
				
				if(findDate == line.Substring(34,8))
					currentBlock.Add(line);
				else {
					yield return currentBlock;
					currentBlock = new List<string>();
					findDate = line.Substring(34,8);
					currentBlock.Add(line);
				}
			}
			yield return currentBlock;
		}
	}
}

28.12.2016 - 21:34 Uhr

Moin,
angenommen ich habe eine Objekt in dem ein Timer läuft der alle x Sek. etwas prüft. Fällt die Prüfung positiv aus, feuert dieses ein Event ab.
Das Ergebnis wird z.b. in einer ListBox ausgegeben. Das läuft auch wunderbar mit Hilfe von ListBox.Invoke(...); da der Timer ja Asynchron läuft.

Kann man nicht schon in Objekt das Event so weiter geben, dass im z.b. MainForm ein Invoke gar nicht mehr nötig ist?

08.12.2016 - 21:26 Uhr

Moin,
ich habe in Access ein Feld in dem ein Datum stehen kann. Wenn ich per C# und einem DataSet hier etwas eintrage, kann ich diese noch mit null befüllen und das Feld bleibt leer.

Soweit läuft alles nach plan. Nun habe ich eine Methode mit der ich Datensätze Updaten. Das klappt auch wunderbar.
Nun möchte ich aber das Datum Feld nur Aktualisieren, wenn über die Update Methode auch ein Wert mitgegeben wird. Nun kann man DateTime nicht auf null prüfen. Im Netz sehe ich oft, dass man mit DateTime? diese prüfen kann. Mein CSharpDeveloper kommt damit aber nicht klar.

Nun könnte ich in die Datenbank statt eines Datum Feldes, einfach ein Textfeld nutzen. Dann hätte ich ein String der sich sehr leicht prüfen lässt. Aber dann müsste ich hin und her Konvertieren und ich kann dann auch nicht so einfach nach Datum Sortieren in der Datenbank.

Kurz: wie könnte ich ein DateTime ohne das ? prüfen und warum kann ich das ? nicht nutzen? Auch wenn ich in Access nichts stehen habe, bekomme ich trotzdem ein Wert beim auslesen übergeben und DateTime kann garnicht null sein?

04.12.2016 - 13:11 Uhr

AAhh... so ein mist 😉 ok vielen Dank. Mit dem Escape hat es geklappt.

Verwirrend ist aber, dass es bei zweistelligen "nummern" (Strings) funktioniert ohne Escape.

04.12.2016 - 12:31 Uhr

Moin,
ich bin nun etwas verwirrt. Habe ein kleines Tool was paar Daten aus Access ausließt.
Mit C# bearbeite ich diese Daten in ein DataSet.

Nun möchte ich Kundendaten Aktualisieren. Dazu müssen diese erst mal gefunden werden und werden dann über das DataSet gezielt bearbeitet.


DataRow dr = kundenDS.Tables["KundenDetails"].Select("KundenNr=" + kunde.KundenNr).First();

Jetzt wird es etwas spucki... wenn die Kundennummer nur zwei stellen hat, wird diese auch gefunden und kann gezielt bearbeitet werden. Wenn die Kunden-Nr. aber mehr als zwei stellen hat, findet DataRow diese nicht mehr.

KD-Nr. 234 -> dr = null
KD-Nr. 17 -> dr = Kundendaten

Das geht mir irgendwie nicht in Kopf... was´n hier los?

27.11.2016 - 11:30 Uhr

Ich habe es 😃


		private IEnumerable<IList<string>> EnumerateBlocks( IEnumerable<string> source )
		{
			IList<string> currentBlock = null;
			foreach ( string line in source )
			{
				if ( line.StartsWith( "00021" )) {
				    	if ( currentBlock != null ) yield return currentBlock;
				    	currentBlock = new List<string>();
				}
				
				if(currentBlock != null) currentBlock.Add( line );
			}
			if ( currentBlock != null ) yield return currentBlock;
		}

Nur wenn etwas mit 00021 beginnt, wird es in ein block geladen. Alles andere wird ignoriert.

27.11.2016 - 11:22 Uhr

Da gebe ich dir recht, aber das stellt mich gerade vor einen neuen Problem. Jede Datei beginnt immer mit zwei zeilen die mich nicht Interessieren bevor es mit 00021 los geht.

Nun könnte ich im using vom StreamReader einfach zwei mal reader.ReadLine() ausführen und danach mit den while anfangen, aber geht das nicht auch schöner?

27.11.2016 - 08:21 Uhr

Konnte das Problem nun lösen dank

-> NullReferenceException

Wenn man sich den Text durchliest, klingt es auch sehr logisch. Das Exception wurde ausgelöst, weil die ersten zwei zeilen der txt Datei nicht mit 00021 begonnen haben.

Vielen Dank an euch! Jetzt macht alles, was es soll 😃

26.11.2016 - 12:10 Uhr

Das mit "foreach (var zeile in inhalt)" ist nur zum Testen ob es funktioniert.


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace Verarbeitung
{
	public partial class MainForm : Form
	{
		string datei = Directory.GetCurrentDirectory() + @"\test.txt";
		
		public MainForm()
		{
			InitializeComponent();
			
			button1.Click += (s,e) => this.Close();
			button2.Click += (s,e) => Einlesen();
		}
		
		private void Einlesen()
		{
			var inhalt = (EnumerateBlocks(FileLesen(datei)));

			foreach (var zeile in inhalt) {
				listBox1.Items.Add(zeile);
			}
		}
		private IEnumerable<IList<string>> EnumerateBlocks( IEnumerable<string> source )
		{
			IList<string> currentBlock = null;
			foreach ( string line in source )
			{
				if ( line.StartsWith( "00021" )) {
				    	if ( currentBlock != null ) yield return currentBlock;
				    	currentBlock = new List<string>();
				    }
				    currentBlock.Add( line );
				}
			if ( currentBlock != null ) yield return currentBlock;
		}
		
		private IEnumerable<string> FileLesen(string path)
		{
			using (StreamReader reader = File.OpenText(path)) {
				string currentLine = reader.ReadLine();
				while (currentLine != null) {
					yield return currentLine;
					currentLine = reader.ReadLine();
				}
			}
		}
	}
}

26.11.2016 - 11:49 Uhr

Ich habe das mal so umgesetzt, es kommt aber weiterhin die Fehlermeldung

Fehlermeldung:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

für "line" in der EnumerateBlocks

26.11.2016 - 09:59 Uhr

@Sir Rufo

Brauche jetzt doch noch mal deine Hilfe. Bekomme das irgendwie nicht eingebunden oder ich verstehe da irgendwas noch nicht richtig. Kannst du mir ein kleines Beispiel geben?



var bloecke = EnumerateBlocks(File.ReadAllLines(datei));

private IEnumerable<IList<string>> EnumerateBlocks( IEnumerable<string> source )
{
  IList<string> currentBlock = null;
  foreach (string line in source)
  {
   if (line.StartsWith("00021"))
   {
    if (currentBlock != null) yield return currentBlock;
				
    currentBlock = new List<string>();
   }
				
   currentBlock.Add(line);
  }
  if (currentBlock != null) yield return currentBlock;
}

Fehlermeldung:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Er mag das " line " nicht. Komme aber einfach nicht drauf.
Übergebe ich eigentlich eine List<string> oder ein Array[] ?

25.11.2016 - 22:56 Uhr

@Sir Rufo Danke 😃 sowas habe ich gesucht!

Ich muss zugeben mich noch nie mit IEnumerable beschäftigt zu haben.
Habe mir nun ein paar Beispiele angesehen und auf dein Code ca. 15 Min. gestarrt und es jetzt auch verstanden und bin begeistert!

Kurz kann man sagen, dass IEnumerable ermöglich das man etwas mit z.b. Foreach durchlaufen kann, richtig?

Das mit dem currentBlock ist genau das was ich gesucht habe was die ganze sache noch Perfektioniert 😃 nachdem ich wie gesagt 15 Min. drauf gestarrt habe, konnte ich förmlich die Blöcke sehen wie sie entstehen 😛

Eine frage habe ich aber noch:


foreach(var block in EnumerateBlocks( Datei-Inhalt als Array ))
{
 foreach(var zeile in block)
 {
  ...zeile...
  }
}

Damit frage ich die Blöcke dann doch ab, oder?

p.s.: was heist eigentlich yield return? Ein Return ohne abbruch?

25.11.2016 - 15:56 Uhr

Das mit dem Objekt ist eine gute Idee. Ich baue mir dort eine Methode ein, mit der ich neue zeilen übergeben kann. Wenn 00021 wieder vorkommt muss er beim Objekt nur einmal die Methode speicher öffnen und das gleiche Objekt wieder neu erstellen oder noch besser, die Daten im Objekt wieder löschen.
Im Objekt arbeite ich dann mit eine Liste die dann die Information auswertet.

Vielen Dank 😃

25.11.2016 - 15:20 Uhr

Ist gar nicht so einfach zu erklären. Es klingt anfangst ja auch ganz einfach, immer wenn 00021 auftaucht, einen neuen Datensatz in der DB anfangen. Aber so einfach ist es nicht, irgendwie will mir einfach nicht die Lösung einfallen.

Wenn in der Text Datei jede Zeile eine Datenbank eintrag wäre, wäre es ja Kinderleicht. Aber ein Datensatz geht ja über mehrere Zeilen.

Mal ganz banal gesagt


foreach (var zeile in zeilen) {
 if(zeile == "00021") {
  zeile a = dbeintrag
  zeile b += dbeintrag
  zeile c += dbeintrag
  zeile d += dbeintrag
 }
}

Wenn zeile e wieder 00021 ist, müsste der dbeintrag geschrieben werden und es geht wieder von vorne los. Eigentlich müsste wenn 00021 gefunden wird, die nächsten z.b. 4 Zeilen mit ausgewertet werden und die foreach Schleife müsste dann in der 5 Zeile erst weiter machen.

Sorry, gar nicht so einfach zu beschreiben 😉 er müsst also solange die Zeilen "Sammeln" bis wieder 00021 auftaucht und erst dann den DB Eintrag machen.

25.11.2016 - 14:43 Uhr

Moin,
ich Programmiere in C# und bin auf der suche nach einer Strategie, wie ich folgendes einlesen kann.

Beispiel.txt

  1. 000215545345TestMuster
  2. 45346666gegergeg463HFDFDF9999
  3. 545454GGGGGhhhh
  4. 430xxxhhrhTester123
  5. 00021343453TestMmmma
  6. 453453450000geeea3333DDD
  7. gergeg4345435
  8. 9999444GGGMusterTester

In der Datei sind Information die ich in eine Datenbank bringen will. Ich habe hier einfach nur etwas Blödsinn eingegeben, keine echten Daten 😉
Ein neuer Datensatz beginnt immer z.b. mit 00021 und dann folgen weiter Information.

Ich lese die ganze Datei in z.B. daten[] ein. Dann Iterieren ich mit foreach durch alle Zeilen der Datei.

Wie ich die Zeilen selbst auswerte, und in die DB bringe weis ich. Aber mir fehlt irgendwie die Strategie, wie ich immer wenn 00021 auftaucht, einen neuen Datensatz in der DB anfange. Ein Datensatz kann über mehrere Zeilen gehen.

Jemand eine Idee?

10.11.2016 - 22:09 Uhr

Klasse! Vielen Dank!

Die Lösung liegt darin, die gewünschten GUI-Zugriffe in eine neue Methode zu packen und diese Methode mit Control.Invoke oder Control.BeginInvoke aufzurufen. Das Control.Invoke/BeginInvoke bewirkt, dass die Methode nicht vom aufrufenden Thread, sondern vom GUI-Thread ausgeführt wird.

Super Links, wieder schlauer geworden 😃