Toon posts:

[C#.NET] ArrayList "verdwijnt"

Pagina: 1
Acties:

Verwijderd

Topicstarter
OK, hier ben ik weer, sorry...ik heb hier als gek op gezocht maar vind er niets over en vind het énorm bizar.

Ik heb een webservice waarin verschillende methods zijn. In die webservice heb ik ook een klasse Medewerker gedefinieerd. In die Medewerker-klasse zit een ArrayList e_mail die alle e-mail-adressen van een bepaalde medewerker bijhoudt.
Om die waarde op te vragen en te definieren gebruik ik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
public ArrayList Mail
{
    get
    {
        return this.e_mail;
    }

    set
    {
        this.e_mail = value;
    }
}


Binnen de webservice doet dit het perfect. Ik krijg een ArrayList terug, zoals verwacht en ik kan er ook alle bewerkingen op doen die op een ArrayList toepasbaar zijn.

Nu heb ik ook een web applicatie waarin ik een web reference heb naar de webservice die ik net beschreef. Tot op heden merkte ik niets verkeerd aan deze manier van werken. Alles deed exact wat ik ervan verwachtte.

Maar nu kom ik plots in de problemen:
Op een van de web forms in mijn web applicatie wil ik het mogelijk maken voor de gebruiker om e-mail adressen te verwijderen. Als ik nu echter de methode Medewerker.Mail oproep in mijn webapplicatie dan lijkt het alsof .NET plots niet meer weet dat Mail een ArrayList is. Ik krijg dan ook voortdurend compiler-errors als ik Mail.Remove("...") probeer te doen. (en ook IntelliSense weet van niets meer).

Hoe komt dit? En wat doe ik er aan?

  • vogeltje
  • Registratie: December 2001
  • Laatst online: 10-08-2025
Is het uberhaupt wel mogelijk een ArrayList object over een Webservice te retourneren? Wellicht omdat die niet serializable is? correct me if i'm wrong....

Om een oplossing voor jouw probleem te geven, zou ik gewoon Webmethods maken ala Remove(int index) etc. en die aanroepen via je Webservice.

[ Voor 8% gewijzigd door vogeltje op 16-03-2005 18:32 ]

binnenkort een hele dikke casemod :P


Verwijderd

Topicstarter
vogeltje schreef op woensdag 16 maart 2005 @ 18:31:
Is het uberhaupt wel mogelijk een ArrayList object over een Webservice te retourneren? Wellicht omdat die niet serializable is? correct me if i'm wrong....

Om een oplossing voor jouw probleem te geven, zou ik gewoon Webmethods maken ala Remove(int index) etc. en die aanroepen via je Webservice.
Dat van dat serializable bij: i'll take your word for it.
Jouw oplossing is echter niet meteen mijn favoriete oplossing.
Wat ik nu doe is in mijn webapplicatie een Medewerker-type aanmaken. In dit Medewerker-type sla ik dan alle informatie op over een medewerker (die informatie krijg ik via een webservice uit de database). Het is dan de bedoeling dat de gebruiker op dat "lokaal" medewerker-type kan prutsen zoveel hij wil. Eens hij tevreden is met zijn veranderingen klikt hij op "save" en dan pas worden de wijzigingen in de database gedaan.
Met jouw oplossing kan ik enkel rechtstreeks deleten in de database en dan mijn lokale Medewerker updaten. Dat doe ik liever niet.

Wat ik trouwens niet begrijp als die ArrayList niet mogelijk zou zijn:
Waarom kan ik dan wél perfect lokaal een Medewerker aanmaken en laten opvullen (gebeurt 100% correct)? Ik kan me moeilijk voorstellen dat .NET voor mij kiest dat hij mijn klasse gaat herschrijven zodat het wel doet wat het moet.

  • vogeltje
  • Registratie: December 2001
  • Laatst online: 10-08-2025
Verwijderd schreef op woensdag 16 maart 2005 @ 18:37:
[...]
Wat ik trouwens niet begrijp als die ArrayList niet mogelijk zou zijn:
Waarom kan ik dan wél perfect lokaal een Medewerker aanmaken en laten opvullen (gebeurt 100% correct)? Ik kan me moeilijk voorstellen dat .NET voor mij kiest dat hij mijn klasse gaat herschrijven zodat het wel doet wat het moet.
Je roept (lokaal) via je webservice de property aan, of je roept direct de property aan (dus zonder de webservice)? Bij de tweede is het vrij logisch, het wordt dan immers behandeld als een normale ArrayList. Is het eerste het geval, dan heb ik er zo niet direct een verklaring voor.

binnenkort een hele dikke casemod :P


Verwijderd

Topicstarter
Ik denk dat ik de verklaring voor de fout vond in de MSDN-library. Daar las ik dit
For example, when WSDL.exe encounters an ArrayList type in a service description , it creates an Object Array in the generated proxy class.
Dit is ook het type dat Visual Studio.NET toekent aan mijn Mail-methode. Wat ik er uit begrijp is dat de compiler dus automatisch zowel in mijn klasse Medewerker als in de webservices alle ArrayLists omzet naar een Array van objecten.

Een "simpele" oplossing die ik zie is nu in mijn web applicatie een nieuwe klasse maken met arraylisten. Die dan eerst opvullen met de resultaten van mijn webservice (met casten etc) en dan die klasse gaan bewerken. Op zich doenbaar maar verre van optimaal. Bovendien komen daar waarschijnlijk terug problemen bij kijken als ik de ArrayList terugstuur naar de webservice om zo de database te updaten.

Vraag is dus relatief simpel: wat zijn de deftigste methodes om objecten uit een Array te deleten. Via een loop kan dit wel, maar misschien zijn er methodes (zoals de perfecte Remove in de ArrayList) om dat makkelijker te doen. [Of kan ik gewoon een Array omzetten naar een ArrayList en dan terug naar een Array (na deleten uiteraard)]

  • vogeltje
  • Registratie: December 2001
  • Laatst online: 10-08-2025
het is toch vrij eenvoudig om die ArrayList om te bouwen naar een 'normale' objecten array? Andersom idem dito. Hoef je overigens niets te casten (tenzij je methodes van de objecten wilt benaderen).

Ik weet trouwens niet of er een methode ala toArray() is voor een ArrayList object. Zo ja, kan je die gebruiken, anders ff zelf maken.

[ Voor 31% gewijzigd door vogeltje op 16-03-2005 19:18 ]

binnenkort een hele dikke casemod :P


Verwijderd

Topicstarter
OK, ik heb (denk ik) een methode gevonden om te doen wat ik wil doen, maar nu zit ik nog met een vervelend probleem.

In de web applicatie heb ik een dropdownlist waarin je eerst je medewerker moet selecteren. Eens geselecteerd is er een postback waardoor de andere cellen op de pagina worden opgevuld met de informatie over de gekozen medewerker. (de dropdownlist staat dus in een if ( !IsPostBack) statement)

Nu, een van die cellen bevat dus de e-mailadressen. Hiervoor gebruik ik een Listbox. Daarnaast heb ik een button voorzien waarmee ik graag het uit de lijst geselecteerde adres wil deleten.
Probleem: om het geselecteerde adres te kunnen bepalen moet er een postback komen. Als ik de Listbox niet in een if ( !IsPostBack) steek, dan blijft de selectedIndex -1. Steek ik hem wél in de if-statement dan update hij de e-mailadressen niet meer als je een andere medewerker gebruikt.

Vraag is dus: is er een mogelijkheid om een if ( !IsPostBack) - statement te schrijven waarbij gekeken wordt door wat die postback ontstaan is? Zo zou ik de e-mailadressen wel kunnen laten updaten als de medewerker verandert wordt, maar niet als er een e-mailadres geselecteerd wordt.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 10-05 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Ga naar het deleten de listbox opnieuw binden?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op woensdag 16 maart 2005 @ 21:03:
Ga naar het deleten de listbox opnieuw binden?
Maar dat deleten lukt niet omdat ik daarvoor eerst het e-mailadres moet kennen dat gedelete moet worden. En dat adres kan ik enkel vinden door de SelectedItem van de Listbox op te vragen, en dus een postback uit te voeren (wat dus het probleem geeft)

Verwijderd

Topicstarter
...

Never mind dit hele lange verhaal. Mensen die veel te laat gaan slapen en veel te vroeg opstaan:
SelectedIndex pas NA DataBind uitvoeren kan wonderen doen 8)7

[ Voor 92% gewijzigd door Verwijderd op 17-03-2005 16:06 ]

Pagina: 1