Laden...

Forenbeiträge von Taipi88 Ingesamt 1.029 Beiträge

08.01.2018 - 09:57 Uhr

Hi,

naja - indem du eine Liste angibst die nicht NULL ist.

Abschnitt1 ist wohl dein ItemsControl - an dieses ItemsControl musst du halt auch eine Liste von Werten geben / binden, was hier offenkundig nicht erfolgt ist.

Dein Code macht in meinen Augen allerdings nicht wirklich Sinn - denn wie Abschnitt1:
a) Sich selbst beinhalten sollte
b) SelectedItem als sich selbst setzen soll

ist mir wirklich schleierhaft - glaube ja nicht einmal, dass das kompiliert...

Ganz ehrlich: Du solltest evtl. mit WindowsForms arbeiten, bis du dich zurecht findest - dann kannst du dir WPF anschauen - und wenn du schon mit WPF arbeitest - dann beginne am besten direkt mit MVVM (so ist es nämlich gedacht).

LG

20.12.2017 - 12:08 Uhr

PHP... 👶 Really?
Weg vom Programmieren hin zum Basteln und Mörteln?

Das finde ich nun ein bisl ungerecht. Ja - in PHP wird oft gefrickelt - aber das heißt auch nicht, dass dort NUR gefrickelt wird.

Zugegeben: Was ich kenne ist ASP.NET Core praktischer und macht es komplizierter was zu verbocken - aber wenn er PHP wirklich beherrscht - warum nicht?

LG

20.12.2017 - 07:20 Uhr

Hi,

dein Projekt klingt zwar tatsächlich nicht ganz so umfangreich - einiges an Arbeit wirst du aber definitiv haben, dann über's Internet auf Datenbanken direkt zugreifen macht man wirklich überhaupt nicht.

Ich sehe da mehrere Möglichkeiten:

a) Du machst das (wenn's schon online ist und sicher eh ein Linux-Server ist) direkt alles auf dem Server
b) Du kannst natürlich auch in Client/Server aufsplitten, dann kannst du auch z.B. eine WinForms/WPF-Anwendung schreiben

Grundlegend gibt es ja:

  • MySQL-Server [OnlineServer]
  • Daten-API [OnlineServer]
  • Client [OnlineServer + Clients]

Bei Variante a) könntest du zwar direkt auf die DB zugreifen - allerdings würde man auch hier normal hingehen und mindestens eine Daten-API schreiben. (also eine eigene DLL / Projekt, welche die nötigen Operationen anbietet) und dann eben in einer selbstkreierten Weboberfläche darstellt.

Bei b) müsste diese Daten-API quasi als REST-Service öffentlich verfügbar sein (ACHTUNG: Checkliste in der Werkstatt klingt auch nach Kundendaten - denke an Verschlüsselung, Authentifizierung und Autorisierung)

Grundlegend kannst du gerade für Rest-API's und Weboberflächen unter Linux jetzt auch C# einsetzen - da könntest du dich mal in ASP.NET Core einlesen. Da findest du dann auch sehr flott Beispiele für alles...

LG

19.12.2017 - 16:16 Uhr

Hi,

realistisch betrachtet solltest du doch folgendes tun:

a) Dein JSON wird geparst in eine Objektstruktur à la: ObservableCollection<MyBaseControl>
b) Je nach Properties in den einzelnen Objekten wird per Template eine Textbox / CheckBox / Wasauchimmer per DataTemplate angezeigt und gebunden (In einem ListView/ItemsControl, etc...)

Aus JSON selbst heraus - erstellst du nix außer deine eigenen Objekte.

LG

13.12.2017 - 08:54 Uhr

Hi,

die Frage finde ich ehrlich gesagt nicht genau genug.

Willst du die Datei?
Willst du ein Objekt? (Bitmap)

Im Endeffekt läuft es darauf raus, dass du die Datei anhand der URL runterlädst - das geht sehr einfach z.B. mit https://msdn.microsoft.com/de-de/library/ez801hhe(v=vs.110).aspx.

Aber das hätte auch Google sofort ausgespuckt - insofern denke ich, dass du was anderes möchtest?

LG

12.12.2017 - 16:32 Uhr

Hi,

der BinaryFormatter kann soweit ich weiß nur bis ca. 6 Mio Items serialisieren - den hat hier allerdings auch niemand empfohlen, da du etliche Features vom Formatter gar nicht brauchst.

Ich bin mir recht sicher mit etwas Einarbeitung arbeitest du etwas deutlich geeigneteres aus.

LG

12.12.2017 - 11:35 Uhr

Hi,

ja sicher brauchst du die Koordinaten ingame - aber - solang die Einträge in der richtigen Reihenfolge sind kannst du die Koordinaten doch einfach beim laden berechnen. Viel sinnvoller wie 5000x5000x2 Integer-Werte in Text-Repräsentation mit Bezeichner jeweils vornedran zu speichern...

Ähnliches gilt halt auch für den ResourceResetCounter - als Beispiel: Der Standardwert ist ggf. 10 - aber du speicherst das Property nur, wenn der Wert von 10 abweicht - beim Laden weist du ja automatisch, was da reingehört.

Die Abspeicherung im Binärformat würde ich definitiv auch empfehlen - rumeditieren von Hand will in einer solch langen Datei ohnehin niemand 😉

Edit:
Nach als Beispiel für Json.Net (falls du das wirklich willst), dass du z.B. nur Werte die vom Standard abweichen speicherst - beim Einlesen aber direkt befüllst oder halt komplett rauslässt:


public class MapField
    {
        [JsonIgnore]
        public long ID { get; set; }
        [JsonIgnore]
        public int Maplevel { get; set; }
        [JsonIgnore]
        public Vector2 Koordinaten { get; set; }
        public SpaceFieldTypes FeldTyp { get; set; }
        public SpaceFieldTypes FeldTypOrigin { get; set; }
        [DefaultValue(8)]
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
        public int RessourceResetCounter { get; set; }
        public SpaceFieldVisble Visible { get; set; }
    }

12.12.2017 - 11:06 Uhr

Hi,

also das wäre für mich nicht wirklich gut - da wirst du definitiv optimieren müssen.

Die ID ist doch sicher eine fortlaufende Nummer? -> weglassen, beim Laden einfach der Reihenfolge nach durchnummerieren.

MapLevel lässt sich möglicherweise aus der Gesamtzahl der Records berechnen?
Koordinaten sicher genauso.

Feldtypen musst du wohl speichern, RessourceResetCounter hat sicher irgendwie einen Standardwert - dann würde ich das Feld nur speichern, wenn es von diesem Standartwert abweicht, etc.

LG

12.12.2017 - 10:58 Uhr

Bis auf die Dateiendung und Encoding? Nein. Da steht auch nur Text drin^^

12.12.2017 - 10:14 Uhr

Hi,

ohne es böse zu meinen - aber du solltest bevor du eine Frage in einem Forum stellt - durchaus auch mal Google verwenden - da steht millionenfach wie man eine Textdatei bearbeitet.

Viel Erfolg.

12.12.2017 - 08:31 Uhr

Hallo Daze,

nein - das ist keine bessere Lösung. Schau dir die Links von Abt an - dann kriegst du das auch hin.

Was du für deinen (schlechten!) Ansatz brauchst ist eine simple String-Verkettung, die wir hier voraussetzen. Da wäre dir dann nur ein gutes Buch zu empfehlen.

LG

11.12.2017 - 10:44 Uhr

Hi,

also was du vorhast wird nicht ganz klappen, da es quasi keine Schnittstelle für E-Mail-Programme gibt, die unabhängig vom Programm arbeitet.

Mal abgesehen von Process.Start mit "mailto:deine@emailadresse.de?subject=DeinBetreff&body=DeinText" wird dir - falls du mehr brauchst nicht viel übrig bleiben als für jeden Client etwas eigenes zu basteln.

Für Outlook schließe ich mich der Empfehlung von "Unfug" an - NetOffice funktioniert super, die PrimaryInteropAssemblies von Microsoft gehen auch gut - finde ich persönlich aber nicht mehr so schön - gerade im Vergleich zu NetOffice, welches durch LateBinding das Unterstützen verschiedener Versionen meist zum Kinderspiel macht.

LG

23.11.2017 - 15:59 Uhr

Naja - da hast du wohl einiges in den vorgenannten Links übersehen. Da gibt es nämlich funktionsfähige Beispiele.

LG

PS: Wenn's schon an der Syntax scheitert - dann tust du dir hier keinen Gefallen.

23.11.2017 - 15:21 Uhr

Hi,

naja - es gab/gibt diverse PrimaryInteropAssemblies in den jeweiligen Frameworks - seit wann weiß ich nicht genau.

Für mich klingt es allerdings eher so, als ob du mehrere Office-Reihen abdecken möchtest - und dann wäre für dich das richtige Stichwort "LateBinding" bzw. z.B. die Bibliothen NetOffice:
https://osdn.net/projects/netoffice/

Alternativ wenn wir ausschließlich vom neuen Dateiformat (z.B. xlsx) reden - solltest du dir dringend auch mal die entsprechenden Format-API's ansehen, welche z.B. komplett ohne installiertes Excel auskommen und darüber hinaus üblicherweise um ein vielfaches schneller sind. (OpenXML https://msdn.microsoft.com/de-de/library/office/hh180830(v=office.14).aspx)

LG

22.11.2017 - 17:28 Uhr

Hi,

grundsätzlich bitte die speziellen C#-Tags nutzen - macht's leserlicher 😃

Abseits davon - ich hab zwar keinen Plan von Unity - aber gemäß Doku und rein logisch machst du in Zeile 23 deinen Fehler. Bin auch recht sicher, dass das im Video so nicht da steht 😕

Hier der Link zur Doku:
https://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html

Rein praktisch würde das dann so aussehen können:


myRigidbody.AddForce(movement, ForceMode.Force); 

LG

PS: Wenn du solche Fehler mit Hilfe des Compilers nicht findest - würde ich dir grundsätzlich empfehlen dich zumindest erst mal etwas mehr mit C# zu beschäftigen - sonst wird das sicher eine ziemlich frustrierende Erfahrung.

22.11.2017 - 12:32 Uhr

Hi,

bitte erstelle für dein Problem einen eigenen Thread.

Dafür auch als Hinweis: Deine Frage muss deutlich genauer formuliert werden und deutlich mehr Informationen liefern.

Denn aktuell lautet die Antwort auf deine Frage nämlich recht simpel:
Mit eigenem Code.

LG

22.11.2017 - 12:30 Uhr

Hi,

speziell in Hinsicht auf MySql / WebApi und damit u.U. auch NetStandard/NetCore habe ich mit MySQL nun auch erste eigene negative Erfahrungen gemacht. Funktioniert quasi nur mit deaktiviertem ConnectionPooling (zugegeben - der Connector ist'n PreRelease - aber Zeit genug hatten die)

Würde persönlich MSSQL und PostgreSQL verwenden.

Vorteil MSSQL? Für mich im Wesentlichen deutlich bessere Verwaltung mit SSME

Vorteil PgSQL? Wirklich kostenlos

Bei MySQL stößt mir mittlerweile auch auf, dass es in der selben DB keine Möglichkeit für mehrere Schemata gibt.

LG

21.11.2017 - 11:43 Uhr

Hi,

nun - wenn die Auswahl eines Wertes - automatisch und definitiv die automatische Auswahl des anderen Wertes (und umgekehrt) bedingt, dann brauchst du nur eine ComboBox, der angezeigte Werte kann ja eine Stringverkettung sein.

Wenn dabei etwas nicht klappt - zeigst du am besten etwas Code.

LG

21.11.2017 - 11:19 Uhr

Hi,

dann verstehe ich die Frage und das Problem denke ich nicht.

Also, du hast:
2 Comboboxen, Box-A und Box-B

Wenn du in Box-A etwas auswählst, soll wohl in Box-B automatisch auch ein Wert gesetzt werden. Gilt das umgekehrt genauso?

Wenn ja:
Warum brauchst du dann bitte 2 ComboBoxen? Eine reicht doch aus 😕

LG

21.11.2017 - 07:10 Uhr

Hi,

sieht so aus, als würdest du nicht mit MVVM und DataBinding arbeiten...

Naja - auf folgender Seite siehst du wie's mit o.g. Techniken geht. Kann dir nur empfehlen dich mit beidem auseinanderzusetzen - sonst wird dir WPF keinen Spaß machen.

https://social.technet.microsoft.com/wiki/contents/articles/17946.cascading-comboboxes-in-wpf-using-mvvm.aspx

LG

20.11.2017 - 16:26 Uhr

Hi,

ergänzend zur Vorgehensweise von inflames2k ist noch anzumerken, dass ein StreamWriter ja flexibler ist - dieser braucht nämlich nur einen Stream um irgendwo etwas hinzuschreiben.

Das kann eine Datei sein, aber z.B. auch der Arbeitsspeicher oder was ganz anderes.

Insofern ist es flexibler für den Aufrufer, wenn DataTable/DataSet einen StreamWriter entgegen nehmen, als dass diese schlicht einen Dateinamen als Parameter nehmen.

LG

13.11.2017 - 15:02 Uhr

Hi,

also um ehrlich zu sein - deinen Ansatz mit der Klasse kann ich nicht nachvollziehen - oder hast du später allen Ernstes vor eine Klasse mit 16 (und mehr?) Properties zu schreiben?

Was spricht denn später gegen die einfache Verwendung von Dictionary<string, double>?

Alternativ kannst du dir auch mal https://weblog.west-wind.com/posts/2012/Feb/08/Creating-a-dynamic-extensible-C-Expando-Object anschauen - da wird das mit einem ExpandoObject gelöst, sodass es sich zumindest so anfühlt als ob.

LG

13.11.2017 - 14:56 Uhr

Hi,

also wenn man an solchen Unterschieden guten/schlechten Stil ausmachen möchte - dann aber gute Nacht.

Zweite Schreibweise ist in der Tat C#-Standard - wirst wenige Projekte finden die es anders machen - und was solche Feinheiten angeht ist es eigentlich nur wichtig, dass es einheitlich (für das Projekt/Team) ist.

Da würde ich dir ja eher die Großschreibung von "TEST" ankreiden 😉

LG

08.11.2017 - 13:43 Uhr

Hi,

der Fehler lässt sich mit Hilfe deines Projekts in der Tat reproduzieren bei mir - sobald du selbst mit dem Zeichnen anfängst.

Grundlegend:
Du zeichnest anders, wie das Label das per Default tut - merklich anders.
Tipp: Zeichne auch ohne Rotation selbst - dann sieht es zumindest einheitlich aus.

Des Weiteren:
Von Label abzuleiten bringt dir doch hier überhaupt gar nichts - das Label versaut dir aber komplett die Anzeige, weshalb du dauernd dieses .Text = "xyz"-Gefrickel machst - noch dazu im OnPaint - das löst ständig ein "Invalidate", damit ein neues "OnPaint" - und damit die Endlosschleife aus - was auch der Auslöser für dein seltsames Verhaltens ist, weshalb du Pille und die Anderen durchaus ernst nehmen solltest.

Nur mal als Beispiel eine etwas abgespeckte Version von dem was du vorhast.
Auch als Hilfe, dass man durchaus bequem "normal" zeichnen kann und danach das Image die Rotation durchführen lässt...


public class PrintObjectLabel2 : System.Windows.Forms.Control
    {
        private bool _enableBorder;
        private int _rotationAngle;
        private Color _borderColor;

        public override string Text
        {
            get => base.Text;
            set
            {
                var txt = value?.Replace("\\", ""); 
                base.Text = txt;// base.Text will raise Invalidate automatically
            }
        }

        public bool EnableBorder
        {
            get => _enableBorder;
            set
            {
                _enableBorder = value;
                Invalidate();
            }
        }

        public Color BorderColor
        {
            get => _borderColor;
            set
            {
                _borderColor = value;
                if (EnableBorder)
                    Invalidate();
            }
        }

        public int RotationAngle
        {
            get => _rotationAngle;
            set
            {
                _rotationAngle = value;
                Invalidate();
            }
        }

        public PrintObjectLabel2()
        {
            EnableBorder = true;
        }

        public int PoUid { get; set; }

        public string PoType { get; set; }

        public string PoFont { get; set; }

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            var txt = e.Graphics.MeasureString(Text, this.Font);

            using (var bmp = new Bitmap((int) txt.Width + 1, (int) txt.Height + 1))
            {
                using (var bmpGraphics = Graphics.FromImage(bmp))
                {
                    if (EnableBorder)
                    {
                        using (var pen = new Pen(Color.Black))
                        {
                            bmpGraphics.DrawRectangle(pen, new Rectangle(0, 0, bmp.Width-1, bmp.Height-1));
                        }
                    }
                    bmpGraphics.DrawString(Text, Font, Brushes.Black, new RectangleF(0,0, bmp.Width, bmp.Height));
                }

                if (RotationAngle == 0)
                {
                    bmp.RotateFlip(RotateFlipType.RotateNoneFlipNone);   
                }
                else if (RotationAngle == 90)
                {
                    bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
                }
                else if (RotationAngle == 180)
                {
                    bmp.RotateFlip(RotateFlipType.Rotate180FlipNone);
                }
                else if (RotationAngle == 270)
                {
                    bmp.RotateFlip(RotateFlipType.Rotate270FlipNone);
                }
                e.Graphics.DrawImageUnscaled(bmp, 0, 0);
            }
        }
    }

LG

07.11.2017 - 14:56 Uhr

Hi,

da ja nun schon gestritten wird - finde folgenden, verlinkten Vergleich eigentlich ziemlich gut - zeigt ehrlich Vor- und Nachteile auf:

http://blog.stephencleary.com/2013/05/taskrun-vs-backgroundworker-round-1.html

Der Gewinner: async/await

Das heisst ja nicht, dass der BGW schlecht ist.

LG

07.11.2017 - 12:18 Uhr

Taipi88, da sein Shown ein Event ist, ist das LoadSQL so prinzipiell kein Pitfall.

Tatsache - hast natürlich Recht - allerdings gilt das halt auch nur, wenn er keinen EventListener hat, der nach diesem LoadSQL laufen soll. (Was hier nicht der Fall ist)

LG

07.11.2017 - 12:06 Uhr

Hi,

ich sehe da direkt mehrere Fehler:

a) Zu jedem async - gehört auch ein await

this.Shown += LoadSQL; //Oberfläche wird angezeigt, aber blockiert

fehlt sowas z.B. mal als Beispiel:


public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Shown += async (sender, args) =>
            {
                await InitiateLengthyOperation();
            };
        }

        private async Task InitiateLengthyOperation()
        {
            label1.Text = "Processing";
            await DoLenghtyOperation();
            label1.Text = "Done";
        }

        private async Task DoLenghtyOperation()
        {
            await Task.Delay(5000);
        }
    }

b) Die Datenbankoperation ist nicht async - wird somit nicht awaited - und wird somit deine UI blockieren. (Siehe Mitteilung von Abt)

LG

07.11.2017 - 10:26 Uhr

Hi,

nun - beenden tut es sich weil es alles getan hat, was du programmiert hast.

Ich vermute mal du möchtest eher an den Inhalt der Dateien rankommen?

Falls dem so ist gibt es viele Wege, u.A:
a) https://msdn.microsoft.com/de-de/library/s2tte0y1(v=vs.110).aspx
b) https://msdn.microsoft.com/en-us/library/ms143368(v=vs.110).aspx
c) https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/file-system/how-to-read-a-text-file-one-line-at-a-time
etc. pp.

Eine dieser Optionen musst du dann nur noch mit dem Finden der Dateien verbinden.

LG

06.11.2017 - 07:36 Uhr

Hi,

die ganze Wahrheit kann das in meinen Augen nicht sein 😕

Die von dir genannte Fehlermeldung kann eigentlich nur in der Decrypt-Methode ausgelöst werden, wo ich selbst vermutlich suchen würde, ob in irgendeiner Form der Output der "Encrypt"-Methode geändert wurde.

Also gäbe es meinerseits 2 Fragen:

  1. Welche Fehlermeldung wird in der ersten Methode ausgelöst?
    (Bei einem Test meinerseits sind Linebreaks, Prozentzeichen, etc. kein Problem)

  2. Was passiert nachdem die Encrypt-Methode was ausspuckt so alles mit dem Output?

LG

19.10.2017 - 12:40 Uhr

Hi,

klingt nach einem Job für ein Diff-Tool - schau mir dort:
Diff tool that can be integrated into a C# app

LG

19.10.2017 - 11:45 Uhr

Hi,

hast du schon

Unicode=true

im ConnectionString probiert?

LG

19.10.2017 - 11:02 Uhr

Hi,

selbst wenn nicht - so wie ich das verstehe soll ihr denn eine separate IdentityServer4-Anwendung erstellt werden, deren Tokens widerum im normalen .NET-Stack verwendet werden sollen.

Da das ganze ja auf OAth und/oder JWT herausläuft als Schnittstelle - was .NET ja durchaus unterstützt - sehe ich da kein Problem.

LG

05.10.2017 - 11:36 Uhr

Hi,

du solltest dir C# mal komplett anschauen.

Grundlegend gibt man Variablen nicht nach außen frei - sondern kapselt diese in Properties.

Deine Actor-Klasse würde sich dann so gestalten:


public class Actor 
{
    public Condition Condition {get;set;}
    public int Attribute {get; set;}
} 

--> Die Klasse Condition dann äquivalent.

GGf. kann man sich an der Stelle auch überlegen der Klasse Actor beim Property Condition den Setter wegzunehmen und diese Instanz im Konstruktor der Actor-Klasse zu initialisieren - das verhindert Fehler in der Handhabung.

Dein "Problem" existiert der Gestalt wie du denkst wie bereits von den anderen beschrieben jedenfalls nicht.

LG

Edit:
Vorher beschriebene Schreibweise ist übrigens die Kurzform für:


public class Actor 
{
	private Condition _condition;
        public Condition Condition
	{
		get
		{
			return _condition;
		}
		set
		{
			_condition = value;
		}
	}
    
	private int _attribute;
	public int Attribute
	{
		get
		{
			return _attribute;
		}
		set
		{
			_attribute = value; 
		}
	}
} 

Ich denke du siehst direkt, was das für Möglichkeiten bietet 😉

04.10.2017 - 16:00 Uhr

Ich hoffe es ist jetzt verständlicher, was ich meine.

Ich denke nicht.

Sry - aber das bisl Razor-ViewCode den du hier zeigst hilft kein bisschen - wichtiger wäre die Frage, wo deine Models herkommen bzw. wie du überhaupt vorgehen willst, dass nicht alle Nutzer alle Daten sehen.

LG

04.10.2017 - 11:02 Uhr

Hi,

vorab für die Zukunft: Bitte benutz die Code-Tags.

Zu deinem aktuellen Problem:
Gemäß deinem eigentlichen Wunsch wäre die Methode

string.IsNullOrWhiteSpace

interessant.

Prinzipiell würde bei dir allerdings auch

input.Length

eine gute Verwendung finden.

LG

Edit: Nach Abt's Hinweis noch eine Klarstellung meinerseits:
Meinerseits ist das so gedacht, dass sowohl string.IsNullOrWhitespace als auch input.Length verwendet werden.
a) string.IsNullOrWhitespace ist dazu gedacht prinzipiell unbrauchbare strings abzulehnen
b) input.Length sollte man dazu verwenden, dass auch immer nur inputs mit Länge = 1 verwendet werden

29.09.2017 - 10:18 Uhr

Hi,

ist zwar schön wenn's funktioniert - aber mal ganz ehrlich:

Es ist doch sicher auch für dich offensichtlich, dass du hier jede Menge unnötige Arbeit vom Rechner ausführen lässt.

Tu dir selbst den Gefallen und verlege


Application xlApp = new Application();
Workbook xlWbk = xlApp.Workbooks.Open(excellPath);

VOR die for-Schleife. Halte dir einfach vor Augen, dass derzeit jedes Mal ein neuer Prozess gestartet wird, jedes mal das komplette Workbook geladen wird - und zwar 3 x obwohl 1 x reichen würde.

Zusätzlich finde ich es mies, dass deine Schleife statisch bis 3 läuft. Das geht doch sicher besser oder?

LG

28.09.2017 - 11:11 Uhr

Hi,

meine Beispiele für IDisposable sind auf Excel-Interop (V15) gar nicht anwendbar, da es nicht implementiert ist. (Sry - das ist wohl nicht richtig rübergekommen)

Zudem - du verwendest zwar Marshal.ReleaseComObject - aber nicht wie von mir extra fett markiert auf jedes Objekt. Als Beispiel mal ein CSV-Export, der Excel ordentlich beendet:


static void Main(string[] args)
		{
			var sourceFilePath = @"";
			var targetFilePath = @"";

			var xlApp = new Excel.Application();
			var xlWkb = xlApp.Workbooks.Open(sourceFilePath);
			var xlWks = (Excel.Worksheet)xlWkb.Sheets[1];
			xlWks.SaveAs(targetFilePath);

			xlApp.Quit();
			Marshal.ReleaseComObject(xlWks);
			Marshal.ReleaseComObject(xlWkb.Sheets);
			Marshal.ReleaseComObject(xlWkb);
			Marshal.ReleaseComObject(xlApp.Workbooks);
			Marshal.ReleaseComObject(xlApp);
		}

Offensichtlich zu entsorgen sind:

  • xlApp
  • xlWkb
  • xlWks

Nicht so offensichtlich - aber dennoch zu entsorgen:

  • xlApp.Workbooks
  • xlWkb.Sheets

Du solltest dir meinen vorherigen Link wirklich noch mal anschauen.

LG

28.09.2017 - 10:34 Uhr

Hi,

viel einfacher - du musst IDisposable nicht implementieren - sondern benutzen, also:


var myDisposable = new ...();
// dein code, der das objekt braucht
myDisposable.Dispose();

Das erwähnte using macht das automatisch - nutzt man folgendermaßen:


using (var myDisposable = new ...())
{
// dein code, der das objekt braucht
}
// hier wurde dispose bereits ausgeführt

Für COM-Interop mit Office verwendet man allerdings eigentlich Marshal.ReleaseComObject. **Und zwar für jedes einzelne Objekt!!! **
Siehe https://stackoverflow.com/questions/158706/how-do-i-properly-clean-up-excel-interop-objects

Wenn dir das zu doof ist (ist es mir auch) - dann schau dir mal NetOffice an.

LG

28.09.2017 - 09:10 Uhr

Hi,

schau dir mal das Behavior auf folgendem Link an:
https://stackoverflow.com/questions/16914224/wpf-textbox-to-enter-decimal-values

Das sollte das ja ziemlich elegant lösen.

Zu deiner Vorgehensweise - warum Regex, wenn du direkt decimal.TryParse verwenden könntest?

LG

28.09.2017 - 06:54 Uhr

Hi,

ein ähnliches Fehlerbild kenne ich eigentlich nur von den ersten Core-Projekten in VS 2017.

Musste ab und an VS schließen und die *.suo-Datei löschen - das hat immer geholfen.

Seit irgendeinem Update in VS (und/oder ggf. Resharper) wurde das jedoch deutlich seltener bei mir.

LG

26.09.2017 - 12:26 Uhr

Hi,

hab zuletzt auch unter VS2017 eine mit VS2010 erstellte EF-Verbindung bearbeitet.

Hat praktischerweise gefragt, ob ich das Feature nachinstallieren möchte.

ACHTUNG: Funktioniert zwar - aber irgendwas hat die Performance des Designers bei einer Datei nahezu gen 0 getrieben. Hat 10 Minuten gedauert das Modell aus der DB zu aktualisieren - weitere 5 zum speichern...

LG

25.09.2017 - 14:31 Uhr

Hi,

kannst du mal den kompletten Code der betroffenen Methode posten?

Das kann so nämlich, wie du schon sagst, nicht sein.

LG

25.09.2017 - 14:06 Uhr

Hi,

setzt am besten mal einen Haltepunkt auf die Stelle, an der du dir den Inhalt im Debugger anschaust - nicht jedes Zeichen ist sofort sichtbar - aber ein einzelnes Leerzeichen oder ähnliches wird deinem Programm recht geben 😉

Und wenn du weißt an welche(n/m) Zeichen es hängt - kannst du dich drum kümmern es besser auszulesen bzw. ggf. automatisch zu korrigieren.

LG

25.09.2017 - 07:03 Uhr

Hi,

naja - was soll er auch anders machen in der foreach-Schleife?

Grundsätzlich sehe ich nach wie vor viele Logikprobleme deinerseits.

Zu deinem genannten Problem:
a) Nimm dir eine Zählervariable als Klassenvariable (int CurrentQuestionIndex = 0;)
b) Bei jedem Button-Click prüfst holst du dir anhand der Zählervariable die aktuelle Frage
c) Nach Ausgabe von "richtig/falsch" inkrementierst du die Zählervariable und setzt die neue Frage

Als Tipp: Es würde ggf. Sinn machen die möglichen Antworten, sowie die Richtige zugehörig zur Frage abzuspeichern.

LG

25.09.2017 - 06:53 Uhr

Hi,

grundsätzlich kannst du dich an folgendem Beispiel orientieren:
Template SerialPort

Musst halt schauen, dass du das mit der Kapselung noch einbaust, dass nicht zwei oder mehr auf einmal den eigentlichen SerialPort benützen.

LG

21.09.2017 - 07:00 Uhr

Hi,

wenn es hier schon um Daten geht - möchte ich an dieser Stelle neben der bereits erwähnten 3-Schicht-Architektur noch auf folgende Patterns hinweisen:
a) UnitOfWorkPattern
b) RepositoryPattern

Speziell letztere sieht in deinem Fall sehr interessant aus.

Des Weiteren wären Bibliotheken wie z.B. "Dapper" noch sehr interessant um die SQL-Daten zu parsen...

LG

20.09.2017 - 06:53 Uhr

Hi,

muss hier gerade doch noch mal etwas los werden. Hab deinen Beitrag wohl beim ersten Mal nicht genau durchgelesen (und Azure AD auch erst jetzt gegoogelt)

  1. Wie mir scheint brauchst du nicht mal einen IdentityServer
    -> Den brauchst du nämlich eigentlich nur, wenn du selbst Mechanismen á la "OpenId" anbieten möchtest

  2. AzureAD sieht mir nach deinem verlinkten Beispiel so aus, als ob es auch einfach OpenId anbietet
    -> AspNetCore beherrscht OpenId "out of the box" - ergo - lässt du dir bei Projekterstellung einfach eine App mit "individuellen Accounts" erstellen - machst noch ein bisl OpenId-Konfiguration et voilá - User können sich entweder auf deiner Seite mit Benutzername/Passwort anmelden, oder auf "Login with Azure" drücken und gut ist.
    (Da das Beispiel für AzureAD nicht ganz so vollständig wirkt - würde ich dir empfehlen es mit den diversen Beispielen für Facebook abzugleichen - das ist ein bisl ausführlicher)

Das würde auch ein wenig deine Verwirrung erklären - der IdentityServer hat nämlich die Aufgabe Funktionalität wie AzureAD, Google, Facebook & Co. - nur halt eben selfmade anzubieten, was bei dir nicht mal benötigt wird.

LG

19.09.2017 - 11:41 Uhr

Hi,

der IdentityServer ist in weiten Teilen eigentlich vom genauen IdentityProvider komplett unabhängig.

Denn eigentlich wird dort mit dem ClaimsPrincipal und Claims gearbeitet ist, wie es sich halt komplett durch ASP.NET Core hindurch zieht.

Das einzige woran ich mich erinnere, dass Store-bezogen wäre - ist erst mal nur der sogenannte "ProfileService", der sicher auch nicht all zu kompliziert wird, da es sicher ein Claim gibt, dass deiner Implementierung verraten würde wer denn nun gerade Claims verteilt halt. ("iss")

Würde dir an der Stelle empfehlen dir einfach mal ein paar Beispiele anzuschauen (Die Doku ist echt gut, wenn man sich mal einen Überblick verschafft hat)

LG

15.09.2017 - 13:53 Uhr

Hi,

nein - eine Ausgabe hat nichts mit der Rückgabe zu tun vom Konzept.

Bei der Rückgabe will ja der Aufrufer irgendwas zurück haben - bei der Ausgabe interessiert es den Aufrufer nicht was dort genau passiert, solange es nur passiert.

Die selbe Methode würde ja im Fall eine Desktop-Anwendung irgendwas auf den Bildschirm malen - das ist und bleibt dem Aufrufer hier allerdings egal.

LG

13.09.2017 - 07:24 Uhr

Hi,

naja - eine foreach-Schleife für die schrittweise Anzeige von Datensätzen ist erst mal der falsche Weg. Die müsstest du ja irgendwie anhalten 😉

Hier wäre eher eine Art "Navigation" angebracht.

Mal so als Denkansatz: (nur im Forum geschreibselt - geht nur um's Prinzip)


int _index = 0;
object _current = null;
List<object> _data;

public PrintForm(List<object> data)
{
_data = data;
_current = _data.First();

buttonYes_Click += ...
buttonNo_Click += ...

}

buttonYes_Click_Method()
{
// print current data
// increase _index
// set _current
// display current data
}
buttonNo_Click_Method()
{
// increase _index
// set _current
// display current data
}

LG