Laden...

Forenbeiträge von tequila slammer Ingesamt 253 Beiträge

27.08.2010 - 23:47 Uhr

Also ich habe es nun mal mit einem normalen Dictionary versucht und dort das IEqualityComparer Interface implementiert, da ein Comparer nicht verwendet werden kann. Ich bekomme nun zwar keine Fehler mehr aber auch nicht das gewünschte Ergebnis.

Die ursprüngliche SortedList wird schon beim Erstellen durch den Comparer verändert, die wiederum hat das gewünschte Ergebnis. Und nun, irgendwie stehe ich an der Wand?

27.08.2010 - 07:44 Uhr

Guten Morgen herbivore,

ich sehe, gerade das mein Beispiel schlecht gewählt wurde. Besser ist, wenn man Kunde durch Kontotyp ersetzt, da ich eigentlich eine Gruppierung dieser Erstellen wollte.

Trotzdem hat deine Antwort bestand. Ich kann mir nur vorstellen, dass die Liste beim Erzeugen durch meinen Comparer verändert wird.


public static System.Collections.Generic.SortedList<KontoTyp, Konten> GetAccountsByAccountType(Kunde currentClient)
{
    System.Collections.Generic.SortedList<KontoTyp, Konten> accountList = new SortedList<KontoTyp, Konten>(new AccountTypeByRankingNumberComparer());

    foreach (Kontotyp accountType in currentClient.Konten)
    {
        if(!accountList.ContainsKey(accountType))
        {
            accountList.Add(accountType, getAccountTypeAccounts(currentClient.Konten, accountType.Id));
        }
    }

    return accountList;
}

Einfach weglassen kann ich ihn aber auch nicht, da ich sonst nicht prüfen könnte, ob der Kontotyp schon in der Liste ist ->InvalidOperationExeption "Fehler beim Vergleichen von zwei Elementen im Array".

26.08.2010 - 14:27 Uhr

Hallo Forum,

ich benötige mal wieder eure Hilfe. Ich erstelle eine SortedList<Kunde, Konten>.
Konten ist ein generische Collection mit Konto-Objekten.


foreach (KontoTyp accountType in sortedClientList.Keys)
{
    HtmlGenericControl clientDiv = new HtmlGenericControl("div") { ID = client.Id.ToString() };

    clientDiv.Controls.Add(new Label { Text = accountType.Name });

    //Erstellen des Konten-Div Containers
    HtmlGenericControl clientsContainerDiv = new HtmlGenericControl("div");

    //Hinzufügen der Accounts
    foreach (Konto Account in sortedClientList[accountType]) //hier meint er, das Kontotyp-Objekt ist nich in der Liste. Die Überwachung im Debugger sagt da aber was anders.
    {
        LinkButton lbtAccount = new LinkButton { Text =Account.Name, ID = Account.Id.ToString(), CssClass = "AddAccount" };
        lbtAccount.Attributes.Add("rel", client.Id.ToString());
        lbtAccount.Click += new EventHandler(lbt_AddClick);

        clientsContainerDiv.Controls.Add(lbtAccount);
    }

    clientDiv.Controls.Add(clientsContainerDiv);

    this.PlaceHolderClients.Controls.Add(clientDiv);
}

Als Fehler erscheint immer: Der angegebene Schlüssel war nicht im Wörterbuch angegeben. Aber dann hätte ich ihn in der ersten Foreach-Schleife auch nicht abfragen können. Was läuft hier falsch?

Edit: Kunde durch KontoTyp ersetzt.

27.07.2010 - 22:49 Uhr

Da bisher noch keine Antworten eingegangen sind, versuche ich einmal mein Vorhaben genauer zu beschreiben.

Ich habe ein Webservice, der bestimmte Methoden bereitstellt. Um Nutzern des Webservice die Anbindung zu vereinfachen, wollte ich nun die erstellten Proxy-Klassen in einer Klassenbibliothek als internal deklarieren und die Objekte "wrappen". (Sagt man das eigentlich so?)

Allerdings erhalte ich dann beim Versuch mit dem WebService zu kommunizieren die Fehlermeldung: " 'WebServiceMethodenname' ist kein gültiger Webdienst-Methodenname." Google half mir bisher nicht weiter.

22.07.2010 - 20:23 Uhr

Ich schreibe gerade eine kleine API für einen asp.net 2.0 Webservice. Damit die ProxyMethoden nicht auch auftauchen suche ich nun einen Weg diese beim generieren des Proxies auf internal umstellen zu lassen. Gibt es da einen weg? Wsdl /? ist da nicht gerade sehr gesprächig in diesem Punkt.

P.s.: Im VisualStudio kann ich es einstellen habe dann aber keine Kontrolle mehr über den Proxy. Ich würde aber auch gerne die Umwandlung von Array-Rückgaben in generische Listen nutzen wollen.

23.06.2010 - 22:26 Uhr

Vielleicht kannst du etwas Code hier zeigen, der nicht funktioniert? Eventuell bringt dich auch eine Logdatei weiter.

06.06.2010 - 11:23 Uhr

Die Lösung des Problems bestand darin, das "bin" Verzeichnis mal zu leeren und dann erst die neuen dlls zu kopieren und nicht wie sonst einfach zu überschreiben.

27.05.2010 - 12:18 Uhr

Ich habe mal ein wenig mit den Collection Interfaces experimentiert. Implenentiere ich die ChildrenCollection als Ableitung von IList funktioniert die Übertragung. Ich finde allerdings, dass ich mit dieser Implementierung erheblich an Vorteilen gegenüber IList<T> verliere.

27.05.2010 - 08:50 Uhr

Anbei mal mein JavaScript Code


$(document).ready(function() {

            $("#submit").click(function(e) {
                e.preventDefault();

                var Person = new Object();
                Person.FirstName = "Firstname";
                Person.LastName = "Lastname";
                Person.DayOfBirth = new Date(1982, 06, 08);
                Person.Children = null;

                var Person1 = new Object();
                Person1.FirstName = "ChildFirstname";
                Person1.LastName = "ChildLastname";
                Person1.DayOfBirth = new Date(2009, 12, 20);

                Person.Children = new Array(Person1);

                createPerson(Person);
            });

            function createPerson(personItem) {

                var parameter = "{newPerson: " + JSON.stringify(personItem) + "}"; ;

                $.ajax({
                    type: "POST",
                    url: "http://localhost:62588/Service1.asmx/CreatePerson",
                    data: parameter,
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(msg) {
                        alert("erfolgreich");
                    },
                    error: function(msg) {
                        alert("nicht erfolgreich");
                    }
                });
            }
});

26.05.2010 - 11:39 Uhr

Hallo Forum,

ich spiele gerade mit AJAX rum und versuche eine Objekt an einen WebService zu übergeben.

Die Klasse Parent:


public class Parent
{
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime DayOfBirth { get; set; }
        public ChildrenCollection Children { get; set; }
}

Die Klasse Child:


public class Child
{
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime DayOfBirth { get; set; }
}

Die ChildrenCollection leite ich von System.Collections.Generic.ICollection<Child> ab und ist als Serializable markiert.

Als Antwort erhalte ich vom Service folgende Fehlermeldung:
"Der Typ &quot;TestWebService.ChildrenCollection&quot; wird für die Deserialisierung eines Arrays nicht unterstützt.

Wie könnte ich denn sonst mein Objekt per Ajax übermitteln ohne gleich meine Grundstruktur zu verändern?

26.05.2010 - 11:09 Uhr

Schau dir mal die Windows Sharepoint Services 3.0 oder die aktuellere Sharepoint Foundation 2010 an. Beide kostenlos und für beide kannst du mit .net noch Sachen programmieren.

20.05.2010 - 22:47 Uhr

Über die Attribute habe ich es schon versucht.

Das die richtige Version läuft kann ich nicht hundertprozentig sagen. Sie sollte, da ich die benötigten Dateien auch schon gelöscht und Stunden später mit der neuen Version ersetzt habe. Gehe ich nach Quellcode ist es die alte Version. Ich werde mal den Provider mal auf das Thema Caching ansprechen.

16.05.2010 - 21:22 Uhr

Ich habe die Lösung nun doch gefunden und möchte sie euch nicht vorenthalten.


folder = (Microsoft.Office.Interop.Outlook.MAPIFolder)ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox).Parent;

Man gelangt also doch mit Parent an den übergeordneten Ordner. Ab da funktioniert dann alles wie gehabt.

16.05.2010 - 15:19 Uhr

Ich habe ein merkwürdiges Problem mit dem asp.net LinkButton Control.


LinkButton link = new LinkButton();
link.ID = product.Id.ToString() + "|" + priceItem.Size.Id.ToString();
link.Text = priceItem.Size.Name + " " + priceItem.SizePrice.ToString("0.00") + " €";
link.Click += new EventHandler(link_Click);
link.CssClass = "addItem";

Führe ich das Projekt lokal aus, ist addItem auch in dem Link enthalten. Kopiere ich das Projekt nun auf den WebSpace und rufe die Seite erneut auf, dann ist sie nicht mehr enthalten. Ich habe nun mehrfach den Quellcode auf dem Server geprüft, er ist identisch.

Hat wer von euch eine Idee?

16.05.2010 - 12:55 Uhr

Hallo Forum,

ich versuche in Outlook 2007 unter Postfach ein Ordner zu erstellen. Bisher gelingt mir dies nur in den Unterordner von Postfach (Posteingang usw.). Hat einer eine Idee wie ich mein Ziel erreichen kann?


Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.NameSpace ns = app.GetNamespace("MAPI");
ns.Logon(null, null, true, true);

Microsoft.Office.Interop.Outlook.MAPIFolder folder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);

So komme ich an die Ordner. Ich dachte mir ich könnte dann mit folder.Parent an den übergeordneten Ordner gelangen, was nicht zu funktionieren schein.

10.05.2010 - 14:34 Uhr

Um herbivores Vorschlag aufzugreifen empfehle ich dir sich mal bei Aladdin und Co umzusehen. Wir verwenden unteranderem Aladdin und ich würde sagen, dass es sich in deinem Fall anbietet, besonders weil du nur ein fertiges Kompilat hast. Alle Lizenztechnischen Sachen (Demo, Vollversion, Lizenznehmer usw.) werden über die Aladdin Software geregelt. Ein weiteres Plus ist, das du wählen kannst ob du Hardware- (USB-Stick) oder Software-Dongle an deine Kunden versenden möchtest. Es gibt aber auch Nachteile. Solltest du dich für die Hardware-Dongles entscheiden kannst du diese nur bei Aladdin beziehen. Damit die Software später auch läuft, muss vorher eine Basissoftware von Aladdin installiert werden.

27.04.2010 - 09:03 Uhr

Hallo sakanoue,

auf asp.net findest du sehr viele Tutorials zum Thema MVC 2. Unteranderem auch ein sehr gutes Video von Scott G.

26.04.2010 - 11:53 Uhr

Hallo barzefutz,

mein "geht" Beispiel finde ich auch besser allerdings muss noch eine CodeBehind Methode beim Klicken des Links ausgeführt werden. Mein Ansatz nach einem WE voller Bingen sieht nun so aus, dass ich über jQuery Ajax die CodeBehind Methode aufrufe. Grundlage ist dieser Artikel von Encosia.com. Allerdings sieht es so aus, als ob er den ajax Part nicht umsetzt, da ich keine Uhrzeit angezeigt bekomme, was scheinbar an der Verwendung von Masterpages liegt. Denn ohne funktioniert es nun.

22.04.2010 - 21:33 Uhr

Hallo Forum,

ich versuche gerade bei einer Website ein paar Postbacks einzusparen, in dem ich einige Sachen versuche mit jQuery zu lösen. Mein Problem ist, dass ich immer diese Fehlermeldung: "Laufzeitfehler in Microsoft JScript: Objekt erwartet" sowie ich bei einem dynamisch erzeugten LinkButton das OnClientClick Event aufrufen möchte.


LinkButton lbtIngredient = new LinkButton();
lbtIngredient.Text = tempIngredient.Name;
lbtIngredient.ID = tempIngredient.Id.ToString();
lbtIngredient.Click += new EventHandler(lbt_AddClick);
lbtIngredient.OnClientClick = "return toggleSingleSelect();";


<script type="text/javascript">
        $(document).ready(function() {
            
            //div verstecken/ anzeigen
            function toggleSingleSelect() {
                $('#singleSelect').toggle("slow");
                return false;
            }

//     geht
//            $('#singleSelect').click(function() {
//                $('#singleSelect').toggle("slow");
//                return false;
//            })
        });
              
    </script>

Ich bin neu was asp.net in Verbindung mit JavaScript angeht und habe keine Ahnung wie ich an das Problem herangehen sollte.

21.04.2010 - 09:03 Uhr

Halle herbivore,

im IE 8 laufen auch alle Tabs in eigenen Prozessen.
Ansonsten würde ich es wie herbivore schon geschrieben hat mit eigenen Prozessen pro Tab versuchen.

14.02.2010 - 20:20 Uhr

Gut das es diese Forum gibt. Ich danke euch für die Hilfestellung - damit sollte ich weiterkommen. Danke noch mal an alle.

14.02.2010 - 11:30 Uhr

Hallo chavez,

genau das mache ich doch. Siehe obrigen Code. Deine Erklärung klingt logisch - würde aber doch bedeuten, das InvariantCulture mit vorsicht zu benutzen ist, dass die Werte durchaus verfälscht werden können.

14.02.2010 - 10:46 Uhr

Hallo Tom,

ich stimme dir zu, dass decimal hier sicherlich die besser Variante ist. Ich kenne auch die GetDouble Methode des readers allerdings müsste ich dann immer die Feldposition wissen. Was mich stutzig macht ist einfach die Tatsache, das aus 2.0 mit InvariantCulture 200 wird. Laut MSDN ist InvariantCulture mit Englisch zu vergleichen und daher sollte das ganze nach meinem Verständnis nicht passieren.

Vielleicht habe ich aber auch den Verwendungszweck von InvariantCulture nicht verstanden?

Gruß Sebastian

13.02.2010 - 22:12 Uhr

Hallo Forum,

ich zweifle gerade ob fxcop mir das leben leichter oder schwerer machen soll.
Folgendes Beispiel an einem Produktpreis von 2,00Euro erklärt:


double price = double.parse(sqlReader["price"].toString(), CultureInfo.InvariantCulture);

Mit diesem Code erhalte ich den Preis aus der Datenbank. Dank InvariantCulture erwarte ich eigentlich 2.0 oder 2 aber nicht 200. Ich könnte zwar nun InvariantCulture wieder entfernen aber dann meckert fxcop wieder. ?( 🙁

Wie löst ihr solche Formatierungen?

07.02.2010 - 18:31 Uhr

Hallo herbivore,

wieder einmal hast du mir sehr geholfen. Ein wirklich sehr interessanter Beitrag, denn ich mit meinen Suchbegriffen nicht gefunden hatte. Besonders hat mir dein Linkt auf den Artikel mit den Attributen zur Prüfung von Properties geholfen.

06.02.2010 - 19:39 Uhr

Hallo Forum,

ich arbeite gerade ein der Verbesserung einer Klassenbibliothek und mache mir nun Gedanken über eine sinnvolle Fehlerbehandlung, da einige Properties eine gewisse Länge nicht überschreiten dürfen.

Ich verfolge zwei Ansätze, kann mich aber nicht entscheiden.

Möglichkeit eins:

Ich prüfe die Richtigkeit der Eingabe direkt im Setter der Property. Meiner Meinung nach nötigt das den Anwender der Bibliothek aber dazu quasi alles in Try/Catch zusetzen und das stört irgendwie den "flow" und die Handhabung.


public ShortDescription
{
     get { return _shortDescription; }
     set
     {
           if (value < 255)
           {
                _shortDescription = value;
           }
           else
           {
                throw new StringToWidthException("ShortDescription ist zu lang....");
           }
}

Daher dachte ich an Möglichkeit zwei - ich biete in den Klassen Validate-Methoden an, die auf Wunsch prüfen. Ich bin mir bewußt das ich damit von der maßgebenden Spezifikation für die Bibliothek abschweiche. Allerdings wird die Richtigkeit des erzeugten Produkts bei der Verarbeitung erneut geprüft.

Was würdet Ihr an meiner Stelle machen?

01.02.2010 - 23:22 Uhr

Vielleicht hilft dir das hier weiter.
Almost everything in AD

01.02.2010 - 23:13 Uhr

Hallo Jörg,

meiner Erfahrung nach gibt es keine besonders große Unterschiede bei einem 2003 Server zu XP. Je nach dem um was für eine Applikation es sich handelt könnten die benötigten Rechte zum Ausführen der Software eine Rolle spielen. Ich ziele damit Richtung TerminalServer Dienste/ Anwendungsveröffentlichung.

28.01.2010 - 20:20 Uhr

Leider ist es kein Fall für warum blockiert meine GUI. Aber der Ansatz von ErfinderdesRades ist ein Versuch wert.

27.01.2010 - 11:12 Uhr

Hallo herbivore,

danke für den Link. Ich bekomme es dennoch nicht hin, dass der zweite Splitter mitwandert. Dabei ist es egal ob ich ihn sofort -also im Moving Event oder nachträglich im Moved Event anpassen möchte. Auch der Versuch es wie Code ersichtlich über Location zu lösen bringt nichts. Mir scheint es als ob ich irgen ein "Paint" Event ausführen müsste um die Aktualisierung auch auf der Form sichtbar zu machen.

Bsp:

Ausgangsposition:

 __|   |

Bewegung nach rechts:

      __|   |
21.01.2010 - 12:05 Uhr

Hat jemand gute Quellen um die Siemens OptiClient Komponenten in eigene Anwendungen zu integrieren? Mich interessiert besonders, wie ich die Informationen über den Anrufer in meine eigene Anwendung nutzen kann. Google ist da ziemlich sparsam mit hilfreichen Links.

20.01.2010 - 13:21 Uhr

Hallo Gabe,

vielen Dank für deine Antwort. Diesen kleinen Schalter aktiviert und schon geht es.

Mfg Sebastian

20.01.2010 - 12:02 Uhr

Hallo Leute,

ich über arbeite gerade ein paar Komponenten von mir um diese meinen Kollegen zur Verfügung zu stellen. Dabei möchte ich auch gerne die InteliSense Funktionalitäten von VS nutzen. Ansich sollte das ja kein Problem sein, denn man kann ja

///<summery>Beschreibungstext</summery>

nutzen.

Kompiliere ich das Projekt, in dem Fall eine Klassenbibliothek, und füge es als Referenz in ein anderes Projekt ein, erscheint jedoch keine Beschreibung im InteliSense. Laut msdn sollte aber genau das passieren.

Wie löst ihr solche Aufgaben, um Partner, Kollegen oder Kunden zu unterstützen?

12.01.2010 - 21:25 Uhr

die erster Variante sollte es für einen fullqualified Domainname sein.

11.01.2010 - 20:15 Uhr

Hallo Theki,

wenn es kein eigenes Programm sein muss, kannst du doch mit dem Active Directory-Benutzer und -Computer MMC-Snap-In arbeiten. Ansonsten hat Google eine Menge ausgespuckt. Unteranderem das hier:

http://www.codeproject.com/KB/system/everythingInAD.aspx

Mfg

09.01.2010 - 19:52 Uhr

Hallo Leute,

ich bin gerade dabei ein Control zu bauen, das aus zwei Fenstern (TreeView oder ListView) und einem Panel in der Mitte besteht. Das Panel soll eine feste Breite haben und ist links und rechts mit je einem Splitter von den Fenstern getrennt.

Um die feste Breite realisieren zu können hatte ich mir überlegt jewals das Moved Event der Splitter zu nutzen und darin dann die aktuelle Position + Panelbreite an den zweiten Splitter zu übergeben. Also Position spl1 (x=200) + Panelbreite (w=48) = spl2 (x=248).

Im Code mein letzter Stand, der auch ohne Erfolg ist, da sich das Panel in der Mitte verbreitert. Hat jemand noch eine Idee für mich, wie ich das realisieren kann?


        private void splitter1_SplitterMoved(object sender, SplitterEventArgs e)
        {
            splitter2.Location = new Point(e.X + 48, e.Y);           
        }

        private void splitter2_SplitterMoved(object sender, SplitterEventArgs e)
        {
            //splitter1.Location = new Point(e.X - 48, e.Y);
        }

26.12.2009 - 22:24 Uhr

Hallo Dr. Hardware,

ich nutze die gleiche Komponente - sie ist auch gleich mit der von dir geposteten.
Ich habe lediglich die also obsolet gekennzeichneten Typen ersetzt und kann sowohl uploads als auch downloads durchführen.

22.10.2009 - 21:55 Uhr

Hallo meffke,

ich denke mit WPF bist du schon gut bedient. Solche Gui-Designs werden in der Regel aber nicht von uns Entwickler gemacht. Hier kommen grafisch creativere Leute zum Einsatz. Diese nutzen dann in der Regel auch nicht VS, sondern die Expression Produkte und wahrscheinlich PhotoShop.

Solltest du also nicht auch noch über "magische" Fähigkeiten mit diesen Produkten verfügen, solltest du darüber nachdenken diese Arbeit in erfahrene Hände zu geben.

Mfg

15.09.2009 - 13:52 Uhr

So langsam komme ich auch zu dem Entschluß, dass es wohl einfacher zu händeln ist, wenn das Caching in der Applikation gehändelt wird. Danke für deine Anteilnahme.

12.09.2009 - 21:59 Uhr

Hallo Leute,

ich baue seit einiger Zeit an einem WebService. Da es für einige Objekte eine enorme Anzahl gibt stellt sich die Frage nach Caching-Mechanismen um Wartezeiten und Traffic zu minimieren. Mir spielt zu, das alles noch in eine Art "Client API" gepackt werden soll - Änderungen an Klassen sind also noch möglich. Nun bin ich am hin und her überlegen, da das Ganze doch ziemlich kompex ist, wie ich beides Koppeln könnte und bin der Meinung, das DataBinding und deren Events doch ideal wären um zum Beispiel nur die geänderten Objekte zu Übertragen.

Um das Problem besser zu Skizzieren nehme ich einfach mal ein Onlineshop. Dieser hat 1000 Artikel. Beim Starten der Clientanwendung werden alle Warengruppen abgefragt. Klickt man auf eine werden deren Artikel abgerufen um nicht alle 1000 mit einmal übertragen zu müssen.

Meine Überlegung war es nun in der "Client API" ein Collection zu Erstellen die von BindingList<T> erbt. In dieser werde alle Artikel der Warengruppe abgelegt und eine Refenz darauf wird zurückgegeben, damit ich die Änderungen in der API auch merke. Die Events, OnAddingNew zum Beispiel kann ich dann ja in der API behandeln. Oder würde es schon reichen nur eine einfache Collection vom Type IList<T> zurückzugeben. Wie aber merke ich dann Änderungen an dieser?

Oder habe ich das Thema DataBinding missverstanden und DataBindung und Caching finden nur in der Oberfläche statt?

Ziel ist es, dass die zu entwickelnde API die reine Kommunikation mit dem WebService übernimmt und die Anwendung nur mit der API interagiert. Die API aber zeitgleich den Traffic minimiert in dem Daten zwischengehalten werden und nicht jedes Mal alles erneut abgerufen wird. Leider ist Caching am WebService selbst nicht unbedingt möglich, da der Flaschenhalz eindeutig der Transportweg ist.

Danke schon Mal an alle die zu verstehen versuchen, was ich meine. 🙁

07.09.2009 - 10:20 Uhr

Ich habe die Lösung gefunden. Es war ein statisches Objekt in der Klassenbibliothek. Static eignet sich halt nicht bei WebService.

03.09.2009 - 15:16 Uhr

Da mein Problem immer noch besteht und ich einfach nicht weiterkomme habe ich mal ein Beispiel-WebService mit Access-Datenbank geschrieben, das die allgemeine Vorgehensweise wiederspiegelt.

Hoffentlich erkennt jemand von euch was ich falsch mache.

Mfg

13.08.2009 - 21:00 Uhr

Hallo dN!3L,

Exceptions sind eine Überlegung wert. Die Zustandslosigkeit im Web ist mir bekannt. Erklärt mir aber nicht warum ich bei einer erneuten Benutzung des Service Objekts diese "Fehler" erhalte.

Das das Objekt by value geändert wird ist schon in Ordnung, da ich nur prüfe ob eine ID angegeben wurde. Wenn nicht erzeuge ich diese um das Objekt später wieder finden zu können. Da mein Client aber nun standardmäßig IDs generiert hat sich dieser Eingriff eigentlich schon wieder erledigt.

mfg Tequila Slammer

11.08.2009 - 22:23 Uhr

Hi trib,

der Webservice ist auch von mir. Der boolsche Rückgabewert ist schon dafür gedacht um den Konsumenten ein Feedback über Erfolg oder Mißerfolg der durchgeführten Aktion zu geben.

Der Wechsel von Update auf Create ist Teil meiner Logik. Nach dem der Updatevorgang an dem Bauteilobjekt abgeschlossen ist kann man die Form auch zur Neuanlage weiter nutzen. Dann ist es aber kein Update eines bestehenden Bauteils sondern ein Neues. Die Form wird also sowohl zur Neuanlage benutzt als auch zum Bearbeiten eines bestehenden Bauteils.

Anbei mal etwas Code.

Die WebService-Methode zum Abfragen, Speichern und Löschen von Steuersätzen.


        [WebMethod]
        public Builder.TaxCollection GetTaxes()
        {
            config();

            Builder.TaxCollection col = new Builder.Tax().GetTaxes();

            return col;
        }

        [WebMethod]
        public bool CreateTax(Builder.Tax tax)
        {
            config();
            return tax.Save();
        }

        [WebMethod]
        public bool UpdateTax(Builder.Tax tax)
        {
            config();
            return tax.Update();
        }

        [WebMethod]
        public bool DeleteTax(Builder.Tax tax)
        {
            config();
            return tax.Delete();
        }

Die Tax.Delete (ist die kürzeste) Methode sieht dann so aus


        public bool Delete()
        {
            bool success = false;

            System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(Builder.Configuration.ConnectionString);
            System.Data.SqlClient.SqlCommand query = new System.Data.SqlClient.SqlCommand("DELETE FROM tax WHERE taxID = @taxGuid", connection);
            query.Parameters.AddWithValue("@taxGuid", this.taxID);

            try
            {
                connection.Open();
                query.ExecuteNonQuery();

                this.inDatabase = false;
                success = true;
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                if (Builder.Configuration.UseDebug == true)
                {
                    //toDo: besseres ErrorLogging
                    string error = ex.Message;
                }
            }
            finally
            {
                if (connection.State == System.Data.ConnectionState.Open)
                {
                    connection.Close();
                    query.Dispose();
                    connection.Dispose();
                }
            }
            return success;
        }
11.08.2009 - 11:19 Uhr

Hallo trib,

Das ist nicht das Problem. Ich versuche das Problem mal anders zu beschreiben.

Ich starte den Client (MDI Container). Dieser meldet sich am Webservice an und ruft alle Bauelemente ab und stellt diese in einem TreeView dar. Ich rufe mir nun aus dem TreeView ein Bauelement in einer neuen Form auf. (Es wird einfach das Bauelement-Objekt aus der Node.Tag Property übergeben.)

Hier kann ich nun alle Eigenschaften des Bauelements bearbeiten. Beim Speichern wird dieses Objekt an den WebService zurückübergeben und die Felder der Form zurückgesetzt. Da das Fenster noch offen ist kann ich nun ein neues Element anlegen. Beim erneuten Speichern wird statt Update nun Create auf dem WebService aufgerufen und das neue Element-Objekt übergeben. Der Webservice gibt nun false zurück obwohl er das Objekt erfolgreich gespeichert hat.

Würde ich nun beim WebService erneut alle Bauelemente abrufen bekomme ich das Neue nicht mit zurückgegeben. Beende ich nun aber die ClientApplication und starte sie neu erhalte ich auch das neue Element.

10.08.2009 - 14:00 Uhr

Hallo,

ich arbeite immer noch an meinem WebService. Dabei ist mir ein merkwürdiges Verhalten aufgefallen.

Zum Beispiel, dass Veränderungen erst nach Neustart der konsumierenden Clientapplikation angezeigt werden.

Das drückt sich so aus, dass wenn ich ein neues Bauteil erstellt und dem Webservice übergeben habe, speichert er die Daten auch sofort in der Datenbank ab. Und gibt bei Erfolg auch true zurück. Rufe ich nun eine Auflistung aller Bauteile ab ist es nicht vorhanden. Erst, wie gesagt, nach einem Neustart der Clientapplikation.

Ähnlich verhält es sich, wenn ich ein Bauteil bearbeite und speichere. Alles klappt. Da die Form noch offen ist könnte man auch gleich ein weiters neues Bauteil anlegen. Beim Versuch es zu speichern gibt der WebService allerdings false zurück obwohl er es erfolgreich in der Datenbank gespeichert hat.

Hat jemand eine Idee woran das liegen könnte?

Ich erstelle einmal ein ServiceSoapClient-Objekt und nutze das für die gesamte Kommunikation. Sollte man vielleicht jedesmal ein neues Objekt erstellen? Und würde ich dann auch die maxReceivedMessageSize-Problematik in den Griff bekommen?

07.08.2009 - 20:02 Uhr

Hast du das Projekt denn sprachspezifisch erstellt? Wenn nicht sollte das auch nicht das Problem sein.