Laden...
W
Benutzerbeschreibung

Forenbeiträge von witte Ingesamt 955 Beiträge

17.12.2014 - 11:45 Uhr

... oder in einem StackPanel? VirtualizingPanel in DataGrid
Prüf mal nach ob er die Zeilen virtualisiert. Autowidth sollte eigtl keine Rolle spielen, dann spring die Zeilenbreite eben.

Mach doch mal ein TestWindow mit nur dem DataGrid als Root und lade dort die Daten rein zur Differentialdiagnostik....

09.12.2014 - 15:41 Uhr

--- Fehler meinserseits, sry.

08.12.2014 - 12:34 Uhr

OK, dann haben wir aneinander vorbeigeredet. Vllt änderst Du den Threadtitel in "Automatisch Fensterzustand (Position, Spaltenreihenfolge bei Grids etc) speichern und wiederherstellen" o.ä. damit man kapiert was Du willst.

08.12.2014 - 12:29 Uhr

Weiß nicht ob es hilft, aber Du kannst Dir mal den Automapper anschauen, der kann rekursiv mappen (falls Du den Aufwand scheust manuell die ViewModels für die Children zu füllen)

08.12.2014 - 11:48 Uhr

Dann könntest Du für jedes Tab ein ViewModel erstellen das die Informationen bereithält die an jeweils ein MyUserControl gebunden werden. Also ein HauptViewModel was eine IList<MyUserViewModel> o.ä.besitzt. Verwendest Du Dependency injection?

08.12.2014 - 11:25 Uhr

Ich verstehe das Problem nicht. Du brauchst doch nur IDataErrorInfo richtig zu implementieren, den Fehler bindest Du doch im XAML. Wenn Du das im Grandchild anzeigen willst brauchst Du doch nur Parent.Parent zu befragen ob dessen Status passend ist, wenn der Rootknoten das anzeigen soll muß er eben seine Kinder befragen ob jmd ein Problem damit hat. Mußt halt INotifyPropertyChanged entsprechend implementieren.

08.12.2014 - 11:07 Uhr

Na haste denn mal den Networkstream mit Wireshark o.ä. überprüft ob Passwort etc korrekt übertragen werden?

08.12.2014 - 10:58 Uhr

Hallo

es ist schwierig hier Hilfe zu geben wenn Du wenig konkret Dein Problem schilderst.
* Du könntest mit dem x:Shared-Attribut mal herumspielen.
* was ist zu aufwändig daran 5x new UserControl zu machen? Oder verwendest Du Dependency injection? Dann eben Lifestyle.Transient.

08.12.2014 - 10:52 Uhr

Hallo,

warum muß das so kompliziert gemacht werden? Kann der Parent nicht einfach seine Kinder fragen ob Status "5" OK ist und die fragen dann ihre Kinder?

04.12.2014 - 18:05 Uhr

... zumal die Db ja wohl selber runden/abschneiden sollte.

03.12.2014 - 21:14 Uhr

Hallo,

Problematisch wird es, wenn eine (Unter-)Klasse mehrere Interfaces implementieren soll. Man könnte in dem Zusammenhang auch über Entwurfsmuster nachdenken, Decorator, Proxy, Bridge (oder Monaden wenn hier jmd funktional programmiert).

28.11.2014 - 16:44 Uhr

Hallo,

wenn Du den Frame in einen Scrollviewer packst mußt Du Dich nicht wundern da der Scrollviewer die Illusion einer unendlich großen Fläche an seinem Child vermittelt. Vllt solltest Du die ausufernde Datagridspalte beschränken vllt mit MaxWidth. Bei einem vertikalen Gridsplitter eines Grids setze ich die MaxWidth dynamisch, damit man den Splitter nicht über das Window hinausschieben kann, vllt hilft es ja hier:


<Grid.ColumnDefinitions>
 <ColumnDefinition Width="350" MaxWidth="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=ActualWidth, Converter={StaticResource AddConverter}, ConverterParameter=-10}" />
 <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

25.11.2014 - 11:29 Uhr

... wobei dann natürlich TPL Dataflow noch einfacher ist.

25.11.2014 - 11:16 Uhr

Hallo,

ich gehe mal davon aus das Du LocalReport-Mode meinst

  1. liefere die ReportViewer dll's doch mit aus. (Projekt-Properties der Exe öffnen, Publish-Reiter, Application files, und dort die ReportViewer-Assemblies auf Include stellen.) Vllt verwendet er dann die mitgelieferten , nicht die installierten.
  2. Ist der Namensraum des Reports korrekt? Also ist er "Export" in Deinem Fall?
    Du kannst den Report mal als STream laden:

                Assembly assembly = Assembly.Load("Assembly-Name ohne Endung");
                var stream = assembly.GetManifestResourceStream("Export.RptGruppenumsätze.rdlc");
                viewer.LocalReport.LoadReportDefinition(stream);

24.11.2014 - 13:55 Uhr

Task.Run habe ich nur zum Kaskadieren verwendet, weil der Unterbau für GetString noch nicht asyncfähig ist. Na dann mach doch ein await Task.Yield() erstmal rein.

24.11.2014 - 10:33 Uhr

Hi,

BTW, es wäre sinnvoll wenn Ihr Euch um eine vernünftige Projektdokumentation bemühen würdet damit der nächste nach Dir nicht vor denselben Problem steht.

23.11.2014 - 21:38 Uhr

Hallo,

* verwende eine CollectionView um Daten einfach zu filtern und sortieren.
oder
* schau Dir mal Linq an. Du mußt das heute nicht mehr mühselig per Hand implementieren.

23.11.2014 - 18:02 Uhr

Hallo,

Du könntest die Methode string GetString() in async Task<string> GetStringAsync() wandeln.

21.11.2014 - 12:41 Uhr

Hallo,

die IX 12/2014 hat ein paar Artikel zum aktuellen Stand der Softwaretests falls das interessiert.
* S. 52 Tools zur GUI-Testautomatisierung
* S. 64 Wie man die Sicherheit von Anwendungen systematisch überprüft

21.11.2014 - 12:33 Uhr

Hallo,

Bevor ich ein Auto bauen kann muss ich ja auch wissen wie ein Rad funktioniert oder nicht ?

Aber Du versuchst 100.000 Blechteile auszuschneiden und daraus das Auto zu bauen. Die anderen hier erzählen Dir was von einer Fertigungsstraße. Ich denke die anderen werden schneller fertig sein.
Aber zu Deinem Problem. Eine Sache mit der Du Dich beschäftigen kannst ist DrawingVisual. Man verwendet das eigentlich zu Zeichnen eigener Steuerelemente die sich nicht gut auf die üblichen abbilden lassen.


    public class DrawPanel : FrameworkElement, IDrawer
    {
        
        private readonly DrawingVisual dv;

        public DrawPanel()
        {
            dv = new DrawingVisual();
            AddVisualChild(dv);
            AddLogicalChild(dv);
        }

        
        public void DrawImages(IEnumerable<DrawTask> tasks)
        {            
            using (var dc = dv.RenderOpen()) {

                tasks.ForEach(p => dc.DrawImage(...)));
            }
        }

        protected override int VisualChildrenCount
        {
            get { return 1; }
        }


        protected override Visual GetVisualChild(int index)
        {
            return dv;
        }
    }
}

Dieses DrawPanel könnte man im XAML einbinden und dann kannste (hier z.B.) in DrawImages zeichnen.

17.11.2014 - 15:02 Uhr

Dann schreib die Exceptions doch in das EreignisLog des Servers statt sie zu verwerfen.

14.11.2014 - 21:54 Uhr

ich abstrahiere so etwas durch eine ServiceSchicht die auf die Repositories aufsitzt. Es lässt sich darüber streiten ob das des Guten zuviel ist, ich möchte jedoch Redundanzen vermeiden. Ein Service kennt seine Repositories, sucht sich die Daten zusammen und gibt es an die darüberliegende Applikationsschicht (Controller o.ä.) weiter. Die Repositoryschicht ist sehr dünn und hat nur die Aufgabe der Abstraktion des DAL.

14.11.2014 - 21:11 Uhr

Hi,

Also der Context ist dein Arbeitsbereich (Unit of Work), das Repository kennt ihn und seine Abhängigkeiten. Die Klasse die das Repository benutzt, soll genau diese Abhängigkeiten nicht kennen. Deshalb sollten die Abhängigkeiten auch im Repository aufgelöst werden. Wie soll ich das verstehen? Wenn man beispielsweise eine Artikelliste hat und packt ein Artikel in seinen Einkaufswagen, werden dann beide Entitäten in deinem Repository behandelt?

14.11.2014 - 18:13 Uhr

Im Zweifel halte ich es für besser, einen neuen Context zu erzeugen (Performance Probleme) als auf den gleichen Context in unterschiedlichen Repositorys zu arbeiten (Exceptions). Hallo, wenn man generische Repositories vewendet ist es meist üblich das jedes Repository einen Entitätstyp abbildet/versorgt. Wenn man nun in einer Arbeitseinheit Entities verschiedener Typen zusammen speichern will kann man nicht jedem Repository ein eigenen Context zuweisen sondern alle Repositories derselben Arbeitseinheit müssen denselben Kontext verwenden damit die Objektbeziehungen gespeichert werden können. Deshalb ist es hier besser ein UnitOfWork o.ä. zu verwenden das seinen Kontext in den Repositories injiziert oder entsprechende Facilities des DIC zu nehmen wenn vorhanden.

14.11.2014 - 14:20 Uhr

... in dem Du RelativeSource im Binding definierst.

z.B. Value="{Binding DataContext.ActionCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />

Aber wenn man Elemente in einer Liste hat will man doch eigentlich die Aktionen auch in dem Elementen haben oder?

13.11.2014 - 18:56 Uhr

Hallo,

so funktioniert das m.E. nicht. Prepare() wandelt das SQL-Stmt in ein Ausdrucksbaum um, also eine kompilierte interne Anweisungsfolge die dann die Ausführungseinheit des Servers abarbeitet. Diese bekommt die Parameterliste dann bei Execute mit, es gibt also kein SQL-String bei dem die Parameter durch Werte etc ersetzt werden. Am besten Du machst das wie der SQl-Profiler: gib den SQL-String aus und darunter die konkreten Werte der Parameter als Liste.

13.11.2014 - 18:08 Uhr

Dank Await blockiert Task.WhenAll(Action, Action1, Action2) nicht und scheint auf den ersten Blick sonst den selben Effekt zu haben und wäre damit viel besser geeignet? Ich würde diesen Weg nehmen, also Tasks ewarten. Prüfe unbedingt auch bei den verschiedenen Möglichkeiten wie Exceptions propagiert werden. Du hast nichts gewonnen wenn es sich einfach schreiben lässt aber Exceptions nicht erkannt werden und er Kunde dann anruft mit den Worten "die Anwendung macht nicht mehr weiter"... Erwartete Tasks geben die Exception an den Aufrufer weiter.

13.11.2014 - 16:55 Uhr

...
na dann doch eher Task.WhenAll(Action, Action1, Action2);

13.11.2014 - 13:01 Uhr

Hallo,

vllt mal erste Gedanken:

* Das EF kann POCO's erzeugen (z.B. durch Code-First-Strategie), d.h. diese Entityobjekte haben keinen Bezug zum Entity Framework und können daher als Modellobjekte verwendet werden. D.h. als erste Verbesserung könnte darin bestehen dass Du Deine Modellobjekte direkt mit dem EF persistieren lassen kannst.
* Um zu verhindern dass das EF durch die ganze App hindurchgeschleift wird bietet sich das Repository-Pattern an das das Data Access Layer von den oberen Schichten insofern abtrennt dass diese kein EF referenzieren.

12.11.2014 - 17:18 Uhr

Wenn Du die Tabllen joinst sollten vllt in den Tabellen KundeHaus und MaklerHaus auf Kunde,Makler,Haus jeweils ein Index liegen. Und lerne den SQL-Ausführungsplan zu interpretieren, da siehst Du ob er überhaupt ein Index nimmt bzw. welche Auswirkungen das hat. (Post v. LittleBoy)

12.11.2014 - 16:53 Uhr

Auf welcher Spalte liegt dein Index?

12.11.2014 - 12:33 Uhr

Man kann das auch mit Dependency Injection lösen. Man könnte wenn der Progress an verschiedenen Stellen verwendet werden soll einen ProgressService o.ä. bauen (falls die Infrastruktur sowas nicht anbietet). Diese würde dann Zugriff auf das MainViewModel bzw. dessen Progressbar bekommen. Alle anderen Konsumenten der Progressbar würden dann halt den IProgressService im ctor übergeben bekommen und rufen dessen Methoden auf (SetPercent(.9) oder so).

11.11.2014 - 14:17 Uhr

Hallo,

es spricht doch eigentlich nichts dagegen dass das Parent-VM seine Children-VM kennt. Du kannst auch Controller verwenden welche die ViewModels führen und die entsprechende Verdrahtung vornehnen.

10.11.2014 - 17:40 Uhr

Hallo,

das Holen von Daten via Index ist sehr teuer und wird nur genommen wenn die Abfrage sehr selektiv ist, sonst ist ein table scan schneller. Wiederhole Deine Anfrage mal mit einem Kriterium wo nur 2% aller Datensätze zurückgeliefert werden.

10.11.2014 - 16:04 Uhr

Das Transaktionsprotokoll ist vermutlich nicht ausgeschaltet. Sonst würde gar nichts mehr gehen. Er meint wahrscheinlich das Nachfahren des Logs bei einer Wiederherstellung. (Einfaches Wiederherstellungsmodell)

09.11.2014 - 20:02 Uhr

hallo,

mach doch zwei Methoden Person.AsCustomer und Person.AsEmployee und rufe die entsprechende Methode bei Person person = (Person)dropInfo.Data; auf.

07.11.2014 - 10:56 Uhr

Hallo,

ich mache mal ein Anfang.
zu 1.
Du könntest mit dem Debugger mal rumsteppen und schauen wo Kontextwechsel stattfinden
zu 2.
Ja, nach dem await wird mit dem Thread weitergearbeitet der vor dem await gearbeitet hat. Wenn Du das nicht willst (also weiter unten im Service/Repository-Bereich) kannst Du das mit await func().ConfigureAwait(false) angeben weil es dort egal ist mit welchem ThreadpoolThread gearbeitet wird. In der Application-Ebene nimmt man das eher nicht damit man die GUI aktualisieren kann.
Ich würde bei 3. und 4. allgemein empfehlen sich entsprechende Blogs im Netz durchzulesen, vor allem von Stephen Toub und Stephen Cleary. Dort gibt es viele nützliche Tipps und man versteht das Konzept dahinter besser.

05.11.2014 - 12:52 Uhr

Hallo,

wir wurde die App eigentlich installiert? Setup.exe, OneClick oder XCopy?

29.10.2014 - 13:54 Uhr

Na Du weiß doch nicht ob Dein Fehler am Speichern oder am Laden liegt. Wenn er korrekt speichern würde müßte doch irgendwo auf Deinem Rechner eine Datei rumliegen mit der Studentenliste right? Also Datei suchen/rauskriegen wo das Ding liegt und reinschauen.

29.10.2014 - 12:59 Uhr

Hallo,

versuch doch mal rauszubekommen wohin er die Datei im Isolated Storage das hinspeichern würde. Dann öffne doch mal die Datei und schaue noch ob die Liste da drin steht. Also um rauszubekommen ob es am Laden oder am Speichern liegt. Wenn keine Datei erzeugt wird kannst Du ja ersteinmal einen anderen Storage als Speicherplatz wählen (wenn es das für Apps überhaupt gibt).

29.10.2014 - 12:55 Uhr

Fehlermeldung:
(0,0) : Fehler 0175: Der angegebene Speicheranbieter kann nicht in der Konfiguration gefunden werden oder ist ungültig.

Hallo,
möglicherweise fehlt der Treiber für die DB oder wurde nicht mit ausgeliefert. Check auch mal [FAQ] Programm läuft in anderer Umgebung nicht (richtig)

28.10.2014 - 16:00 Uhr

Hallo,

Du könntest vllt Dir mal kompf.de durchlesen. Es gibt Verzerrungen, Frage ist wo Du Deine Bierwagen aufstellen willst. Wenn Du in D bleibst kannst Du wohl von einem Radiusvon 6378.388 km ausgehen.


        public double Entfernung(GpsModel other)
        {

            if (other == null) return Double.NaN;
            if (!this.HatGültigeKoordinaten || !other.HatGültigeKoordinaten) return Double.NaN;
            const double erdradius = 6378.388;

            double lat1 = Math.PI * this.GpsB.Value / 180d;
            double lon1 = Math.PI * this.GpsL.Value / 180d;
            double lat2 = Math.PI * other.GpsB.Value / 180d;
            double lon2 = Math.PI * other.GpsL.Value / 180d;
            double dist = Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(lon1) * Math.Cos(lon2) + Math.Cos(lat1) * Math.Sin(lon1) * Math.Cos(lat2) * Math.Sin(lon2) + Math.Sin(lat1) * Math.Sin(lat2);
            double result = erdradius * Math.Acos(dist);

            return result;
        }

28.10.2014 - 11:53 Uhr

Hallo,

schreib doch mal ein cFach hinter new.

Anmerkungen:
* Du kannst mit der {}-Konstruktor-Syntax schneller Testdaten erzeugen.
* Das Sortieren nützt Dir dort nichts, also zuerst filtern, dann gruppieren dann sortieren.

27.10.2014 - 11:18 Uhr

Hallo,

@Talon:


SELECT *
FROM Triggers AS t, Triggers_Done AS d
WHERE t.OID = d.Trigger_ID AND NOT d.Username = '123'

er schrieb aber

Ich möchte nun alle Zeilen der Tabelle Triggers zurückgeliefert bekommen,
die KEINEN Eintrag mit einem Usernamen X in der Tabelle Triggers_Done haben.

Also eher


SELECT DISTINCT t.*
FROM Triggers AS t, Triggers_Done AS d
WHERE t.OID = d.Trigger_ID AND NOT d.Username = '123'

... oder er hat sich ungenau ausgedrückt.

23.10.2014 - 11:47 Uhr

Hallo,

Du könntest Dir mal ein fertiges Framework wie beispielsweise gong-wpf-dragdrop anschauen. Im Quellcode sind Beispiele dabei.

22.10.2014 - 14:04 Uhr

Hallo

ist das nur beim ersten mal so? Da muß er das Mapping laden. Wieviele Tabellen?

22.10.2014 - 10:52 Uhr

Kann man nicht evtl. steuern, wie der EntityFramework selbst die Objekte lädt und zur Verfügung stellt? Also in gewisser Weise das Standardverhalten überschreibt? Hmh, vllt solltest Du die Frage auf Stackoverflow stellen. Noch ein paar Ideen:
* man könnte eventuell mit T4 Templates arbeiten. Also die DB mit DatabaseFirst ziehen und sich dort die T4-Schablone anschauen um damit selber die Klassen bzw Proxies zu generieren.
* eine andere Möglichkeit wäre AOP, also Postsharp oder Castle Windsor Proxies. ich weiß aber nicht wieviel Aufwand es bedeutet das stabil zu kriegen und was mit der Performance passiert.
* eigener Provider? Einen bestehenden im Quelltext anpassen? Hört sich nach viel Arbeit an.

21.10.2014 - 19:00 Uhr

Ich dachte einfach an das Proxymuster allgemein.



    public class CurrentEmployee
    {

        private Employee _model;


        public CurrentEmployee(Employee model)
        {
            _model = model;  
        }

        public int Id 
        { 
            get { return _model.Id; } 
            set { _model.Id = value; }
        }

        public int OriginalId 
        { 
            get { return _model.OriginalId; } 
            set { _model.OriginalId = value; }
        }

        ...

        public ICollection<Employee> Subordinates
        { 
            get { return _model.Subordinates.Where(m => m.OriginalId == 0 && m.AuditState != AuditState.Deleted).Select(p => new CurrentEmployee(p)).ToList(); }
            set { _model.Subordinates = value; }
        }
    }


    public class PastEmployee
    {

        private Employee _model;


        public PastEmployee(Employee model)
        {
            _model = model;  
        }

        public int Id 
        { 
            get { return _model.Id; } 
            set { _model.Id = value; }
        }

        public int OriginalId 
        { 
            get { return _model.OriginalId; } 
            set { _model.OriginalId = value; }
        }

        ...

        public ICollection<Employee> Subordinates
        { 
            get { return 
            
                // <gefilterte Liste>: suche alle Employees deren Änderungszeitpunkt vor dem (vllt statisch definierten) Grenzzeitpunkt liegen
                // gebe alle Employees aus deren Nachfolger nicht in <gefilterte Liste> liegen
            }
            set { _model.Subordinates = value; }
        }
    }

Dadurch geht der Typ verloren also kein Employee mehr. Weiß nicht ob das ein Problem für Dich ist.

21.10.2014 - 15:54 Uhr

Hallo,

kannst Du nicht ein Proxy-Objekt drübersetzen welches den Employee nach außen darstellt. Also die Kollektionen entsprechend filtert. Man könnte noch weitergehen: wenn ein bestimmtes Datum o.ä. dem Proxy bekannt gemacht wird könnte er die Situation zu diesem Zeitpunkt darstellen.