Laden...
M
MorphieX myCSharp.de - Member
Softwareentwickler Rahden Dabei seit 06.02.2012 184 Beiträge
Benutzerbeschreibung

Forenbeiträge von MorphieX Ingesamt 184 Beiträge

14.06.2013 - 13:52 Uhr

Den Wert für "LAST_INSERT_ID" merkt sich MySQL Verbindungsspezifisch. Das heißt wenn du mit der gleichen Connection den Wert abfragst, wird für dich die ID des letzten Inserts oder Updates einer Auto_increment-Spalte ermittelt.

So könnte es wohl z.B. aussehen:
Du feuerst in deinem DS ein Commit ab.
ADO.NET macht jetzt für jeden eingefügten Datensatz ein Insert
Nach jedem Insert wird das Event RowUpdated gefeuert
dort fragst du mit der selben Connection die ID ab

Ich habe es selbst aber noch nie ausprobiert 😉

14.06.2013 - 08:56 Uhr

ansonsten kannst du die letzte ID über einen eigenen Query abfragen

SELECT LAST_INSERT_ID();

Ob der MySQL-Provider für .NET das schon irgendwie implementiert, kann ich dir leider nicht sagen.

06.06.2013 - 11:44 Uhr

Als ich das erste Mal mit ADO.NET zutun hatte, habe ich mich auch gewundert, warum das so grottenlangsam im Vergleich zu anderen Programmiersprachen war...

Schuld war -wie HiGHteK bereits schrieb- der Debugger... Lasse ich meine Programme ohne Debugger laufen, sind sie genau so schnell wie z.B. bei nativen Sprachen...

17.05.2013 - 10:19 Uhr

Da bleibt dir wohl nichts anderes übrig, als die Suchmaske "zu fuß" zu füllen...

PDF-Datei mit Adobe Reader starten > Handle vom Reader merken
Suchefenster öffnen (Shift + Strg + F an das Fensterhandle senden)
Handle des Suchfensters suchen
Handle der Texteingabe suchen
Deinen Suchtext an die Texteingabe senden
Enter senden (oder den Button suchen und einen Mausklick senden)

im Prinzip nicht sonderlich kompliziert... Nur halt sehr unschön 😉

13.05.2013 - 15:45 Uhr

Wie ist dein Android-Gerät denn im Netz? WLAN? UMTS? Kabel?
Von welchem Browser machst du denn deine Tests? Lokal?

Vielleicht dauert es einfach nur verdammt lange, weil die Verbindung langsam ist...

Ist allerdings nur geraten... 😉

13.05.2013 - 08:51 Uhr

Reicht es nicht aus, einfach eine TCP-Verbindung (Sockets) über Port 80 (oder ggf. einen anderen Port) aufzubauen?
Kann die Verbindung aufgebaut werden > Server ist erreichbar
Läuft die Verbindung in einen Timeout > Server ist nicht erreichbar

So kann man sich den ganzen Traffic sparen.
Man kann so allerdings nicht sicher feststellen, ob auf Port 80 nicht zufällig irgendein anderer TCP-Server läuft... Aber normalerweise ist Port 80 für HTTP reserviert.

16.04.2013 - 12:06 Uhr

Programme (exe, dll,...) gehören nach %Programfiles%
Anwendungsdaten (Datenbanken, Konfiguration,...) gehören entweder nach %ProgramData% oder nach %AppData%
Das solltet ihr auf jeden Fall in eurer Software berücksichtigen... Im Programmverzeichnis hat der Benutzer keine Schreibrechte, und das ist auch gut so.

28.03.2013 - 15:32 Uhr

Naja, da fast alle Kalender-Dienste zumindest das iCal-Format verarbeiten können, könnte man die Funktionalität ja als gemeinsame Grundlage für alle Schnittstellen nehmen.

Dann könnte man eine Klasse mit allen möglichen Methoden (Add, Delete, Move, Copy, Get, List,...) schreiben und entsprechend je nach Dienst auf die Google-API, die Live-API, Outlook-Ole-Automation, CalDAV,... zugreifen.

Das ganze schön über Interfaces / abstrakte Klassen aufbauen und man könnte die Bibliothek auch leicht erweitern...

28.03.2013 - 10:12 Uhr

Hi,

ich muss demnächst einen Kalender programmieren, mit dem man für verschiedene Ressourcen Termine anlegen / verschieben / löschen / ... kann.
Sieht also so ähnlich aus wie man es von Outlook / Google / Live etc. kennt.

Die Termine sollen zudem mit beliebigen Cloud-Diensten und Programmen synchronisiert werden, z.B.:

  • Google Calendar
  • Live-Connect Calendar (Microsoft Hotmail)
  • Outlook
  • Exchange Server
  • CalDAV / WebDAV-Fähige Cloud-Dienste

Den Kalender zu programmieren und die Termine in eine eigene Datenbank zu speichern ist für mich kein Problem. Schwierig wird es bei der Synchronisation.

Muss ich hier jede denkbare API selbst implementieren, oder gibt es dafür irgendwelche fertigen Bibliotheken?
Anders gefragt: Kennt jemand eine Bibliothek, mit der man auf unterschiedliche Kalender-Dienste zugreifen kann?

25.02.2013 - 16:08 Uhr

Wenn es nur darum geht, dein C#-Programm mit MySQL zu verbinden, brauchst du kein ganzes XAMPP (Apache, MySQL, PHP, Pear) sondern nur den MySQL Server. http://www.mysql.de/downloads/mysql/

Hinweis: Solltest du vor haben, eine proprietäre Software zu entwickeln / verkaufen, dann nimm lieber direkt eine andere Datenbank.

25.02.2013 - 15:38 Uhr

Kann es sein, dass du versucht auf einem MySQL-Server zuzugreifen, der keinen entfernten Zugriff erlaubt? Z.B. von irgendeinem Webspace-Hoster?

29.01.2013 - 15:56 Uhr

Nee, Firebird, aber ich sehe gerade, dass dort wohl ein fehlendes @ automatisch nachgetragen wird...

Wieder was gelernt 😃

29.01.2013 - 12:28 Uhr

'@' als Zeichen vor dem Parameter ist auch richtig.

Sicher? Also im SQL-Befehl ja, aber im Parameternamen selbst?

Ich mache das immer so:

cmd.CommandText = "INSERT INTO Accounts (AccountName)  VALUES (@par1)";
 cmd.Parameters.AddWithValue("par1", "Einkauf");
 result = cmd.ExecuteNonQuery(); 

17.01.2013 - 16:01 Uhr

Bei mir ist es auf dem Terminal Server sogar noch schneller als lokal...

Das liegt vermutlich an allen möglichen Effekten, die ich lokal aktiviert habe (bzw. nie deaktiviert habe)
Auf dem Terminalserver sind solche Sachen wie "Fensterinhalt beim Ziehen anzeigen" oder "Animation beim Minimieren und Maximieren von Fenstern" deaktiviert und dadurch empfinde ich es als flüssiger...

Noch schlimmer wird es, wenn ich 3rd-Party-Tools für WPF einsetze... z.B. die DevExpress Controls (insbesondere die WPF-RibbonWindows) verschlimmern das ungemein.

17.01.2013 - 15:29 Uhr

WPF ist schneller

wirklich? Mir kommt es genau andersherum vor. Ich habe auf meinem Entwickler-PC aber auch nur eine schwache OnBoard-VGA

03.01.2013 - 11:34 Uhr

VS 2013?! Wohl eher 2012, oder?

Du kannst ja mal mit dem ProcessMonitor schauen, was bei dir so lange lädt...

20.12.2012 - 15:18 Uhr

verwendetes Datenbanksystem: Firebird 2.5

Hallo, ich habe eine WPF-Anwendung entwickelt, die auch das Entity Framework verwendet. Als Datenbank habe ich Firebird verwendet.

Auf meiner Entwickler-Maschine funktioniert alles wunderbar, doch wenn ich die Anwendung auf eine andere Maschine verteile, bekomme ich die Fehlermeldung> Fehlermeldung:

Der angegebene Speicheranbieter kann nicht in der Konfiguration gefunden werden oder ist ungültig.

Auf der Entwickler-Maschine habe ich die machine.config unter anderem mit folgenden Eintrag ergänzt:

<system.data>
    <DbProviderFactories>
      <add name="FirebirdClient Data Provider" invariant="FirebirdSql.Data.FirebirdClient" description=".NET Framework Data Provider for Firebird" type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, Version=3.0.2.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c"/>
    </DbProviderFactories>
  </system.data>

Dieser Eintrag fehlt offenbar den anderen Rechnern. Ich möchte aber ungern irgendwelche Config-Dateien manipulieren, wenn ich die Anwendung ausliefere...

Also habe ich den Eintrag ebenfalls in meine App.config eingetragen. Damit ist der Fehler bei den anderen Rechnern weg. Das Programm läuft damit also.

Doch jetzt habe ich das Problem auf meiner Entwickler-Maschine, denn ich habe jetzt ja zwei Einträge, einmal in der machine.config und einmal in der app.config. Ich erhalte dabei dann diese Fehlermeldung:> Fehlermeldung:

Die Spalte 'InvariantName' hat die Einschränkung, dass sie eindeutig sein muss. Der Wert 'FirebirdSql.Data.FirebirdClient' ist bereits vorhanden.

Anschließend habe ich den Eintrag in der machine.config entfernt. Danach bekomme ich zumindest keine Fehlermeldung mehr in der Laufzeit. Doch in der Designzeit sagt mir die IDE ab sofort:> Fehlermeldung:

Fehler 175: Der angegebene Speicheranbieter kann nicht in der Konfiguration gefunden werden oder ist ungültig.

Wie ist denn die richtige Vorgehensweise?!
Ich möchte das Programm auch ungern per ClickOnce oder ähnliches veröffentlichen, sondern möchte wirklich wissen, was ich wo mitliefern muss.

19.12.2012 - 09:54 Uhr

Da stimme ich dir vollkommen zu, daher schrieb ich ja auch "Ich habe eigentlich nichts bewusst an dem Programm geändert"

Übrigens, VS habe ich oft neugestartet, das brachte keine Besserung...

18.12.2012 - 10:40 Uhr

Ich wollte noch mal eine kurze Rückmeldung geben.
Ich habe eigentlich nichts bewusst an dem Programm geändert, aber heute ist der Fehler weg?!

Also entweder trifft der Spruch "Reboot tut gut" bei mir zu, oder MS hat in der Zwischenzeit irgendwelche Updates verteilt...

17.12.2012 - 13:45 Uhr

Hi,

ich saß jetzt einige Stunden dabei und habe versucht in WPF ein ganz simples Beispielprojekt zu realisieren:
Ein Fenster mit einem Textfeld, einem Button und einem DataGrid.
Im Prinzip ist es eine Suchmaske, mit der man Daten in einer Datenbank suchen kann. Beim Klick auf den Button wird also eine Datenmenge aus der Datenbank geholt und im DataGrid dargestellt.

Ich hole die Daten aus der Datenbank per Command-Objekt, DataAdapter und DataTable. Das funktioniert auch auf jeden Fall. Ich habe die Datenmenge somit also in der DataTable. Die Daten sind auch korrekt.

Anschließend binde ich die DefaultView des DataTables aus meinem ViewModel an das DataGrid.

Da die Spalten je nach Entwicklungsstand und SQL-Befehl variieren können, habe ich im DataGrid AutoGenerateColumns auf true gestellt.

Unter Windows 7 funktioniert das jetzt alles bestens. Unter Windows 8 werden mir allerdings keine Spalten generiert.
Somit sehe ich nur "leere" Datenzeilen...

Ist der Bug bekannt? Mache ich etwas falsch?

13.12.2012 - 15:21 Uhr

Ich habe von einer weiteren Lösung gehört, in der man die Einstellung einfach vorher in die Registry schreibt. Dort wird die Einstellung nämlich anhand des Netzwerknamens gespeichert...
Ist natürlich immer suboptimal, wenn man in fremde Registryzweige schreiben muss, aber einen Versuch ist es vielleicht wert.

13.12.2012 - 08:53 Uhr

Du kannst ja mal schauen, ob da was für dich bei ist:
Windows-Taste + R (Ausführen) > gpedit.msc > Computerkonfiguration > Windows-Einstellungen > Sicherheitseinstellungen > Netzwerklisten-Manager-Richtlinien

19.11.2012 - 13:41 Uhr

Als Alternative kann man sich auch eine eigene ObservableCollection ableiten, z.B. so:


public class ObservableCollectionExt<T> : ObservableCollection<T>
{
    private Boolean IsUpdating = false;

    public void BeginUpdate()
    {
        this.IsUpdating = true;
    }

    public void EndUpdate()
    {
        this.IsUpdating = false;
        this.OnCollectionChanged(new System.Collections.Specialized.NotifyCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedAction.Reset, null));
    }

    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (!this.IsUpdating)
            base.OnCollectionChanged(e);
    }
}

Anschließend so benutzen:

Collection.BeginUpdate();

for (int i = 0; i < 1000000; i++)
    Collection.Add(i.ToString());

Collection.EndUpdate();
15.11.2012 - 15:07 Uhr

Naja, die Sourcen vom MySQL Client sind ja offen... Du kannst dir das Projekt ja mal zu deiner Projektmappe hinzufügen und es debuggen...
Vielleicht siehst du ja irgendwo den Flaschenhals.

Macht es einen Unterschied, ob du im Debug oder im Release arbeitest?

31.10.2012 - 16:13 Uhr

Du solltest aber trotzdem einen Primärschlüssel in deiner Tabelle haben. Normalerweise wird dieser als ID (Typ: Autowert) angelegt.

31.10.2012 - 15:50 Uhr

Du irrst dich.

Öffne deine Datenbank mal in Access. Klicke auf die entsprechende Tabelle mit der rechten Maustaste und wähle "Entwurfsansicht".
Nun solltest du deine Tabellendefinition sehen (also die Spalten, Feldtypen usw.) Dort wählst du dann dein Feld aus, und definierst dieses als "Indiziert (Ohne Duplikate)".

Aber das sind eigentlich Grundlagen von Datenbanken...

31.10.2012 - 15:15 Uhr

Setze in der Access-"Datenbank" die Spalte Zeichnungsnummer doch auf "indiziert (ohne Duplikate)", dann lässt die Datenbank doppelte Eingaben gar nicht erst zu und du bekommst eine entsprechende Exception.

31.10.2012 - 15:04 Uhr

Ein Problem mit Groß -und Kleinschreibung...?

Versuch mal sowas

var results = from matchingItem in query
  where matchingItem.SystemName.ToUpper().Contains(@text1.ToUpper())
  select matchingItem;
31.10.2012 - 14:53 Uhr

Oder als Downloadversion per Upgrade 29,99 EUR 😃

24.10.2012 - 11:14 Uhr

Danke erstmal, da habe ich jetzt ja genügend Lesestoff 😃

24.10.2012 - 10:18 Uhr

Huuuch... 😉

Gut, dann werde ich danach mal googlen...
Hast du vielleicht ein Beispiel, wie ich sowas umsetze?

24.10.2012 - 10:06 Uhr

Hi,

ist es möglich eine Referenz (in anderen Programmiersprachen als Pointer bezeichnet) auf ein beliebiges Property zu merken / speichern?

Als Beispiel:

public class OtherClass
{
    // irgendeine Klasse...
}

public class TestClass
{
    public String TestString { get; set; }
    public Int32 TestInt { get; set; }
    public OtherClass TestOther { get; set; }

    List<ReferenceClass> references = new List<ReferenceClass>();

    public TestClass()
    {
        ReferenceClass ref1 = new ReferenceClass();
        ref1.Referenz = &TestString;
        references.Add(ref1);

        ReferenceClass ref2 = new ReferenceClass();
        ref2.Referenz = &TestInt;
        references.Add(ref2);

        ReferenceClass ref3 = new ReferenceClass();
        ref2.Referenz = &TestOther;
        references.Add(ref3);
    }

    public void DoSomething()
    {
        foreach (ReferenceClass reference in references)
        {
            reference.DoSomething();
        }
    }
}

public class ReferenceClass
{
    public Object* Referenz { get; set; }

    public void DoSomething()
    {
        // mach irgendwas mit der Referenz
    }
}

Der Code macht natürlich so keinen großen Sinn, aber das ist erstmal egal...

Mein Vorhaben wäre bestimmt auch mit Reflaction oder so möglich, aber die sind in C# ja bekanntlich relativ langsam, daher würde ich gerne einen Pointer auf ein Property speichern...

20.10.2012 - 10:24 Uhr

Gut, genau zu dem Entschluss bin ich jetzt auch gekommen... Schade eigentlich, es hat sich anfangs so gut angehört... 😉

19.10.2012 - 10:51 Uhr

verwendetes Datenbanksystem: Firebird 2.5

Hi,

ich habe zwei Tabellen

  1. Personen:
    ID
    StandardanschriftID (nullable)

  2. Anschriften
    ID
    PersonenID

Eine Person kann also unendlich viele Anschriften haben.
Optional kann der Person auch eine Standardanschrift zugewiesen werden.

Aus Datenbanksicht sollte das eigentlich soweit klar sein.

Jetzt versuche ich über das Entity Framework eine weitere Person mit einer Standardanschrift anzuelgen:

PERSON person = new PERSON();
ANSCHRIFT anschrift = new ANSCHRIFT();
anschrift.NAME1 = "name usw...";
person.ANSCHRIFTEN.Add(anschrift);
person.STANDARDANSCHRIFT = anschrift;

ctx.PERSON.AddObject(person);
ctx.SaveChanges();

Fehlermeldung:> Fehlermeldung:

Es kann keine gültige Anordnung für abhängige Vorgänge ermittelt werden. Abhängigkeiten sind aufgrund von Fremdschlüsseleinschränkungen, Modellanforderungen oder vom Speicher generierten Werten möglich.

bzw.> Fehlermeldung:

Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements or store generated values.

Es besteht also eine zirkulare Referenz zwischen den beiden Tabellen und das EF kann sich nicht entscheiden, welche Tabelle er zuerst abspeichern soll...
Kommentiere ich person.STANDARDANSCHRIFT = anschrift; aus, klappts natürlich.

Muss ich meine Datenbankstruktur hierfür ändern oder gibt es ein sauberes Workaround?

Sicher, man könnte das ganze so ändern:

PERSON person = new PERSON();
ANSCHRIFT anschrift = new ANSCHRIFT();
anschrift.NAME1 = "name usw...";
person.ANSCHRIFTEN.Add(anschrift);

ctx.PERSON.AddObject(person);
ctx.SaveChanges();

person.STANDARDANSCHRIFT = anschrift;
ctx.SaveChanges();

aber dann muss ich 2x SaveChanges() aufrufen... Ist das die richtige Vorgehensweise?

19.10.2012 - 09:36 Uhr

Der Fehler lag diesmal aber tatsächlich bei mir (siehe mein Edit) 😉

19.10.2012 - 08:30 Uhr

Also wenn ich mit der Maus über die blauen Unterstriche fahre, erscheint:> Fehlermeldung:

Die Ressource "KontakteEnum" konnte nicht aufgelöst werden.

Bei den anderen Ressourcen natürlich genauso...

Zur Laufzeit wird alles richtig dargestellt und im Ausgabefenster steht auch nichts bzgl. XAML drin...

Das Phänomen betrifft also nur den Designer...

Edit:
Ich glaub ich weiß jetzt, woran das liegt...

Ich hatte eine eigene Main-Methode in meiner app.xaml.cs, in der ich z.B. ein Theme setze und die Mainform erstelle usw...
app.xaml hatte ich auf Buildvorgang=page gestellt, anstatt ApplicationDefinition.
Das hatte ich so mal in irgendeinem Tutorial gelesen, hat ja auch wunderbar geklappt... Nur danach scheinen Ressourcen nicht mehr im Designer zu funktionieren.

Habe das jetzt wieder auf die Standardeinstellungen gesetzt, nu sind die blauen Unterstriche weg.

18.10.2012 - 14:49 Uhr

Ist es normal, dass mir im XAML-Editor an allen Stellen, bei denen ich Ressourcen verwende, Hinweise angezeigt werden? Bzw. mein Code blau unterstrichen ist?

Ich lege die Ressourcen ganz normal in ResourceDictionaries an und deklariere sie Anwendungsweit in der app.xaml...
Anschließend trage ich sie wie im Screenshot zu sehen in meine Fenster / Usercontrols ein...

Zur Laufzeit gibt es überhaupt keine Probleme, daher gehe ich davon aus, dass die Vorgehensweise richtig ist.

Ist das normal? Es verwirrt mich doch schon sehr...

10.10.2012 - 15:42 Uhr

Da scheine ich ja noch viel lernen zu müssen...
Kennt ihr ein gutes Tutorial / Beispiel, was in etwa meiner Problemstellung entspricht? Von mir aus auch Entity Framework, ich bin da offen...

Also WPF, MVVM, Entity Framework und das über mehrere Fenster...
Gibts da was? Die Sachen, die ich bisher gelesen habe, bringen mich da nicht weiter.

10.10.2012 - 13:51 Uhr

Vielen Dank schon mal für eure Antworten.

Das ist, meiner Meinung nach, eine merkwürdige Anforderung. Sinniger wäre es die DetailView modal zu machen oder den Datensatz der gerade bearbeitet wird, in deiner Übersicht zu sperren, sobald er bearbeitet wird.

Naja, es soll halt möglich sein, dass man mehrere Kunden parallel geöffnet haben kann.
So wie es in Word möglich ist, mehrere Dokumente parallel geöffnet zu haben. Wenn ich da bei einem Dokument auf Speichern klicke, werden ja nicht alle anderen Dokumente automatisch mitgespeichert.

Du schreibst nicht ob es sich um ein Einzel- oder Mehr-Benutzer system handelt, aber ich geh mal davon aus, das mehrere Benutzer gleichzeitig auf die DS zugriff haben, somit musst dir eh überlegen wie du mit gleichzeitigen Edits auf den DS umgehen willst. Wobei wir dann schon wieder beim Anforderungsprofil sind.

Also vorerst möchte ich keine bestimmte Locking-Variante einbauen. Der Datensatz wird immer überschrieben. Wer zuletzt speichert, hat die aktuellen Daten. Es kommt in der Praxis sehr selten vor, dass mehrere Benutzer im selben Kunden zur gleichen Zeit Änderungen vornehmen.

Somit bleibt dir praktisch nichts anderes übrig als den zu bearbeitenden DS aus deinem context zu lösen.
Du könntest allerdings auch mit ViewModeln, bzw ohne Databinding arbeiten(Du scheinst ja Databinding zu nutzen, ansonsten sollte es für dich nicht relevant sein wenn jemand in der DetailView Informationen eines DS ändert und in einer anderen DetailView auf speichern drückt).

Ja, ich binde die Entities über das ViewModel (ich habe im ViewModel also ein Property, das die ausgewählte Entität darstellt) an die View.
Ich dachte immer, das sei so richtig, da in fast allen Beispielen zu EntityFramework oder generell Mappern das so gemacht wird. Es hat auch den Vorteil, dass eine Anwendung schnell und einfach erweiterbar ist, wenn mal eine weitere Eigenschaft zu einer Entity hinzukommt.

Die Eigenschaften der Entity im ViewModel nochmal zu implementieren habe ich noch in keinem Beispiel gesehen.

Also mein Vorschlag:
Wenn du mit Databinding arbeiten willst, dann solltest du die Entitäten vom context lösen und erst mit dem auslösen von speichern wieder an den context hängen.

So versuche ich es mal...

Ich halte ehrlich gesagt von kommerziellen ThirdParty-Mappern nicht so arg viel. EntityFramework oder NHibernate sind in meinen Augen die Maßstäbe.

Noch kann ich den Mapper ohne weiteres ändern, das sollte also nicht das Problem sein.

10.10.2012 - 11:40 Uhr

*push* ich versteh es leider nicht

Wenn das Telerik ORM zu speziell ist: wie würde sowas denn im EntityFramework aussehen?

09.10.2012 - 14:51 Uhr

verwendetes Datenbanksystem: Firebird, aber eigentlich egal, da gemappt wird

Hi,

ich bin gerade dabei, mir eine Kundenverwaltung zu schreiben. (WPF, Telerik OpenAccess ORM) zumindest habe ich sowas vor.

Vorab: das Programm soll folgendermaßen aussehen:

Ein Hauptfenster, in dem man nach Kunden suchen kann.
Es gibt dort also eine Textbox, in die man einen Suchbegriff eingibt. Anschließend erscheint die entsprechende Trefferliste. (GridControl von DevExpress)
Außerdem gibt es in diesem Fenster drei weitere Schaltflächen1.Beim Klick auf „Löschen“ soll der in der Liste markierte Kunde gelöscht werden. 1.Beim Klick auf „Anlegen“ soll ein weiteres Fenster erscheinen, in dem man diverse Informationen eingeben kann (Adresse, Kundennr,… alles Properties der Eintity) 1.Beim Klick auf „Bearbeiten“ soll dasselbe Fenster wie bei „Anlegen“ erscheinen, allerdings mit den vorhandenen Daten des in der Liste markierten Kunden.

In dem „Detail-View“, also dem Fenster, was sich beim Anlegen oder Bearbeiten öffnet, soll es folgende Funktionen geben:1.Beim Klick auf „Speichern“ wird der Kunde gespeichert 1.Beim Klick auf „Abbrechen“ werden die Änderungen verworfen

Wichtig:1.Das Detail-View soll nicht modal angezeigt werden! Es soll also möglich sein, gleich mehrere Kunden parallel geöffnet zu haben und auch zu bearbeiten. 1.Sobald ein Kunde gespeichert wird, sollen die aktualisierten Daten wieder im GridControl stehen (sofern die Liste nicht zwischenzeitlich durch eine andere Suche verändert wurde) 1.Der Speichern-Button soll nur aktiviert sein, wenn auch tatsächlich Änderungen vorhanden sind. Das könnte man über den OpenAccessContext ermitteln: context.HasChanges)

Die ganzen Funktionen sind als Commands implementiert.

Mein Problem besteht jetzt darin, dass ich noch nicht genau verstehe, wie man die Entitäten über mehrere Fenster hinweg verteilt, speichert und ggf. zurücksetzt.
Ich habe schon viel in der Doku zu OpenAccess gelesen und sonst nach diversen Tutorials gesucht, aber nichts passendes gefunden, was sich damit beschäftigt.

Mein bisheriger Ansatz:
Im ViewModel des Hauptfensters habe ich einen OpenAccessContext. Darüber rufe ich meine Trefferliste ab.

Beim Löschen wird der markierte Kunde über den Context gelöscht
context.Delete(SelectedItem);
context.SaveChanges();

Beim Hinzufügen öffne ich die neue Detail-View und übergebe dort den Context aus dem Hauptfenster.
DetailView details = new DetailView(context);

Beim Bearbeiten öffne ich das neue Detail-View und übergebe den Context aus dem Hauptfenster, sowie den zu bearbeitenden Kunden.
DetailView details = new DetailView(context, SelectedItem);

Im ViewModel der Detail-View habe ich jetzt also Zugriff auf den Context, sowie auf den zu bearbeitenden Kunden.

Soweit klappt es.

Ich könnte den Command für „Speichern“ jetzt abhängig vom context de –und aktivieren:
context.HasChanges();

Und beim Ausführen von „Speichern“ einfach context.SaveChanges(); ausführen.
Doch was ist, wenn ich gleichzeitig einen zweiten Kunden bearbeite? Dann werden diese Änderungen auch gleich mitgespeichert…

Oder wenn ich Änderungen eingebe (aber noch nicht speichere), wieder zurück in das Hauptfenster springe und dort einen Kunden lösche? Beim Löschen wird ja auch SaveChanges() ausgeführt. Die Änderungen wären damit also auch wieder gespeichert…

Das ist also nicht der richtige Weg.

Ich vermute, ich brauche für jeden Kunden einen eigenen Context.

Ich könnte also schon von vorherein alle Kunden vom Context lösen. (context.CreateDetachedCopy) und beim Bearbeiten einem eigenen Context zuweisen (AttachCopy)

Das heißt ich arbeite in der Detail-View nur noch mit Kopien der eigentlichen Daten. Das wiederum bedeutet aber, dass die Daten später nicht automatisch im Hauptfenster aktualisiert werden, wenn ich sie speichere (es ist ja eine andere Instanz)

Egal wie ich es versuche, es gibt immer irgendeinen Haken bei der Sache… Am besten wäre es, wenn meine Entitäten eine eigene Methode zum Speichern und Abbrechen hätten, ich also gar nicht auf ein Context angewiesen wäre.
Dann könnte ich das Objekt einfach so an das Detail-View übergeben und ggf. Save() zum Speichern oder Cancel() zum abbrechen aufrufen…

Vielleicht übersehe ich ja noch etwas (ich bin ja noch Anfänger) oder ist der Mapper von Telerik nicht das richtige für mich?
Ist mein Szenario denn so ungewöhnlich, dass ich dazu keine einfachen Beispiele finde? Oder suche ich falsch?
Habt ihr Tipps für mich, wie ich das besser machen kann?

Ich sitze da jetzt schon einige Wochen (!) dran, und komme leider nicht weiter.

Ich hoffe hier kann mir jemand helfen. Würde mich sehr freuen.

18.09.2012 - 18:36 Uhr

erstmal danke für deine Antwort. Dann sehe ich es ja richtig 😉

Die ToolBox nutze ich allerdings schon gern, weil ich sehr viele Controls von Fremdherstellern (DevExpress) nutze. Da hat das den Vorteil, dass die Verweise, namespaces usw. automatisch hinzugefügt wird.
Halt programmieren nach dem RAD-Konzept... 😃

Vielleicht kann man ja ein AddIn schreiben, welches die Name-Attribute rausschmeißt oder so...

18.09.2012 - 16:33 Uhr

Hi,

wenn man in WPF die ToolBox verwendet, fügt VS ja immer gleich die Namen der Controls mit in den XAML-Code ein...
Wie handhabt ihr das?
Haben bei euch alle Elemente eine Bezeichnung? Sind diese sinnvoll benannt, oder lasst ihr die Standardnamen drinstehen? (grid1, grid2,...)
Oder schmeißt ihr die Namen direkt raus?

Für mich sind die Namen zum großteil überflüssig, und schaden nur der Lesbarkeit des Codes.

Gibt es eine Option im VS, um die automatische Namensvergabe auszuschalten?

17.09.2012 - 09:56 Uhr

Ich hatte 12.1.5 installiert... In der 12.1.6 wird der Fehler als known issue (VS 2010, VS 2012 - If .NET Framework 4.5 is installed on a developer machine, all DevExpress Silverlight controls stop working at design time) geführt...

Werde mir nachher dann mal die neue Version (12.1.7) installieren und schauen, ob es dann funktioniert.

14.09.2012 - 13:12 Uhr

Na prima... Da habe ich mir heute mal die Express For Windows Desktop heruntergeladen und installiert und plötzlich funktioniert keines meiner Anwendungen mehr, in denen ich die DevExpress Controls (WPF) einsetze...

Selbst unter Visual Studio 2010 Pro (an der ich überhaupt nichts verändert habe) bekomme ich laufend die Meldungen> Fehlermeldung:

"Eine Instanz von "CheckEdit" kann nicht erstellt werden."
"Eine Instanz von "TextEdit" kann nicht erstellt werden."
...

Dieser Vorgang kann die Laufzeit destabilisieren.
bei DevExpress.Xpf.Editors.Settings.EditSettingsChangedEventHandler1..ctor(TOwner owner, Action3 onEventAction)
bei DevExpress.Xpf.Editors.BaseEdit..ctor()
bei DevExpress.Xpf.Editors.TextEdit..ctor()

Hat jemand auf die Schnelle eine idee, woran das liegen könnte und wie ich das behebe? Ich vermute die Installation von 2012 hat mir die DevExpress teile zerschossen... Es ist nämlich exakt seit der Installation so...

14.09.2012 - 10:51 Uhr

Es gibt jetzt ein
>
fürs VS-2012.

Damit sieht mein Studio aktuell fast wieder so aus wie das 2010er....

Liegt es an mir, oder lässt sich das Teil mit der Express Version nicht installieren?

Edit: Ah ok, Express Versionen unterstützen keine Extensions 😦

Edit2: Es gibt doch eine Lösung, wie man ein 2010er ähnliches Theme bekommt.
Die Themes werden in der Registry gespeichert.
Von Modify Visual Studio 2012 Dark/Light Shell Themes habe ich mir so ein 2010er Theme heruntergeladen. Der Pfad in der Reg-Datei ist aber für das normale VS. Für die Express-Versionen muss man den Pfad entsprechend anpassen:
HKEY_CURRENT_USER\Software\Microsoft\WDExpress\11.0_Config\Themes\

Ich habe mal so eine angepasste Datei für Express for Windows Desktop angehängt. Vorher aber besser die alten Registry-Werte exportieren (sichern)

Jetzt sieht meine Express-Version auch fast wie die 2010er aus 😉

17.08.2012 - 09:22 Uhr

Jetzt muss VS 2012 nur noch über Dreamspark verfügbar sein, dann bin ich glücklich 😃

Dann musst du dich noch 7 Tage gedulden 😉

14.08.2012 - 15:56 Uhr

*push*

Hier mal ein YouTube Video von einer Software, die das so gelöst hat... Ab der 35. Sekunde wird es interessant 😉