Laden...

Forenbeiträge von inflames2k Ingesamt 2.298 Beiträge

24.08.2016 - 15:04 Uhr

Was denn für ein Serverfehler? Und hätte ein Serverfehler nicht in einer Exception enden müssen?

24.08.2016 - 08:58 Uhr

Hallo myworld,

ich habe deinen Quelltext mal 1 zu 1 übernommen, das Select angepasst und einen ConnectionString auf eine unserer Datenbanken verwendet.

Dein Code, so wie er ist funktioniert und liefert auch die Daten zurück. Mir scheint das Problem hier an anderer Stelle zu liegen.

Bist du dir sicher, dass deine DataTable "NULL" ist und nicht einfach nur keine Zeilen enthält?

29.07.2016 - 16:48 Uhr

Hallo,

ich rate dir davon ab 1000 oder mehr Schaltflächen zu erstellen. An deiner Stelle würde ich da einen anderen Ansatz versuchen.
*Daten von DB abrufen *dynamisch in der Zeichnung den Namen eintragen *bei klick auf die Zeichnung das Quadrat berechnen das geklickt wurde *zugehörige Daten (siehe Schritt 1) ermitteln *GPS-Koordinate ermitteln *Position speichern

29.07.2016 - 16:37 Uhr

Man kann deinen Text echt schwer außeinander Pflücken. Korrigiere mich wenn ich etwas falsches schreibe. Folgende gegebenheiten hast du:
*Mehrere TabPages *Steuerelemente auf den TabPages *Status (Aktiv; Sichtbar) für die TabPages und deren Steuerelemente wird von der Datenbank abgerufen *Nach dem Speichern von Eingaben werden die Status aktuell von der DB abgerufen *Neue Status werden zunächst nicht korrekt verarbeitet *Bei manuellem erneuten Wechsel auf die jeweilige TabPage werden alle Status korrekt verarbeitet

Sofern dies alles richtig ist, wäre etwas Code interessant. Speziell wie du mit den Status-Daten umgehst. Ist der Ansatz eventuell einfach zu kompliziert?

Ich wäre das ganz simpel angegangen (wenn ich sowas über Datenbank löse):Datenbank hält für jede TabPage den Index und die Information ob die TabPage anzuzeigen ist
{
]Datenbank hält für jedes Control den Index der TabPage und die Eigenschaften Enabled sowie Visible

*Bei Start der Anwendung werden die Status ermittelt *Zuweisung der Eigenschaften für die einzelnen Controls *Bei der Speicherung von Daten werden die Status durch Trigger / durch die gespeicherte Prozedur aktualisiert *Nach dem Speichern werden die Status erneut ermittelt *Zuweisung der Eigenschaften für die einzelnen Controls

In Code dann etwa wie folgt:


private Dictionary<string, TabPage> _hiddenTabs = new Dictionary<string, TabPage>();

private void RefreshControlStates()
{
     var tabPageStates = this._dblayer.GetTabPageStates();
     var controlStates = this._dblayer.GetControlStates();

     foreach(var controlState in controlStates)
     {
         TabPage tab = this.tabControl.TabPages[controlState.TabIndex];
         foreach(Control ctrl in tab.Controls)
         {
                if(ctrl.Name.Equals(controlState.Name))
                {
                       ctrl.Visible = controlState.Visible;
                       ctrl.Enabled = controlState.Enabled;
                }
         } 
     }

     foreach(var tabState in tabPageStates)
     {
           if(tabState.Hidden)
           {
                 if(this.tabControl.TabPages.Contains(tabState.Name))
                 {
                      TabPage tab = this.tabControl.TabPages[controlState.TabIndex];
                      this.tabControl.TabPages.Remove(tab);
                      this._hiddenTabs.Add(tabState.Name, tab); 
                 }                
           }
           else
           {
                if(this._hiddenTabs.ContainsKey(tabState.Name))
                {
                      TabPage tab = this._hiddenTabs[tabState.Name]);
                      this._hiddenTabs.Remove(tabState.Name);
                      this.tabControl.TabPages.InsertAt(tabState.Index, tab);
                }
           }
     }
}

15.07.2016 - 15:16 Uhr

Wie Jamikus bereits sagte ist dein Ansatz eher schlecht.

Sauberer wäre hier das Lesen der CSV in eine eigene Klasse auszulagen und das Ergebnis an die Form zurück zu geben.

Je nach dem in welcher Form du die Daten ausgibst kannst du sie ja bereits geeignet zurück geben.

Als grobes Beispiel:


public class SettingsCSVReader
{
     private string _filePath;

     public CSVReader(string filePath)
     {
          _filePath = filePath;
     }

     public Settings ReadSettings()
     {
           // do read stuff
     }
}

public partial class Form1: Form
[
    private void btn_oeffnen_Click(object sender, EventArgs e)
    {
          OpenFileDialog opf = new OpenFileDialog();
          if(opf.ShowDialog() == DialogResult.OK)
          {
               SettingsCSVReader reader = new SettingsCSVReader(opf.FileName);
               this.Settings = reader.ReadSettings();
          }
    }
}

13.07.2016 - 10:54 Uhr

Und übrigens:

Do not use the underscore character (_).
(
>
)

LaTino

Ich weiß nicht. - Auf der Suche nach Guidelines für höhere .NET Versionen taucht der Punkt irgendwie nicht mehr mit auf.

27.05.2016 - 16:16 Uhr

Nun, bezüglich deiner Antwort auf meine Aussagen fällt mir eigentlich nichts mehr ein. - Ich habe ja nichts von "Data"-Klassen geschrieben. Es ging ja eher speziell um das auslesen von Daten aus einer _Data_Table.

Je nach Kontext ist "DataItem" eigentlich auch gar kein so schlechter Klassenname. - In der Regel hat man aber genauere Bezeichner wie "UserData" oder "ProductInfo".

Wie dem auch sein mag. Überdenke das ganze noch einmal und nimm dir unsere Tipps zu Herzen.

27.05.2016 - 12:59 Uhr

Selbst bei 4000 Zeilen würde es mehr als 5 Minuten in Anspruch nehmen. - Bei 4000 Zeilen reden wir ja schon von mehreren Klassen mit einigen Methoden.

Gibt auch Ausnahmen wo eine Methode so viele Zeilen hat, aber darauf gehen wir hier besser nicht ein, weils ein Graus ist

An meiner Aussage die einzelnen Komponenten für die Vorstellung zu nutzen ändert sich allerdings aus meiner Sicht nichts. Meinetwegen halt runter geprügelt auf Klassenebene. - Ich nehme bei 4K LoC einfach mal an wir reden hier von etwa 10 Klassen? - Je nach Umfang auch mehr.

27.05.2016 - 11:45 Uhr

Moment, du sollst Komplexe Software in 5 Minuten vorstellen und das Design an der tafel skizzieren? Gewagte Aufgabe für einen 5 Minuten-Zeitraum.

Für das beschriebene würde ich nur die Teilkomponenten beschreiben. Also eine Grafik an die Tafel mit den einzelnen Komponenten und wie die zusammen spielen. - Dazu erzählen welche Aufgaben durch welche Komponenten erfüllt werden.

  • Damit wirst du zwar schon 5 Minuten sprengen. - Aber detaillierter geht in 5 Minuten garnicht. -
27.05.2016 - 11:39 Uhr

Hallo,

ist die Einordnung als "Helferklasse" wirklich notwendig oder lässt sich die funktionalität mit einer eigenen "richtigen" Klasse beschreiben?

In eigenen Namespaces "System" zu verwenden, wird am Ende nur verwirrend für dich. Darauf würde ich verzichten.

Dann eher ein Namespace in der Richtung "IC.Math" für Klassen mit Bezug auf Mathematik / Funktionen mit Bezug auf Mathematik.

Ich frage mich sowieso schon seit längerem wer sich das Prinzip "Helperklasse" ausgedacht hat und die Klassen dann auch noch entsprechend benamst. Die Klassen haben meist eine tragende Rolle und stellen bestimmte Funktionalität bereit. Helferklassen zum Auslesen von DataTables würde ich z.B. eher "DataTableReader" nennen als "DataTableHelper". - Vorallem da eher klar wird, wozu denn die Klasse da ist.

26.05.2016 - 10:22 Uhr

Die Anzeige von "ungelesenen" Beiträgen ist ja sowieso immer eine Gradwanderung. - Da gibt es die, die es schöner fänden wenn ungelesene Beiträge solang so markiert wären, wie nichts anderes gesagt wurde und auf der anderen Seite die, die erwarten dass ungelesene Beiträge für die sie sich sowieso nicht interessieren nach einer gewissen Zeit nicht mehr hervorgehoben werden. Einen perfekten Mittelweg wird man hier nicht finden.

26.05.2016 - 08:08 Uhr

Ok, du bist selbst dahinter gekommen. Wollte gerade schreiben, dass die meißten Scanner in der freien Wildbahn das Lesen eines Barcodes mit einem Enter bestätigen.

25.05.2016 - 16:08 Uhr

Das wird direkt auch nicht funktionieren, da z.B. bei "3 +" ja noch nicht die 2. Zahl bekannt ist.
Hier müsste man dann die
>
verwenden, also "3 4 +".

Nö, da muss man halt nur aufpassen?

-> Eingabe erste Zahl
-> Eingabe Plus
    -> Bereits eine Berechnung vorhanden? 
           ->Rechne zusammen.
-> Eingabe zweite Zahl
-> Eingabe Mal
    -> Bereits eine Berechnung vorhanden?
           -> Rechne zusammen.
-> Eingabe dritte Zahl
25.05.2016 - 11:19 Uhr

Ja, das verhalten stört mich auch schon eine Weile. - Allerdings habe ich in den Kategorien, die für mich wichtig sind auch ein Abo, damit ich per E-Mail Benachrichtigt werde wenn es neue Beiträge gibt. So kann ich im nachhinein wenigstens noch nachvollziehen welche Themen neu waren.

Sollte es wiedererwarten einfach sein, die Markierung "gelesen" so anzupassen dass nur wirklich gelesene Beiträge so markiert sind, wäre das allerdings auch für mich erfreulich.

19.05.2016 - 16:56 Uhr

Ich bin mir jetzt nicht zu 100% sicher, aber sollte das nicht auch mit den Charts aus System.Windows.Forms.DataVisualization funktionieren?

11.05.2016 - 11:11 Uhr

Was genau willst du erreichen, im Gegensatz zu dem was passiert? Ich kann deiner Ausführung nicht ganz folgen.

10.05.2016 - 15:47 Uhr

Dann tausche doch FocusLeave durch LostFocus bei den Controls?

10.05.2016 - 14:12 Uhr

Ich habe mir gerade mal eine kleine Sample-Applikation erstellt. Verlasse ich darin die Textbox und klicke zum Beispiel auf eine andere Anwendung, wird LostFocus definitiv ausgelöst.

Auch habe ich mal ein zweites Formular mit einem Button hinzugefügt. - Hier wird das LostFocus auch sofort ausgelöst, wenn ich auf den anderen Dialog wechsle.

Das Sample ist im Anhang.

10.05.2016 - 10:06 Uhr

Gut, ich dachte ich hätte mich einfach blöd ausgedrückt. - Bin beruhigt.

Hallo Franky,

ich habe vorhin geschrieben, dass du das Timer.Tick im Konstruktor binden sollst und aus deiner Methode rausnehmen sollst.


public class MyForm
{
      public MyForm()
      {
          t1.Tick += new EventHandler(t1_tick);
      }

     void RecordsCSV(String file)
     {
          if (progressBar1.Value == progressBar1.Maximum) // Record bereits einmal ausgeführt
          {
                progressBar1.Value = 0;
                Delete_rows();
                timerCount = 0; // Counter wieder auf 0 setzen

          }

          try
          [
                double intervall = (1 / double.Parse(textBox8.Text)) * 1000; // Umrechnung von Hz in ms
                t1.Interval = Convert.ToInt32(intervall); ; //Bsp: 500 ms = 0,5 Sekunden

                t1.Start();
                progressBar1.Minimum = 0;
                progressBar1.Maximum = int.Parse(textBox7.Text);
                progressBar1.Step = 1;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
}



10.05.2016 - 09:09 Uhr

Hallo,

das liegt daran, dass du das Event Timer.Tick mehrfach abonierst. Binde das Event am besten fürs erste im Konstruktor. Wenn du nämlich den Button noch einmal drückst, wirst du die Werte 3 fach erhalten.

Also raus mit


 t1.Tick += new EventHandler(t1_Tick); //Diese Methode wird dann alle X Sekunden aufgerufen

aus dem Try-Block.

10.05.2016 - 08:52 Uhr

Dann prüf mal ob alle DLL's korrekt aktualisiert werden bei der Veröffentlichung. Klingt für mich schwer dannach dass die Einstiegs-DLL (Service.asmx.cs) nicht aktualisiert wird.

Wird denn auch alles veröffentlicht? Speziell wenn du in den IIS veröffentlichs klappt das oft nicht, da spezielle Schreibberechtigungen erforderlich sind.

10.05.2016 - 08:32 Uhr

Durch manipulation lässt sich meine these nicht reproduzieren. Das dauert im normal fall

Hast du denn mal das offensichtliche probiert? Was auch schon genannt wurde. Einfach deutlich weniger Speicher für die Java Runtime bereitstellen?

Sollte dort nämlich bei deiner Progressbar oder ähnlichem das Problem liegen müsste es deutlich eher krachen!

Und wenn alle Stricke reisen, dann nimm doch die Variante die Exception zu fangen und samt Stacktrace zu loggen.

  • Desweiteren, zeige doch mal den Code wo du deine Progressbar fütterst. -
04.05.2016 - 13:11 Uhr

Hallo,

ist eigentlich relatvi einfach:


public bool UpdateIncident(string nummer, string nachricht, out Exception exception)
{
    exception= null;
    // ...
   catch(Exception exc)
   {
        exception = exc;
   }   
}

04.05.2016 - 09:41 Uhr

Nach langem überlegen habe ich auch eine Lösung, die m.E. nach funktioniert. - Bin mal gespannt, wie die erste gepostete Lösung im Vergleich zu meiner aussieht.

03.05.2016 - 11:05 Uhr

Wie stark ist denn die Abweichung vom von dir berechneten Schnittpunkt?

02.05.2016 - 15:59 Uhr

Hallo Garzec,

verwende wie angesprochen PointF, in diesem werden Koordinaten als Float-Werte eingefügt.

02.05.2016 - 15:36 Uhr

Hallo,

du kannst den Dienst mit Hilfe der ServiceController-Klasse starten und anschließend den Wert in der Registry ändern.

Der ServiceController stellt dabei entsprechende Methoden zum Start des Dienstes auf dem Remote-Rechner bereit.

29.04.2016 - 13:04 Uhr

Ein wenig Eigeninitiative solltest du dir angewöhnen. Das findet man in der Regel ganz einfach durch Suchen im Internet. Das einfachste wäre:


var distinctCollection = myCollection.Distinct().ToList();

alternativ:


var distinctCollection = myCollection.Distinct();
var myNewCollection = new List<string>(distinctCollection);

noch weiter alternativ:


var distinctCollection = myCollection.Distinct();
var myNewCollection = new List<string>();
myNewCollection.AddRange(distinctCollection);

29.04.2016 - 10:54 Uhr

Du musst natürlich die größe deiner Linien manuell nachberechnen, wenn sich die Chartgröße ändert.

Am einfachsten kommst du da wohl, wenn du das Prozentual machst. - Nimm die Standardmaße des Charts und definiere die Linien-Längen. Bei größenänderung berechnest du die Prozentuale Änderung der Größe des Charts und wendest das auf die Linien an.

29.04.2016 - 08:48 Uhr

Das ist doch auch relativ einfach? Bei der Liste hast du die Count-Property. IEnumerable<T> hat dafür die Erweiterungsmethode "Count()".


var distinctValues = values.Distinct();
Console.WriteLine("Anzahl: " + distinctValues.Count());

EDIT: Übrigens setze C#-Code bitte in die entsprechenden Tags.

29.04.2016 - 08:33 Uhr
  1. eine Series einfügen, die nicht in der Legende erscheint, welche aber außerhalb des Anzeigebereichs liegt.

Gleiches habe ich auch schon versucht. Das funktioniert nicht. - Im Chart werden nur Punkte angezeigt die sich innerhalb des Diagrammes befinden.

  1. Mit Hilfe des Mittelpunkts und des Radius des Charts, meinen Ausguss mit DrawLine zu zeichnen.

Das wird deine Option sein, mit der du arbeiten musst.

Frage zu 2.: Gibt es eine halbwegs einfache Möglichkeit, den Mittelpunkt und den Radius zu ermitteln, von dem ausgehend ich meinen Ausguss zeichnen könnte?

Unter der Annahme, dass du die Größe deines Chartcontrols kennst ist das doch kein Problem? Den Mittelpunkt bekommst du da ja mit einfacher Mathematik. Den Radius habe ich in meinem Fall über folgende Formel definiert:


Radius = Mittelpunkt.X - breite / 2;

In meinem Fall passt das. Es könnte allerdings sein, das du da manuell etwas nachbessern musst.

Anmerkung:
Das Chart wird auotmatisch mit dem Fenster skaliert, d.h. die Lösung müsste Dynamisch sein. Beim einfügen einer Series ist dies kein Problem, aber ich könnte mir vorstellen, dass es bei meinem zweiten Lösungsansatz schwierig wird.

Sollte eigentlich kein Problem sein, musst nur nach dem Skalieren das neuzeichnen Triggern.

28.04.2016 - 16:52 Uhr

Hast du einen String oder ein Array von Strings?

Bei einem Array hilft das angesprochene Distinct.


string[] values = new string[] {"01", "02", "01", "03", "04", "01", "05", "06", "07", "03"};
var result = values.Distinct();

22.04.2016 - 16:59 Uhr

Vorgaben zu Ressourcen machst Du eher bei Last-intensiven oder Server-Anwendungen.
Das passende Stichwort hier wäre auch Sizing.

Würde ich jetzt nicht unbedingt unterschreiben. Unsere Kunden wünschen z.T. auch für kleinere Anwendungen genaue Übersichten der Mindestanforderungen.

Folgende Mindestanforderungen wollen die dabei immer haben:*Betriebssystem *CPU-Leistung *Arbeitsspeicher *.NET Framework Version

Hallo Buzz Tyca,

denk auch dran, wenn du dritt-Komponenten verwendest dass du diese ebenfalls in den Anforderungen aufführen musst (z.B. CrystalReports).

Auch musst du für z.B. Oracle-Verbindungen aufführen, dass ein Oracle-Client erforderlich ist.

22.04.2016 - 15:04 Uhr

Hallo,

in der Regel reicht es auf die Form / das übergeordnete Control das Invoke durchzuführen.

Beispiel:


private void MyThreadDataFinished(Object sender, EventArgs e)
{
      this.UpdateView();
}

private void UpdateView()
{
     if(this.InvokeRequired)
     {
           this.Invoke(new MethodInvoker(this.UpdateView));
           return;
     }

     this.textbox1.Text = this.MeinDatenObjekt.Name;
     this.textbox2.Text = this.MeinDatenObjekt.Beschreibung;
     ....
}

22.04.2016 - 08:13 Uhr

Hallo Davaaron,

ich nehme an, bei den genannten Grundlagen die du dir zur Gemühte führen sollst, handelt es sich um Datentypen-Größen.

21.04.2016 - 14:33 Uhr

Also die Aufteilung der Arbeitszeit ist unglücklich gewählt. 20er Schritte sind zu groß ...

Da stimme ich zu. Aufgrund der 20er Schritte arbeite ich "140%". - Sachen die ich weniger als 20% mache kann ich ja schlecht als "0%" angeben.

21.04.2016 - 11:04 Uhr

Hallo Darty1971,

zusätzlich zu dem was Coffeebean schrieb, wäre eine optimaler Xml-Aufbau eher folgendes:


<statistiken>
      <Trainingsprogramm id="1">
            <Step datetime="21.04.2016 11:04:03">
                    <SubSteps>
                           ...
                    </SubSteps>
            </Step>
      </Trainingsprogramm>
      <Trainingsprogramm id="2">
      ..
      </Trainingsprogramm>
</statistiken>

21.04.2016 - 08:54 Uhr

Das hat FZelle im groben eigentlich schon gesagt.

Ich nehme an, du setzt die Daten derzeit manuell auf die Textboxen, wenn eine Zeile im DataGridView ausgewählt wird?

Dort solltest du also deine Änderung ansetzen und die im DataGridView befindliche Zeile als Datenquelle an die Textboxen binden.

Achtung: Das hat aber auch zur Folge, dass Änderungen sofort im DataGridView erscheinen. - Du musst also selber noch validieren ob die Daten geändert wurden (bzgl. Speicherung in der Datenbank).

20.04.2016 - 16:56 Uhr

Hallo,

nach deinem beschriebenen Weg müsstest du nach dem Schreiben in die Datenbank alle Daten erneut abholen.

04.04.2016 - 16:28 Uhr

Wie verhält es sich denn mit externen Config's die im ConfigSection-Abschnitt definiert sind?

Verschlüsselung funktioniert in dem Fall, aber werden die denn korrekt in den UserScope übernommen?

Ich meine soetwas:


<configSections>
   <sectionGroup name="external">
       <section name="Authorization" type="System.Configuration.SingleTagSectionHandler" />
       <!-- ... -->
   </sectionGroup>

   <external>
       <Authorization configSource="ConfigFile_Auth.xml" />
   </external>
</configSections>

04.04.2016 - 15:44 Uhr

Nur ein Tipp von meiner Seite wie ich es aufbauen würde (siehe Beitrag von Abt bzgl. State Machine):

Es gibt eine Basisklasse für Status, in der die Nachricht, die Gültigkeitsregel und der nächste Status definiert sind.


public class StateBase
{
     public virtual string Message { get; }

     public virtual bool IsValid(Step step)
     {
         return false;
     }

     public virtual StateBase NextState()
     {
         return null;
     }
}

Davon werden dann die einzelnen Status abgeleitet (am Beispiel Transport zu WT):


public class StateWT : StateBase
{
    public override string Message
    {
        get
        {
            return "Roboter legt Teil auf WT";
        }
    }

    public override bool IsValid(Step step)
    {
        return step.Position.Z <= 2.5 && step.Position.X >= 0.25;
    }

    public override StateBase NextState()
    {
        return new StateBlister();
    }
}

In der Programm Logik hast du dann nur noch wenige Zeilen Code um den jeweiligen Status zu prüfen:


private StateBase _currentState = new StateWT();

private voiid UpdateState(Step step)
{
   if (this._currentState.IsValid(step))
   {
         RoboterStatus.Content = this._currentState.Message;
         this._currentState = this._currentState.NextState();
   }
}

18.03.2016 - 10:38 Uhr

Ok, dann nächster Schritt: Was ist denn das für Ominöse Hardware auf der das nicht mehr funktioniert, und was ist die Hardware auf der es funktioniert?

18.03.2016 - 10:06 Uhr

Worum es mir jetzt ging, ist: Die Rückgabe von Device.ConnectToPreferredNetwork wird nicht wirklich ausgewertet und der Thread weiter ausgeführt.

Die Exception im Thread wird auch nur geschluckt wenn eine auftritt. Im Getter von Device werden die Exceptions auch nur geschluckt. Und auch isConnected schluckt frech alle Exceptions.

Hast du an allen betroffenen Stellen mal ausgeben lassen ob und welcher Fehler auftritt?

18.03.2016 - 09:54 Uhr

Hast du mal versucht, überall da wo Exceptions / Fehler geschluckt werden die Fehler auszugeben?

Sollte dir helfen das Problem zu finden.

18.03.2016 - 09:35 Uhr

Wie sieht denn der Code zum Verbinden mit dem W-Lan aus? Wie sieht die Auswertung aus, ob Verbunden ist?

Kann mir gut vorstellen, dass auch auf eurer Seite ein Problem vorliegt.

18.03.2016 - 09:32 Uhr

Hallo BuffaloBill,

Grund dafür, dass das Form im Hintergrund verschwindet ist hauptsächlich, dass du es im Konstruktor des Hauptformulars anzeigst.

Wenn es sich genauso verhalten soll wie beim Button-Klick, solltest du OnShown überschreiben und es dort anzeigen.


protected override OnShown(EventArgs e)
{
      if (!bSettings)
      {
            SettingsForm fSettings = new SettingsForm();
            fSettings.Show();
            fSettings.BringToFront();
      }
}

16.03.2016 - 11:36 Uhr

Dass AnyCPU unter 32-Bit Betriebssystem 32-Bit läuft ist mir klar, aber unter 64-Bit dementsprechend 64-Bit, das ist vorteil. Man muss nicht zwei Versionen kompilieren.

In deinem Fall aber auch eher ein Nachteil. - Wir hatten bisher immer die Regelung im Unternehmen unter AnyCPU zu kompilieren. Als unser Kundenstamm dann immer mehr Richtung 64bit Systeme gegangen ist, mussten wir aufgrund deren Lizensen für verwendete Reporting-Bibliotheken auch explizit auf x86 kompilieren. Das sollte jedoch kein Problem sein.

Im Zweifel bietet sich eventuell an, mehrfach Kompilierung durchzuführen? Das heißt, auf neue Systeme wo ihr die 64bit DLL habt, wird AnyCpu installiert, auf allen anderen x86.

16.03.2016 - 11:19 Uhr

Hallo,

ich möchte ausgewählte Ereignisprotokolle exportieren. Dazu habe ich EventLogSession.ExportLogAndMessages herangezogen.


public void Export(string log, string destination)
{
    EventLogSession session = new EventLogSession();
    string exportPath = Path.Combine(destination, String.Format("{0}.evtx", log));
    session.ExportLogAndMessages(log, PathType.LogName, "*", exportPath);
}

Dabei erhalte ich jedoch eine EventLogException:

Fehlermeldung:
Der Verzeichnisname ist ungültig

Dazu der Stacktrace:


   bei System.Diagnostics.Eventing.Reader.EventLogException.Throw(Int32 errorCode)
   bei System.Diagnostics.Eventing.Reader.NativeWrapper.EvtArchiveExportedLog(EventLogHandle session, String logFilePath, Int32 locale, Int32 flags)
   bei System.Diagnostics.Eventing.Reader.EventLogSession.ExportLogAndMessages(String path, PathType pathType, String query, String targetFilePath, Boolean tolerateQueryErrors, CultureInfo targetCultureInfo)
   bei System.Diagnostics.Eventing.Reader.EventLogSession.ExportLogAndMessages(String path, PathType pathType, String query, String targetFilePath)

Was mich hier jedoch stutzig macht, ist dass das Log anschließend im angegebenen Pfad vorhanden ist und auch korrekt geöffnet werden kann.

Ich kann nichts finden, warum das Log exportiert wird aber dennoch die Exception geworfen wird. Hat hier jemand eine Idee, woran das liegen könnte?

16.03.2016 - 10:08 Uhr

Nunja, wenn du gut dokumentierst warum der Benutzer die Methode zumindest aus der überschriebenen aufrufen sollte sehe ich kein Problem.

Aber ich sehe ein, es ist ein Fall wo es durchaus Sinn machen kann.

16.03.2016 - 09:56 Uhr

Hallo webdesigner,

Abt hat dir ja bereits das Schlüsselwort dazu genannt.

Gerade bei zu zeichnenden Shapes frage ich mich, ob es wirklich Sinnvoll ist überschreiben von Methoden zu verhinden.