Laden...

Forenbeiträge von Wax Ingesamt 731 Beiträge

10.08.2012 - 09:38 Uhr

Hallo zusammen,

ich bin in einem unserer Projekte gerade auf folgenden Code gestoßen:


public delegate bool MyDelegate(Control page1, Control page2);
...
public event MyDelegate ValidateQuantity;
...


var valid = true;
var handler = ValidateQuantity;
if (handler != null) {
    valid = handler(page1, page2);
}
return valid;


Das kann/darf man doch so nicht schreiben, oder? Man weiß doch überhaupt nicht wieviele Handler sich registriert haben und von daher überschreibt wohlmöglich ein Handler-Rückgabewert einen anderen. Oder sehe ich das falsch?

MfG
wax

23.05.2012 - 07:27 Uhr

Hi, du brauchst natuerlich die zum Fenstertext zugehoerige Instanz. Ich kenne mich in der API nicht aus, doch falls es dort Methoden gibt, die dir zu einem Fenstertitel oder Handle ein Objekt zurueck geben, dann kannst du das ja vielleicht auf Find oder sonst eine Basis von Find casten.

MfG
Markus

21.05.2012 - 10:59 Uhr

Hi trib,

was spricht denn dagegen einfach eine BindingList zu nehmen? 😃

MfG
wax

24.04.2012 - 15:23 Uhr

Hi Khalid,

sind Mocks nicht nur dazu da um Schnittstellen (Übergabepunkte) zu testen?
In meinem Fall kann es nicht sein, dass das Laden eines Objekts jemals anders Implementiert wird als über die aktuell existierende Methode (also per DB-Zugriff).
Wenn ich nun ein Mock benutzen würde, dann wüsste ich ja nicht wirklich ob der ganze Datenbankzugriffs-Kladderadatsch im Hintergrund wirklich funktioniert, da ich mir doch die Daten "vorgaukeln" würde.
Oder sehe ich das falsch?

MfG
wax

24.04.2012 - 14:46 Uhr

Hallo zusammen,

ich schreibe seit geraumer Zeit UnitTest´s da ich (glaube ich zumindest) nach dem TDD-Schema entwickle.

Dabei drängt sich mir folgende Frage immer mehr auf:

Stellen wir uns vor ich habe 2 Methoden. Die eine schreibt Daten in eine Datenbank und die andere kann diese Daten wieder aus der Datenbank abrufen.
Wenn ich für diese Methoden nun Tests schreiben möchte, wie hält man es dann mit der Reihenfolge der Aktionen/Tests?

Sollte man nun im Test zum Laden zuerst den Test zum schreiben aufrufen oder sollten die Tests generell unabhängig, also ohne benötigte Reihenfolge, durchgeführt werden können?

MfG
wax

15.04.2012 - 19:47 Uhr

Hi, ich kenne mich zu wenig im WPF Bereich aus um eine spezielle Antwort geben zu können.
Ich möchte eher anmerken, dass ich die Anzahl der Dateien für ein schlechtes Maß halte. Die (Gesamt-)Größe (Speicherplatz) halte ich für sinnvoller.

MfG
wax

03.04.2012 - 16:04 Uhr

Ich habs ans Laufen gebracht. Allerdings musste ich nachgeben und ein paar Spalten der Datenbank umbenennen. Anstatt "StoreIdFk" z.B. "Store_id". Halt so wie es (Fluent) NHibernate erwartet. Find ich eigentlich komisch, da ich doch einen Namen für die Spalten angeben kann, die von den erwarteten Konventionen abweichen. 🤔

MfG
wax

02.04.2012 - 21:21 Uhr

Hallo,

ich habe die Beziehung aus beiden Richtungen beschrieben, da es in dem "Getting started..." Tutorial von Fluent NHibernate so gemacht wurde. Da dachte ich mir das sie wissen was sie tun. 😃

Wegen den Tabellen und Spaltennamen: Ja die könnte ich mit Sicherheit weglassen!

MfG
wax

02.04.2012 - 18:04 Uhr

verwendetes Datenbanksystem: <SQLServer 2008>

Hallo,

im Anhang findet ihr ein Diagramm von meinem verwendeten Datenbankmodell.

Dazu habe ich folgende Mapping-Klassen erstellt:


 class EmployeeMap : ClassMap<Employee>
    {        
        public EmployeeMap()
        {
            Table("dbo.Employees");
            Id(x => x.Id).Column("Id").GeneratedBy.Increment();
            Map(x => x.FirstName).Column("FirstName").Not.Nullable();
            Map(x => x.LastName).Column("LastName").Not.Nullable();
            References(x => x.Store).Column("StoreIdFk");
        }
    }

 class ProductMap : ClassMap<Product>
    {
        public ProductMap()
        {
            Table("dbo.Products");
            Id(x => x.Id).Column("Id").GeneratedBy.Increment();
            Map(x => x.Name).Column("Name").Not.Nullable();
            Map(x => x.Price).Column("Price").Not.Nullable();
            HasManyToMany<Store>(x => x.StoresStockedIn)
                .Table("dbo.StoreProductRel")
                .ParentKeyColumn("Id")
                .ChildKeyColumn("ProductIdFk")
                .Cascade.All().Inverse();
        }
    }

  class StoreMap : ClassMap<Store>
    {
        public StoreMap()
        {
            Table("dbo.Stores");
            Id(x => x.Id).Column("Id").GeneratedBy.Increment();
            Map(x => x.Name).Not.Nullable();
            HasMany(x => x.Staff).KeyColumn("StoreIdFk").Inverse().Cascade.All();
            HasManyToMany(x => x.Products)
                .Table("dbo.StoreProductRel")
                .ParentKeyColumn("Id")
                .ChildKeyColumn("StoreIdFk").Cascade.All();
        }
    }

Ich erzeuge im Testprogramm nun ein paar Objekte mit allen Beziehungen usw.
Dann rufe ich auf meinem Session-Objekt session.SaveOrUpdate(obj1) auf.
Beim Aufruf von Commit an meinem Transaktionsobjekt, wird mir allerdings folgende Exception um die Ohren gehauen:

Fehlermeldung:
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.

Die einzelnen Entitäten werden korrekt gespeichert, nur in der m:n Tabelle "StoreProductRel" steht nichts drin und die Fehlermeldung ist auch nicht so berauschend 😃

Weiß vielleicht jemand was ich da falsch mache?

MfG
wax

02.04.2012 - 11:41 Uhr

Ok hat sich erledigt. Ich habe einfach nochmal per NuGet Fluent NHibernate installiert und plötzlich hatte ich auch eine Iesi.Collections.dll dabei. 😃

MfG
wax

02.04.2012 - 11:26 Uhr

verwendetes Datenbanksystem: <Firebird>

Hallo zusammen,

ich mache gerade erste Gehversuche mit Fluent NHibernate im Zusammenspiel mit einer Firebird-DB.

Leider bekomme ich bei Aufruf von folgendem Code:


FluentConfiguration tempConfig = FluentNHibernate.Cfg.Fluently.Configure();

diese Fehlermeldung:> Fehlermeldung:

Die Datei oder Assembly "Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.

Ich kann mit dieser Fehlermeldung gerade nichts anfangen. Hat jemand eine Idee was das mit NHibernate zu tun hat?

MfG
wax

15.03.2012 - 14:56 Uhr

Hi,

jede Methode könnte einen Rückgabewert haben, der anzeigt ob die Methode "erfolgreich" war. Sagen wir mal boolean.
Wenn nun ein Aufrufer feststellt, dass eine aufgerufene Methode false zurück gegeben hat, dann wird die Verarbeitung gestoppt und die Methode gibt selbst auch wiederum false zurück. So wird das false bis zum ersten Aufrufer (Methode A) durchgereicht und auch dieser kann entsprechend regieren.

MfG
wax

edit: ok zu langsam 😃

08.02.2012 - 11:51 Uhr

Wenn beide Events dieselbe Signatur haben sollte es gehen. Das wird aber nicht der Fall sein denke ich mal, oder?

MfG
wax

06.02.2012 - 10:17 Uhr

Ich stimme Abt zu.
Man merkt, dass du eine Vorstellung davon hast wie das System arbeiten soll. Diese Anforderungen nun in Code umzusetzen musst du schon selbst erledigen. Sorry

MfG
wax

06.02.2012 - 10:09 Uhr

Wenn er um 5 Uhr rausfährt war er doch auf jeden Fall zum Nachttarif drin.

MfG
wax

06.02.2012 - 09:08 Uhr

Hi, ich verstehe das Problem wohl nicht ganz, denn sonst wäre die Prüfung zu einfach 😃

Sollte für Zeitpunkt a nicht folgender Code reichen?


a.TimeOfDay.Hours >= 20 || a.TimeOfDay.Hours < 6

MfG
wax

30.01.2012 - 13:35 Uhr

Hi,
musst du zufällig noch den "Erzeuger" der Tabelle angeben? Also OwnerName.Tabelle

MfG
wax

25.01.2012 - 12:05 Uhr

Hi bakerman,

ohne die signifikanten Stellen deines Codes zu sehen, müsste ich schon meine Kristallkugel reaktivieren um dir helfen zu können. 😉

MfG
wax

17.01.2012 - 09:55 Uhr

Hi And.Wolf,

dies lässt sich per ShowingEditor-Event lösen.

Dieser Artikel zeigt wie es geht: Showing and Hiding Editors

MfG
wax

05.01.2012 - 09:31 Uhr

BackColor = Color.Empty

13.12.2011 - 12:23 Uhr

Mir ist noch nicht ganz klar was du machen möchtest...

Geht es jetzt generell darum mehrere Statements hintereinander abzuschicken, also mehrere DML- oder DDL-Statements, oder möchtest du aus mehreren SELECT´s ein einziges Result bekommen?

MfG
wax

13.12.2011 - 11:45 Uhr

Hi Sgrab,

meinst du zufällig den UNION Befehl?

MfG
wax

28.11.2011 - 17:06 Uhr

Hi Inoir,

was spricht denn dagegen, dass Question eine List<Antwort> enthält?

MfG
wax

24.11.2011 - 12:00 Uhr

Hi Seebär,

ein komplettes löschen würde ja "null" bedeuten.
Dieser Wert ist für Integer (Werttyp) nicht zulässig.

MfG
wax

16.11.2011 - 15:12 Uhr

Hi,

kommt er denn überhaupt bis zur 3. Zeile? Weil du ja vorher n return im Code hast.

MfG
wax

27.10.2011 - 22:54 Uhr

Aiaiai,

hier ist ja was los. 😃
Danke für die vielen Beiträge und nochmal danke für das Code-Beispiel!

Nach all diesen Erkenntnissen und Verwirrungen 😉, stelle ich mir jetzt endgültig die Frage welche Berechtigung ein Presenter nun noch hat?

Ich habe mich ja anfangs mit MVP-VM beschäftigt, doch rutsche immer mehr in ein reines MVVM hinein. 😃

MfG
wax

26.10.2011 - 14:21 Uhr

Hi Gü,

Im Model ist keine INotifyPropertyChanged unbedingt notwendig, da dieses im ViewModel ist und das "wrappt" das Model.

"Ab wann" ist es für dich sinnvoll das PropertyChanged auch im Model zu nutzen?

MfG
wax

26.10.2011 - 13:39 Uhr

Hi ErfinderDesRades,

jetzt wo ich es nochmal in Ruhe lese, sehe ich auch nur noch einen Weg und genau so habe ich es jetzt auch gemacht. 😃 Per INotifiyPropertyChanged im Model.

MfG
wax

25.10.2011 - 21:32 Uhr

Hallo Gü,

stellen wir uns vor ich betätige einen Button in der View. Nun teilt mein Code dem Presenter den Wunsch zum Laden von Daten mit. Der Presenter schafft die Daten ran und aktualisiert das Model. Nun würde ich diese neu geladenen Daten gerne in der View sehen.

Du hast nun zwei Wege aufgezeigt. Einmal den über INotifyPropertyChanged und einmal über das "anstoßen" der View, damit sie sich quasi selbst aktualisiert. Welchen Weg würdest du bevorzugen bzw. welchen sollte man nehmen?

MfG
wax

25.10.2011 - 17:22 Uhr

Hallo,

ich arbeite mich zur Zeit anhand des Artikels MVVM for .NET WinForms
in das Thema MVP-VM ein.

Meine Frage bezieht sich auf folgendes Zitat:

As you can see in the figure above, each UI widget is bound to a matching property on the ‘customer view model’, and each property of the ‘customer view model’ is linked to a matching property on the ‘customer data entity’. So for example, when the user changes the value of the ‘Name’ textbox – the ‘Name’ property of the ‘customer view model’ is automatically updated via data binding, which causes the update on the ‘Name’ property of the ‘customer data entity’. In the other direction, when the ‘customer data entity’ changes – the changes reflect on the ‘customer data model’ which causes the appropriate widgets on the view to change via data binding.

Speziell auf den letzten Teil:

In the other direction, when the ‘customer data entity’ changes – the changes reflect on the ‘customer data model’ which causes the appropriate widgets on the view to change via data binding.

Also in seinem Beispiel-Code kann ich diese Fähigkeit nicht erkennen. Damit Änderungen, die nicht vom User eingegeben wurden im GUI sichtbar werden, müsste ich schon das ViewModel anfassen. Es reicht nicht die Daten im Model zu ändern, da keine Verbindung zwischen Model und ViewModel besteht. Also so etwas wie INotifyPropertyChanged zwischen den beiden.

Übersehe ich hier etwas oder funktioniert das in seinem Beispiel wirklich nicht?

MfG
wax

21.10.2011 - 16:52 Uhr

Hi,

bist du dir auch sicher das deren Webserver was mit ASP.NET anfangen kann?

MfG
wax

10.10.2011 - 09:02 Uhr

Moin,

das erste was mir auffällt hat mit folgendem Satz zu tun:

"...the user doesn´t need to worry about the specific database..."

Das funktioniert nur solange, wie der Entwickler absolute "Basic-SQL-Statements" schreibt. Sobald irgendeine spezifische DB-Funktion im SQL-String vorkommt, klappt es nicht mehr.

MfG
wax

04.10.2011 - 11:36 Uhr

Hi, gerade bei Threading Geschichten, reicht IMHO kein "in etwa" Code.

So kann ich nur sagen, dass es in diesem gezeigten Code durchaus möglich ist, dass das nächste Timerintervall rum ist und wieder Aufgaben per neuem Thread abgearbeitet werden, bevor ein anderer Thread seine Arbeit erledigt hat. Außerdem hoffe ich, dass die Aufgabenliste kleiner wird in der Methode "WorkerThreadStartMethode".

MfG
wax

28.09.2011 - 15:23 Uhr

Hi,

Ist durchaus nicht garantiert.

Hat da jemand ne Erklärung zu? Würde mich interessieren...

MfG
wax

28.09.2011 - 11:28 Uhr

Hallo Diräkt,

dann kapsel die Zuweisung doch mal und synchronisiere diesen Teil. Zum Test halt...

Ansonsten steht in der MSDN folgendes:

Assigning an instance of this type is not thread safe on all hardware platforms because the binary representation of that instance might be too large to assign in a single atomic operation.

Kann jetzt nicht sagen ob es sich auswirkt...

MfG
wax

24.09.2011 - 21:03 Uhr

Hi

DoSomething() von A erstellt immer eine Instanz von A, DoSomething() von B immer eine von B u.s.w.

Jetzt verstehe ich nicht mehr warum du nicht einfach den Konstruktor public machst?

MfG
wax

12.09.2011 - 16:21 Uhr

Hast du es ausprobiert?

ps: du mussts natürlich eine Prüfung durchführen. Sowas wie


// if(tempRow["checked"]){...}

MfG
wax

12.09.2011 - 15:20 Uhr

Hier mal etwas Beispielcode:



private void GridView_RowCellStyleHandler(object sender, RowCellStyleEventArgs e)
{
    DataRow tempRow = this.GridViewColorOverview.GetDataRow(e.RowHandle);
        if ((tempRow != null)) {
	    if ((e.Column.FieldName.Equals("deineSpalte"))) {
	        // irgendwelche Prüfungen an tempRow
                // ...
                
                // Einstellungen an der Zelle (hier z.B. ReadOnly = true)
		e.Column.ColumnEdit.ReadOnly = true;
	    }		
        }
}


MfG
wax

12.09.2011 - 13:31 Uhr

Hi And.Wolf,

ein GridView Objekt hat für solche Zwecke z.B. das "RowCellStyle" - Event.
In diesem kannst du per RowHandle (bekommst du per RowCellStyleEventArgs) und Column (bekommst du auch per RowCellStyleEventArgs) herausfinden, um welche Zelle es sich handelt.

Wenn du die passende Column gefunden hast, dann einfach an GridColumn.ColumnEdit deine gewünschten Einstellungen vornehmen.

MfG
wax

27.07.2011 - 11:03 Uhr

Hi Da_flo,

ich denke so eine Prüfung sollte man immer auf den "Daten" und nicht auf dem GUI-Code ausführen. Wer stellt denn sicher ob der Anwender nicht erst einen abweichenden Wert und anschließend wieder den Ausgangswert einträgt? 😃

MfG
wax

15.07.2011 - 09:52 Uhr

Hi herbivore,

oder einfach den Parent der ListBox auf den Parent der TextBox setzen

es ist so einfach und funktioniert so gut! 😁 Sieht super aus. Danke! 👍

15.07.2011 - 09:28 Uhr

Guten Morgen,

ich versuche hier gerade eine TextBox mit Intellisense Unterstützung zu implementieren.
Nun stehe ich allerdings auf dem Schlauch, wie ich die Intellisense-ListBox "Visible" mache. Also es soll halt ganz typisch funktionieren. Der Anwender schreibt einen Text in die TextBox und auf ein bestimmtes Zeichen hin poppt die Intellisense-TextBox auf.

Nur leider bekomme ich die ListBox nicht in ihrer kompletten Größe dargestellt....

Also damit die ListBox angezeigt werden kann, muss sie doch der Controls-Auflistung der TextBox übergeben werden, oder?

Wenn das der Fall ist, dann ist die ListBox aber in der Höhe auf den Wert der TextBox-Höhe beschränkt. Also sie würde ja nur innerhalb der TextBox sichtbar sein. --> FAIL!

Wie bekomme ich es hin, dass sich die ListBox quasi einfach "über" die TextBox hinaus zeichnen kann?

Mir fällt da nur ein seltsamer Weg ein. Der da wäre: Dem ParentControl der TextBox die ListBox hinzufügen und somit anzeigen können.

Geht es irgendwie "richtiger" ? 😄

MfG
wax

22.06.2011 - 09:20 Uhr

Guten Morgen,

das Problem hat sich in Luft aufgelöst, nachdem ich bemerken musste, dass der 2. BGW im Thread des 1. BGW gestartet wird. 😮

Somit war der erste Thread wohl in der Regel eher "fertig" und dem 2. BGW wurde der Boden unter den Füßen weggerissen. Also so stelle ich es mir jetzt vor...

Vielen Dank für die reichlichen Beiträge!

MfG
wax

21.06.2011 - 16:55 Uhr

Hallo herbivore,

das ist sichergestellt. Das Objekt, dass den BackgroundWorker enthält und auch startet, ist ein UserControl und dieses wurde auf jeden Fall im GUI-Thread erstellt.

MfG
wax

21.06.2011 - 15:53 Uhr

Ok, also der Aufruf des BackgroundWorkers ist hier jetzt nicht zu sehen. Aber es passiert halt nichts ausser:


backGroundWorker.RunAsync();

Die beiden Events sind auch abbonniert!

Hier die EventHandler:


private void DataBackgroundWorker_DoWork(System.Object sender, System.ComponentModel.DoWorkEventArgs e)
{
    if ((this.DataBackGroundWorker.CancellationPending)) {
        e.Cancel = true;
    } 
    else {
        
        IData tempData = remoteProxy.LoadData(EType);
        if ((tempData != null)) {
            e.Result = tempData;
	}   

    }

}

private void DataBackgroundWorker_RunWorkerCompleted(System.Object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
    this.DataObject = e.Result;

    // AdminDataLoaded ist ein Event !
    if (AdminDataLoaded != null) {
        AdminDataLoaded(this, EventArgs.Empty);
    }

}

Mfg
wax

21.06.2011 - 15:41 Uhr

Ja, es feuert immer der gleiche. Ein Sleep bringt keine Veränderung.

MfG
wax

21.06.2011 - 13:40 Uhr

Hi,

@winSharp93: Ja, jede Instanz hat ihren eigenen BGW.

@Grumbler85: Es passiert immer, wenn ich eben DoEvents() nicht aufrufe. Also ob im Debug oder wenn ich es einfach so laufen lasse. Das kann ich gut nachvollziehen, da im RunWorkerCompleted-EventHandler Dinge gemacht werden, die mein GUI verändern. Von daher sehe ich sofort, welcher BGW sich zurück meldet und welcher nicht.

Das komische an der ganzen Sache ist ja, dass beide DoWork-Eventhandler korrekt bis zum Schluss abgearbeitet werden. Nur leider feuert nur ein BGW das Completed-Event. 😦

MfG
wax

21.06.2011 - 12:29 Uhr

Hallo zusammen,

ich beiß gleich in die Tastatur! 😃

Also.... Ich habe in meiner Anwendung zur Zeit 2 Objekte, die jeweils einen Backgroundworker instanzieren. Also 2 Objekte mit separaten Backgroundworkern!

Nun starten diese 2 Instanzen ihre Backgroundworker schnell hintereinander (also quasi liegen da nur ein paar einfache Zuweisungen zwischen den beiden Zeilen, welche den Backgroundworker starten). Das Resultat lautet, dass nur ein Backgroundworker das RunWorkerCompleted-Event feuert, der andere nicht.

Sobald ich aber die Evil-Anweisung


 System.Windows.Forms.Application.DoEvents()

nutze, läuft alles wie gewünscht. Also es werden dann brav beide RunworkerCompleted-Event´s gefeuert.

Was kann das sein? Ich will DoEvents nicht verwenden!!!

Mfg
wax

07.06.2011 - 10:59 Uhr

Ich finde es ehrlich gesagt schon komisch, diese Art der Businesslogik durch die DB zu implementieren, aber hey was solls... 😉

Kann man das vielleicht über einen Check-Constraint hinbekommen...

So nach dem Motto (in Pseudo SQL^^):

CHECK parent.activeState = kind1.activeState OR kind2.activeState OR .... OR kindN.activeState

MfG
wax