Autor Beitrag
chx_de
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 21.11.11 13:25 
Hallo,

ich habe mir in VisualStudio ein Project angelegt. Dann habe ich einen Dienstverweis erstellt und den Link zu meiner WSDL angegeben. Es wurde dann reichlich Code erzeugt und die Schnittstelle funktioniert soweit auch ganz gut. Nur bei bestimmten Calls habe ich Probleme. Ich muss dazu eine Klasse aufrufen. z.B. PlentySoapRequest_GetItemsStock.

In dieser Klasse wiederrum gibt es eine Eigenschaft, die selber eine Klasse auffruft. Und das ganz auch noch als Array.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
/*PlentySoapRequest ist der Call, dem die z.B. der Suchparameter SKU übergeben werden soll.
Innerhalb dieser Klasse wird aber widerrum PlentySoapObject aufgerufen. Code weiter unten*/

PlentySoapRequest_GetItemsStock[] MyStockRequest = new PlentySoapRequest_GetItemsStock[1];
PlentySoapObject_GetItemsStock[] MyStockObject = new PlentySoapObject_GetItemsStock[1];

MyStockObject[0] = new PlentySoapObject_GetItemsStock();
MyStockObject[0].SKU = "abcd11"/*diese Zuweisung klappt*/

MyStockRequest[0].GetItemsStock[0] = new PlentySoapObject_GetItemsStock(); /*Hier ist der Fehler im Debugger. NullReferenceException */
MyStockRequest[0].GetItemsStock[0] = MyStockObject[0];

Console.WriteLine("SKU>>> {0}", MyStockObject[0].SKU);
Console.ReadLine();


Frage: Wie kann ich eine Klasse innerhalb einer Klasse richtig instanzieren?

*****************Anhang der Datendefinitionen PlentySoapRequest
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
   public partial class PlentySoapRequest_GetItemsStock : object, System.ComponentModel.INotifyPropertyChanged {
        
        private PlentySoapObject_GetItemsStock[] getItemsStockField;
        
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public PlentySoapObject_GetItemsStock[] GetItemsStock { /*hier wird die nächste klasse aufgerufen!*/
            get {
                return this.getItemsStockField;
            }
            set {
                this.getItemsStockField = value;
                this.RaisePropertyChanged("GetItemsStock");
            }
        }



***************Anhang der Datendefinitionen PlentySoapObject
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
 public partial class PlentySoapRequest_GetItemsStock : object, System.ComponentModel.INotifyPropertyChanged {
        
        private PlentySoapObject_GetItemsStock[] getItemsStockField;
        
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public PlentySoapObject_GetItemsStock[] GetItemsStock {
            get {
                return this.getItemsStockField;
            }
            set {
                this.getItemsStockField = value;
                this.RaisePropertyChanged("GetItemsStock");
            }
        }


Mit freundlichen Grüßen
Christan Blaß

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 21.11.11 14:01 
Wenn es auf dem Server keine ItemStocks gibt bekommst du null. Das solltest du definitiv testen bevor du irgendwas mit den Eementen machst. Übrigens auch wenn dein Code ein leeres Array erzeugen würde würde der Zugriff auf das erste Element trotzdem knallen. Wenn du auf dem Client neue Items hinzufügst müsstest du eh erst ein Array der dann passenden Größe anlegen und die bereits vorhanden Elemente da rein kopieren. Geschickter wäre es wahrscheinlich den Proxy Code nochmal neu zu generieren. Im Wsdl Wizard gibt es eine Option die dir erlaubt Listen nicht als Arrays sondern als generische Liste darzustellen. Damit wird das Handling einfacher.
chx_de Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 21.11.11 15:14 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es auf dem Server keine ItemStocks gibt bekommst du null. Das solltest du definitiv testen bevor du irgendwas mit den Eementen machst. Übrigens auch wenn dein Code ein leeres Array erzeugen würde würde der Zugriff auf das erste Element trotzdem knallen. Wenn du auf dem Client neue Items hinzufügst müsstest du eh erst ein Array der dann passenden Größe anlegen und die bereits vorhanden Elemente da rein kopieren. Geschickter wäre es wahrscheinlich den Proxy Code nochmal neu zu generieren. Im Wsdl Wizard gibt es eine Option die dir erlaubt Listen nicht als Arrays sondern als generische Liste darzustellen. Damit wird das Handling einfacher.


Hi,

also auf dem Server sind ItemStocks vorhanden. Das ist nicht das Problem. Ich habe jetzt mal im WSDL Wizard den Auflistungstyp auf System.Collections.Generic.List gestellt und dann alles neu erstellt. Es hat sich aber nichts geändert.

Der Code bleibt irgentwie gleich:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
    public partial class PlentySoapRequest_GetItemsStock : object, System.ComponentModel.INotifyPropertyChanged {
        
        private PlentySoapObject_GetItemsStock[] getItemsStockField;
        
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public PlentySoapObject_GetItemsStock[] GetItemsStock {
            get {
                return this.getItemsStockField;
            }
            set {
                this.getItemsStockField = value;
                this.RaisePropertyChanged("GetItemsStock");
            }


Wenn ich das jetzt wie folg aufrufe, bekomme ich immer den Fehler, dass ich mit NEW eine Instanz erstellen soll. Laut Google ist das auch die Lösung, nur leider weiß ich nicht wie.

ausblenden C#-Quelltext
1:
2:
            PlentySoapRequest_GetItemsStock MyStockRequest = new PlentySoapRequest_GetItemsStock();
            MyStockRequest.GetItemsStock[0].SKU = "aaa";


Ich weiß nicht wie ich der Eigenschaft GetItemsStock in der Klasse PlentySoapRequest_GetItemsStock den WErt für z.B. SKU zuweisen soll.

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 21.11.11 15:21 
Bevor du auf ein Array Element zugreifen kannst musst du wie ich gesagt habe auch erstmal ein entsprechendes Array erzeugen.

ausblenden C#-Quelltext
1:
2:
MyStockRequest.GetItemsStock = new PlentySoapObject_GetItemsStock[1];
MyStockRequest.GetItemsStock[0].SKU = "aaa";
chx_de Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 21.11.11 15:30 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Bevor du auf ein Array Element zugreifen kannst musst du wie ich gesagt habe auch erstmal ein entsprechendes Array erzeugen.

ausblenden C#-Quelltext
1:
2:
MyStockRequest.GetItemsStock = new PlentySoapObject_GetItemsStock[1];
MyStockRequest.GetItemsStock[0].SKU = "aaa";


Also wie folgt?

ausblenden C#-Quelltext
1:
2:
3:
            PlentySoapRequest_GetItemsStock MyStockRequest = new PlentySoapRequest_GetItemsStock();
            MyStockRequest.GetItemsStock = new PlentySoapObject_GetItemsStock[1];
            MyStockRequest.GetItemsStock[0].SKU = "aaa";


--> Das bringt aber leider immer noch den Fehler. Der Debuger steigt in der letzten Zeile aus und gibt für MyStockRequest.GetItemsStock[0] ein NULL aus. Das ist ja noch alles bevor ich dann den eigentlichen Call auf den Server absetzen werden.

Irgentwie hängt es noch daran, das das Array erzeugt wird. Die Lösung oben muss noch einen Fehler haben.

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 21.11.11 15:32 
Nicht ganz. Nach dem Array selbst musst du auch noch das konkrete Array Element erzeugen. Das gleich zu befüllen und dann erst MyStockRequest.GetItemsStock[0] zuzuweisen ist wohl am einfachsten.
chx_de Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 21.11.11 15:36 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Nicht ganz. Nach dem Array selbst musst du auch noch das konkrete Array Element erzeugen. Das gleich zu befüllen und dann erst MyStockRequest.GetItemsStock[0] zuzuweisen ist wohl am einfachsten.


Kannst du mir dazu Beispiel Code geben? Also wie ich z.B. das ArrayElement erzeuge? Das wird ja genau das sein, wass ich nicht hinbekomme.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 21.11.11 15:45 
Zitat:
Kannst du mir dazu Beispiel Code geben


Dein erster Code im ersten Beitrag (wenn es denn dein Code ist). Zeile 9