152 messaggi dal 08 settembre 2006
Buongiorno,
da un programma vb.net devo chiamare un metodo di un servizio web remoto ;

questo metodo accetta un oggetto fattura contenente 2 proprietà :

testata
righe

nel servizio la struttura è stata definita così :

public class Fattura
{
public TestataFattura Testata { get; set; }
public IList<RigaFattura> Righe { get; set; }

public FatturaAttiva()
{
Testata = new TestataFattura();
Righe = new List<RigaFattura>();
}
}

dal programma vb quando istanzio l'oggetto fattura anzichè avere per la proprietà righe una lista (list of) vedo solo un tipo 'singolo' quindi non riesco a passare una lista di righe;

ho provato a fare così :

For n = 1 To listarighe
Riga = oggetto.valorizzaRiga(lista(n))
fattura.Righe.ToList().Add(Riga)
Riga = Nothing
Next n

ma il metodo add restituisce l'errore :

'Il valore non può essere null.
Nome parametro: source'

si può risolvere così? o è stato sbagliata la definizione dentro il servizio?

grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
non ho capito moltissimo di questo codice perché non so cosa hai bisogno di ottenere.
For n = 1 To listarighe
Riga = oggetto.valorizzaRiga(lista(n))
fattura.Righe.ToList().Add(Riga)
Riga = Nothing
Next n

Mi sembra di capire che hai una lista di oggetti 'Riga' che devi trasformare nel tipo 'RigaFattura', così come richiesto dal webservice.

La proprietà 'Righe' dell'oggetto di tipo 'Fattura' è certamente una lista.
Secondo me te la potresti cavare con una riga di codice usando LINQ
fattura.Righe = listaRigheIniziale.Select(riga => new RigaFattura(riga)).ToList();


...ma è difficile da dire con sicurezza dato che non conosco il tuo scenario. Prova a chiarire qual è la tua situazione di partenza.

ciao,
Moreno

Enjoy learning and just keep making
152 messaggi dal 08 settembre 2006
allora, la situazione è la seguente :

il servizio ha un metodo creafuttura a cui deve essere passato un oggetto di tipo fattura composto da

TestataFattura (oggetto singolo con i suoi campi numero, data, cliente ecc.)
RigheFattura (oggetto lista in cui ciascun item è composto a sua volta dai campi numero, riga fattura, articolo ecc)

in sostanza

class fattura{
testataFattura testata
IList<RigaFattura> righe
}

lato programma (windows form, VB.net) io istanzio un oggetto di tipo fattura

dim miaFattura as new servizio.fattura

poi un oggetto di tipo testatafattura

dim miaTestata as new servizio.testatafattura

e ne valorizzo le proprietà :

miatestata.numero = numero
miatestata.data = datafattura
ecc.

poi oggetto di tipo list<rigaFattura>

dim mierighe as new List(of servizio.rigaFattura)

e per popolarlo
mierighe.add(riga) dove riga è popolata con i suoi campi numero, articolo ecc.

e poi

fattura.testa=miatestata
fatture.righe=mierighe

il problema è che fatture.riga non viene esposto, lato programma vb come lista ma come oggetto singolo quindi l'assegnazione

fatture.righe=mierighe

da errore di incompatibilità di tipo (da un lato item, dall'altro lista)

da qui, dato che nel servizio la lista di righe è definita come ILIST<> anzichè LIST<> avevo provato a trasformare, lato programma la ILIST in list con il metodo ToList ma quando faccio l'assegnazione come ti ho scritto nell'altro messaggio viene fuori quell'errore....

fattura.Righe.ToList().Add(Riga) dove riga è staot popolato con le sue proprietà numero, data ecc.

e l'errore è

'Il valore non può essere null.
Nome parametro: source'

spero di essermi spiegato, grazie della risposta, ciao
11.886 messaggi dal 09 febbraio 2002
Contributi

spero di essermi spiegato

Sì ma c'è qualcosa che non torna.

Se tu sei in grado di invocare il metodo ToList() sulla proprietà Righe, vuol dire senza ombra di dubbio che Righe è un IEnumerable (cioè un elenco) e non un item singolo come sostieni.

Quindi, queste due affermazioni sono in contraddizione tra loro.
  • da errore di incompatibilità di tipo (da un lato item, dall'altro lista)
  • fattura.Righe.ToList()


Non ho idea dove sia il problema, ho bisogno che mi riporti esattamente l'errore di compilazione che ottieni quando provi a fare questo:
fattura.Righe = mierighe

Inoltre, se clicchi sulla proprietà Righe e premi il tasto F12, navigherai alla sua definizione e potrai vedere qual è il suo tipo effettivo.
Anche portare il mouse sopra la proprietà Righe ti suggerirà il tipo.

ciao,
Moreno
Modificato da BrightSoul il 07 febbraio 2018 21.57 -

Enjoy learning and just keep making
152 messaggi dal 08 settembre 2006
buongiorno Moreno,
l'errore esatto su questa istruzione

fattura.Righe = mierighe

è :

Non è possibile convertire il valore di tipo 'List(Of RigaFattura)' in 'RigaFattura()';
(non capisco però cosa sia RigaFattura(), un array di RigaFattura? e questo spiegherebbe l'incompatibilità e anche il fatto che si possa fare il toList)

dove mieRighe è stato definito appunto come List(of rigaFattura)

la definizione di Righe è invece questa :

<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property Righe() As servizio.RigaFattura()
Get
Return Me.RigheField
End Get
Set
If (Object.ReferenceEquals(Me.RigheField, value) <> true) Then
Me.RigheField = value
Me.RaisePropertyChanged("Righe")
End If
End Set
End Property

l'autore del servizio mi dice che lato servizio la definizione che ha usato è la seguente :


public class Fattura
{
public TestataFattura Testata { get; set; }
public IList<RigaFattura> Righe { get; set; }
public IList<NotaFattura> Note { get; set; }

public Fattura()
{
Testata = new TestataFattura();
Righe = new List<RigaFattura>();
Note = new List<NotaFattura>();
}
}

grazie
Modificato da bryger il 08 febbraio 2018 08.50 -
Modificato da bryger il 08 febbraio 2018 08.50 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, scoperto il problema.
Righe è di tipo RigaFattura(), cioè array di RigaFattura. Il problema è dunque che stai cercando di assegnare una List(Of RigaFattura) ad un array. Si può risolvere facilmente in questo modo:

fattura.Righe = mierighe.ToArray()


ciao,
Moreno

Enjoy learning and just keep making
152 messaggi dal 08 settembre 2006
Sì, l'ho scoperto ora anche io, grazie; ma è corretto che sia un array invece che una list dentro il servizio?
11.886 messaggi dal 09 febbraio 2002
Contributi

Sì, l'ho scoperto ora anche io, grazie; ma è corretto che sia un array invece che una list dentro il servizio?

Nella definizione del servizio (il documento WSDL) si perde il tipo .NET dell'elenco originale. Così, quando crei un riferimento al servizio, Visual Studio non può sapere se originariamente quell'elenco era un array o una list ma lascia a te la possibilità di scegliere.

Come vedi in questa immagine puoi scegliere List anziché array, che è il default.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.