Laden...
W
Benutzerbeschreibung

Forenbeiträge von witte Ingesamt 955 Beiträge

20.10.2014 - 10:29 Uhr

Hallo mech,

ein Problem mit async void besteht darin dass Exceptions in den "inneren Threads" nicht gefangen werden, da auf das Ergebnis nicht gewartet wird. Du kommst bei Kunden dann schnell in das Problem das sie Dir sagen "die Anwendung arbeitet nicht weiter" Du kannst Ihnen aber nicht helfen weil sie Dir keine Fehlermeldung o.ä. geben können. Das ist nicht der "feine Weg" sondern der in die Hölle weil Frust auf beiden Seiten entsteht.
Best Practices in Asynchronous Programming, Avoid Async Void ganz oben.

19.10.2014 - 22:32 Uhr

Hi,

BTW
... gibt es einen Grund warum die Methode async void ist? Oder meinst Du das mit "nächsten Problem" das Exceptions in der Methode nicht gefangen werden?

17.10.2014 - 11:43 Uhr

Kann ich mit NotifyPropertyChanged auch überwachen, wenn einer Liste von Objekten ein neues Objekt hinzugefügt wird? Bisher löst PropertyChanged nur aus, wenn ich eine Klassenvariable setzte Dafür benötigst Du INotifyCollectionChanged. Also die Kindercollections in eine ObservableCollection<T> wrappen.

16.10.2014 - 13:00 Uhr

Hallo,

  1. Jetzt sendet jeder Knoten PropertyChanged. Wenn Du sie an eine GUI bindest welche NotifyPropertyChanged beherrscht, kann diese die Änderungen anzeigen (beispielsweise ein WPF Treegrid)
  2. Wenn Du diese Events an andere weiterleiten willst (um beispielsweise das Sternchen im Title anzuzeigen) hast Du mehrere Möglichkeiten
    * Der Parentknoten überwacht seine Kinder und schmeißt selber NotifyPropertyChanged wenn eines seiner Kinder ein solches Event generiert => das Ereignis wird zum Root durchgereicht
    * Die Knoten Deines Trees bilden ein Kompositum. Alle dessen Knotentypen implementieren eine Schnittstelle sowas wie HasChanged(). Der veränderte Knoten ruft das an seinen Parent auf => das Ereignis wird zum Root durchgereicht
    Wenn Du das NotifyPropertyChanged Event abonnieren willst nimm lieber PropertyChangedEventManager.AddHandler(object, ViewPropertyChanged, ""); und PropertyChangedEventManager.RemoveHandler(object, ViewPropertyChanged, "");
    Das sind WeakEvents, damit kann der GC nicht mehr benutzte Knoten abräumen auch wenn diese noch Listener besitzen.
16.10.2014 - 10:42 Uhr

Naja,

es ist doch nicht schwer. Mach ein abstraktes Basis-Modellobjekt welches INotifyPropertyChanged implementiert und lass Deine Modellobjektedavon erben. Und dann in den Modellobjekt-Properties:



        private String datasourceName;
        public String DatasourceName
        { 
            get { return datasourceName; }
            set { SetProperty(ref datasourceName, value); }
        }  

16.10.2014 - 10:28 Uhr

Hallo,

nimm doch eine der Erweiterungsmethoden Where, First, FirstOrDefault, Single, SingleOrDefault. Und denk daran den Linq-namespace einzubinden.

10.10.2014 - 12:17 Uhr

... oder verschiebe die älteren Versionen doch in einen Ordner wo alles erlaubt ist.

10.10.2014 - 10:18 Uhr

Hallo,

ich würde versuchen das mit Gruppen abbilden Auch wenn das dem Datenmodell nicht entspricht läßt sich dieses vllt einfacher im Report darstellen.
* jede einzelne Rechnungsposition bildet eine Gruppe, die nachfolgenden Freitexte unter dieser Gruppe sind die Detailsätze dieser Gruppe.
* Rechnungsposition denen kein Freitext folgt bekommen einen Leertext als Detailsatz.
* die Rechnungspositionen werden als Gruppenkpöpfe, Freitexte als Details dargestellt
* leere Freitexte werden unsiochtbar gemacht
* Irgendein Adapter oder Viewmodel wandelt das Datenmodelin das Reportviermodel um.

04.10.2014 - 21:26 Uhr

... außerdem kann man das mit einer CancellationTokenSource implementieren. Jobs, die Status "cancelled" haben gelten als completed und werden damit nicht mehr berechnet.

02.10.2014 - 15:49 Uhr

Hallo,

sollen eigentlich die Historiendaten auch in der App dargestellt werden (das man einen früheren Zeitpunkt angibt und die App die damalige Situation darstellt) oder wird das nur wegkopiert für späteres Auswerten mit anderen Tools?

02.10.2014 - 10:37 Uhr

Die Enum-Sache muß vom EF auf das SQL abbildbar sein. Beispiel:
* Du hast Rechnungen
* Rechnungen haben Zustände


public class Rechnung
{
 public RechnungsStatus Status { get; set; }
}

public enum RechnungsStatus { Neu, Offen, Storniert, Ausgeglichen }

Du willst dem Bearbeiter anbieten dass er Rechnungen nach Status filtern kann, er kann gewünschte mit Checkboxen auswählen. In diesem Fall könnte man Punkt 1 verwenden. Ob das bei Dir klappt - ich weiß nicht was Du genau machen willst.

01.10.2014 - 18:00 Uhr
  1. Wenn die Bedingungen einfach Enums (man wählt Zustände aus die die Objekte haben dürfen) sind kannst Du eine Collection mit den gewählten enums machen und diese mit Where(p => Collection.Any(q => q == p.Zustand)) machen.
  2. Sollte das nicht sein, hat Th69 wahrscheinlich mit seinem PredicateBuilder doch recht. Bist Du sicher dass Du ihn korrekt implementiert und verwendet hast? Bei mir läuft dieser, die OR-Bedingung wird auf das SQL abgebildet. Ich habe den PredicateBuilder von hier petemontgomery.wordpress.com, aber die sind wahrscheinlich alle ähnlich implementiert.

Expression<Func<Apfelkorb, bool>> m = p => p.Äpfelliste.Any(q => q.Hersteller.Id == 7777);
m = m.Or(p => p.Äpfelliste.Count > 1);
IQueryable<T> query = context.Apfelkorb.Where(m);

(Code ist nur sinngemäß.)
Im mitgeloggten SQL taucht dort eine WHERE ( <hersteller-expression>) OR (<Anzahl-expression>) - Klausel auf.

Edit: Ich habe damals diesen PredicateBuilder verwendet weil er mit dem EF umgehen kann, also nimm diesen im Link.

01.10.2014 - 13:59 Uhr

Ja, aber den PredicateBuilder braucht er doch eigentlich nicht, den hat ihm ja Th69 "aufgedrängelt". Das wollte ich anmerken.

01.10.2014 - 12:40 Uhr

Hallo,

ich glaube dass Ihr den OP mißverstanden habt (mal abgesehen davon dass er sich Repositories usw. wirklich ansehen soll). Er fragt m.E. doch eigentlich nur wie man Linq-Ausdrücke verketten kann und das ist doch einfach möglich, da diese Ausdrücke erst ausgewertet werden wenn ein Konsument diese verwendet.


var qry = context.Umsätze;
if (<Bedingung 1>) qry = qry.Where(p => p.<Filter 1>);
if (<Bedingung 2>) qry = qry.Where(p => p.<Filter 3>);
if (<Bedingung 3>) qry = qry.Where(p => p.<Filter 3>);
...

Und für eine einfache Desktopanwendung reicht m.E. das EF in 80% aller Fälle aus, wenn man die aktuelle Version verwendet. Er sollte es nur gleich richtig machen und sich um eine vernünftige Architektur kümmern.

27.09.2014 - 21:21 Uhr

... und noch was anderes: Du mußt nicht jedesmal in einer Schleife immer dasselbe Insert-Statement erzeugen. Es reicht wenn vorher einmal das Statement erstellt wird, dann Prepare(). In der Schleife werden nur noch die Parameter gesetzt und das Statement abgeschickt. So muß das Stmt nur einmal aufbereitet werden.
=> Nicht nur Parameter einsetzen sondern auch richtig verwenden.

26.09.2014 - 13:51 Uhr

Hallo,

eine wichtige Frage wird erst einmal sein ob Dir der SQL-Server sagen kann wie lange die Anfrage dauert. Anzeige restlicher Abfragezeit eines Select Command

21.09.2014 - 11:54 Uhr

Hallo,

wenn Du das Property "Datum" nennst und im XAML auf "Date" verweist muß DU Dich natürlich nicht wunden... Vllt solltest Du Dich auf eine Sprache festlegen.

19.09.2014 - 14:29 Uhr

Du könntest mal schauen ob der UniversalSerializer schneller ist.

19.09.2014 - 14:02 Uhr

Hallo,

arbeite ein Tutorial durch oder verwende ein Framework wie gong-wpf-dragdrop

19.09.2014 - 14:00 Uhr

Hallo,
wozu dient eigentlich der int im Dictionary.TValue?

19.09.2014 - 13:08 Uhr

Hallo, beschäftige Dich mal mit new und override-keywords

18.09.2014 - 15:55 Uhr

Hallo,

ich würde das mit einer eigenen, für Falschanmeldung spezifischen Exception lösen (vllt von AuthenticationException ableiten). Der Logindialog filtert diese für seinen eigenen Hinweistext raus und läßt die anderen für die "globale Messagebox" -wie auch immer das gelöst ist- durch.

18.09.2014 - 15:00 Uhr

Probier es doch aus, ich habe mit dem Teil noch nicht gearbeitet. Wenn das Control seinen Content selber zeichnet (z.B. mit einer Render-Dll vom MSIE) könntest Du natürlich Pech haben.

18.09.2014 - 14:40 Uhr

Hallo,

System.Windows.Forms.WebBrowser() ist WinForms und wird mit GDI gezeichnet. Wenn dieser in einer WPF-Anwendung verwendet werden soll muß dieser in einem WindowsFormsHost gehostet werden da WPF ein eigenes, zu GDI nicht kompatibles "Malsystem" besitzt. WPF kann zwar solche Dinge wie LayoutTransform durchführen, GDI kann damit jedoch nicht angesprochen werden. Dein Anliegen funktioniert m.E. nicht mit diesem WebBrowser, Du bräuchtest ein WebBrowser-Control das direkt mit dem WPF-"Malsystem" arbeitet.

=> Hast Du vllt System.Windows.Controls.WebBrowser mit System.Windows.Forms.WebBrowser verwechselt?

18.09.2014 - 11:59 Uhr

Du könntest mal das "Enable the Visual Studio hosting process" abschalten und prüfen was dann passiert.

18.09.2014 - 11:52 Uhr

Hallo,

Du könntest das ItemsPanel setzen


<ListBox.ItemsPanel>
  <ItemsPanelTemplate>
    <VirtualizingStackPanel />
  </ItemsPanelTemplate>
</ListBox.ItemsPanel>

16.09.2014 - 17:19 Uhr

... und dann ein VirtualizingWrapPanel verwenden damit nur die sichtbaren Bilder gezecihnet/berechnet werden.

16.09.2014 - 16:22 Uhr

...Erst durch sein Accessibility-Plugin versucht er der Barrierefreiheit gerecht zu werden. Und ein solches Plugin wäre für WPF ebenfalls einfach möglich wenn dieses durch (genormte) AttachedProperties dem Reader Hinweise über die Lesereihenfolge gibt.

12.09.2014 - 15:57 Uhr

Hallo,

ich finde diese Lösung gar nicht so schlecht. Zumindest dürfte eine modaler Dialog nicht die Adresszeile sperren.

12.09.2014 - 15:09 Uhr

Hallo,

Du kannst genauso vorhandene Tabellen in Dein Code-First-Ansatz einbinden. Mußt halt bei Database.SetInitializer nicht die DropCreateDatabaseIfModelChanges-Strategie verwenden. Es gibt für VS ein Addon EF Reverse POCO Generator, vllt hilft das.

12.09.2014 - 14:33 Uhr

dann StartApplication() asynchron aufrufen oder die einzelnen Methoden im Bootstrapper? Hallo,
das kann man aus der Ferne nicht beurteilen, wir sehen ja nicht wie weit diese Methoden auf dieselben Daten zugreifen. Wenn beispielsweise LoadBootstrapper() und LoadActiveConfiguration() komplett getrennt sind könnte man sie mit await Task.WhenAll parallel ausführen. Eine andere Möglichkeit wäre die Initialisierung komplett asynchron durchzuführen und sofort das Hauptfenster zu zeigen. Da es aber sein kann das der Benutzer sofort eine Aktion startet aber Deine App noch nicht initialisiert ist müsstest Du dann das entweder mit einer Sperrprimitive blocken oder die Ressourcen ebenfalls als Task erwarten. Was besser ist bzw. den Aufwand rechtfertigt kann man aus der Ferne nicht beurteilen.

10.09.2014 - 13:05 Uhr

Hallo,

arbeite mit TabControls oder erstelle UserControls

10.09.2014 - 13:03 Uhr

Und was ist wenn in Spalte 2

HALLO 88.88 HALLO

steht? Ist 88.88 schon Spalte 3? Die Werte müssen eindeutig zuordbar sein.

10.09.2014 - 11:51 Uhr

Wenn Du mit ReportDesigner RDLC-Reports des SSRS meinst, solltest Du eine Tabelle in den Bericht packen und dieser Dein Dataset zuweisen. Dann kannst Du in den Spalten der Tabelle Deine Properties binden.

Du solltest vllt erst einmal eine Tutorial oder so durcharbeiten, dann ist auch der Frust mit RDLC geringer.

10.09.2014 - 11:48 Uhr

Mal blöd gefragt, kannst Du das nicht als normale CSV-Datei interpretieren mit Leerzeichen als Trenner und die leeren Einträge rauswerfen?

Und wie soll er dann Spalte 2 und 5 korrekt zuordnen können?

10.09.2014 - 11:07 Uhr

Hallo,

na gar keine. Eine Aggregatfunktion gibt keine einzelnen Werte aus. Das ssagt doch schon der Name. Vllt solltest Du Dich mit Gruppierungen oder Subreports befassen.

10.09.2014 - 10:24 Uhr

Hallo,

ich denke nicht dass das mit einem Datagrid geht. Möglicherweise ist ein anderes Control besser geeignet, vllt ListView.

08.09.2014 - 10:17 Uhr

Hallo bammes,

höre bitte auf herbivore und implementiere erst einmal IDisposable des Webclients.

05.09.2014 - 10:48 Uhr

Hallo,

nein, das ist ungünstig in der Datei zu schreiben. Nimm zwei Streams, einem zum Lesen und einen zum Schreiben in eine temporäre Datei und kopiere die Daten von den einem in den anderen und passe die Leerstrings dabei an. Abschließend kopierst Du die Datei um. Das sind aber eigentlich Grundlagen ...

05.09.2014 - 10:43 Uhr

Hallo,

mal eine Gegenfrage: wie kannst Du in Deiner Anwendung ein neues Fenster öffnen? Also einem ViewModel sagen "führe auf deinem zugrundeliegenden View ein Show() aus". Kannst Du diesen Mechanismus nicht dafür verwenden? WPF-Frameworks haben dafür die nötigen Mittel. Verwendest Du eines?

03.09.2014 - 12:00 Uhr

Hallo,

wie sollen wir Dir helfen wenn wir den Beicht nicht kennen? Ist die zweite Seite leer?

03.09.2014 - 11:57 Uhr

Hallo,

warum nimmst Du nicht ein CollectionContainer wie Listbox oder ItemsControl bindest dort Deine Aufzählung und überschreibst dann das ItemTemplate mit Deinem Stackpanel? Das lässt sich komplett im XAML lösen.

28.08.2014 - 12:05 Uhr

Hallo,

das sollte in der Registry vermerkt sein welche Apps geeignet sind, Dateien eines bestimmten Typs zu öffnen (was also im Browser-Kontextmenü unter Öffnen mit... steht). Du solltest vllt diese Einträge auslesen und dann anbieten.

28.08.2014 - 11:53 Uhr

...aber bei SVN kannst Du doch auch einen Branch machen und die Änderungen wenn sie OK sind mit Reintegrate übernehmen?

28.08.2014 - 11:32 Uhr

Nö, ich würde das auch mit einem Composite lösen. Ich meine nur dass Du das in der Db mit einem Self Join lösen musst. Das Modellobjekt Produkt muß eine Referenz auf Produkt-Objekte haben damit Du das Composite in der DB persistieren kannst. Das geht auch mit Code First


public class Produkt
{
  ...
  public virtual Produkt Parent { get; set; }
  public virtual Collection<Produkt> Children { get; set; }
}

28.08.2014 - 11:26 Uhr

aber eine kleine lokale Maßnahme, wie es diese Option war, wäre mir halt lieber Dann benutze doch ein kleines, lokales Repository.

28.08.2014 - 11:05 Uhr

Hallo,

und wenn Du ein Softwarerepository einsetzt? Revert?

28.08.2014 - 10:57 Uhr

Testweise soll das Programm erstmal an ca. 8 Leute gehen - im Endeffekt evtl. an ca. 800 Na dann ist doch Click Once besser geeignet als eine Setup.exe. Lies Dich da mal ein.

28.08.2014 - 10:25 Uhr

Hallo,

in einer relationalen Datenbank werden Referenzen über Fremdschlüssel abgebildet. Also sollte die Stückliste ein extra Entity sein worauf die Produkte verweisen (also Fremdschlüssel zur Stückliste im Produkt). Wenn sich die Stückliste für ein Produkt ändert muß eben diese Stückliste in eine neue kopiert werden.

Vllt geht es mit Vererbung?* Produkt hat eine Selbstreferenz auf sich selbst

  • Produkt kann sich in ein Fertigteil oder Halbprodukt spezialisieren
  • Halbprodukt ist einer Stückliste zugeordnet
  • Stückliste besitzt Items

Wenn Du Vererbung einsetzen willst mußt Du das unbedingt die EF-Performance vorher testen.

27.08.2014 - 12:45 Uhr

Hallo,

die letzte Zeile wird wahrscheinlich nicht geschrieben da der Cursor da noch drin ist. Probiere ein BindingSource.EndEdit.