Avatar billede jobless Nybegynder
07. oktober 2006 - 08:52 Der er 17 kommentarer

ArgumentOutOfRangeException i dropdownlist

Hej.

Jeg har en dropdownlist i et formview. Denne dropdownlist er bundet til et felt i databasen, og jeg har følgende problem:

Hvis værdien i databasen ikke eksisterer i dropdownlistens bundne tabel, får jeg fejlen: 'TitelDropDownList' har en SelectedValue, der er ugyldig, da den ikke findes på elementlisten.

Fremgangsmåden må være, at jeg i en event checker om værdien eksisterer, og hvis den ikke gør det, sættes selectedindex = -1.

Problemet er blot, at jeg ikke kan finde ud af hvilken event jeg skal bruge til det...

MVH

JoBless
Avatar billede c-sharp Nybegynder
07. oktober 2006 - 09:40 #1
Hvordan kan værdien ikke eksistere i databasen når det er den der levere værdierne? Eller har du implementeret din dropdown statisk?
Avatar billede jobless Nybegynder
07. oktober 2006 - 10:20 #2
Min dropdown har en anden tabel som kilde til valgmulighederne, og hvis en post er blevet slettet i denne, og man herefter går ind på en post i hovedtabellen, som anvender den slettede værdi, så har vi balladen...

F. eks. er en person har fået titlen 'Sælger' og denne har værdien 5 i min titel-tabel. Herefter vil man rette i definitionerne, og sletter derfor 'Sælger' i titel-tabellen.
Så åbnes bruger-tabellen igen, og heri er jo angivet 5 i feltet titel, men denne post eksisterer jo ikke længere i titel-tabellen...... så fejler siden.

Mit ønske i ovennævnte situation vil være, at der ikke er nogen værdi selected i min dropdownlist, altså første valgmulighed er valgt.
Avatar billede c-sharp Nybegynder
07. oktober 2006 - 10:40 #3
Den hurtige løsning (og grimme) er at lave en try, catch, og hvis den så kommer ned i din catch så sætter du din drop til den første valgmulighed.
Avatar billede jobless Nybegynder
07. oktober 2006 - 13:25 #4
ja, men hvilken event (jeg kan sagtens teste om jeg finder værdien, og sætte første valgmulighed)?
Avatar billede c-sharp Nybegynder
07. oktober 2006 - 14:57 #5
Jeg er vist ikke 100% med på hvad du vil, men du kan sætte en OnSelectedIndexChanged="[kald din metode]" i din dropdown

og grive eventen i din codebehind:
protected void [metode navn](Object sender, EventArgs e)
{
}

Kan du bruge det til noget?
Avatar billede jobless Nybegynder
07. oktober 2006 - 15:24 #6
ja og nej, jeg får fejlen når siden åbnes, og jeg mener derfor ikke at jeg kan håndtere fejlen ved OnSelectedIndexChanged (fejlen er jo opstået inden jeg vælger noget i min dropdown)?
Avatar billede c-sharp Nybegynder
07. oktober 2006 - 15:49 #7
Som jeg forstår di spørgsmål så gør din side følgende:

Finder alle oplysninger om en bestemt person, de oplysninger indsætter den så i de tilhørende felter på siden. Titet feltet er en dropdown og når den prøver at sætte den rigtige værdi i denne og den ikke eksistere i din titel-tabel mere får du en fejl?

derfor skal du lave en try catch omkring den linie hvor du sætter "selectedindex"
Avatar billede neoman Novice
07. oktober 2006 - 16:00 #8
Det går jo galt ved databinding - så eventet skal vel være OnDataBind eller OnDataBound.
Men jeg håber, at du er klar over, at du er ved at lave en lappeløsning - den lapper en inkonsistents i DB'en som ikke burde være der i første omgang jo :)

Måden at vikle sig ud af dette her på, er IKKE at tillade at modificere titler, såfremt nogen har en sådan titel i din bruger tabel. Rækkefølgen skulle så være at modificere personens titel til noget andet, og når den titel som skal modificeres er fri af bindinger, SÅ slipper du for at lappe :)
Avatar billede c-sharp Nybegynder
07. oktober 2006 - 16:19 #9
Neoman, det er korrekt men jeg startede vist også med at skrive ord som hurtig og grim :-)

Men ja det mest rigtige er at lave rettelserne i databasen så den altid er konsistent.
Avatar billede jobless Nybegynder
09. oktober 2006 - 08:49 #10
Ja, jeg er 100% enig i at det ideologisk set burde rettes i databasen, men dette er temmeligt uoverskueligt idet jeg er ved at lave en brugerflade til en større database, hvor en bruger tidligere har rettet 'i hånden', så mit eksempel er blot 1 tabel/felt ud af måske 100.....

Begge events som nævnes kan ikke bruges, da siden fejler inden disse kører.

Er der nogen property man kan sætte, så den ikke kræver at posten eksisterer (det kan ikke passe at jeg er den eneste der er ude i dette problem) ?
Avatar billede c-sharp Nybegynder
09. oktober 2006 - 09:11 #11
Du skal ikke spegulere i events når det egår galt allerede når du loader siden.

Du har ikke svaret på om dette er det der sker på din side:
Finder alle oplysninger om en bestemt person, de oplysninger indsætter den så i de tilhørende felter på siden. Titet feltet er en dropdown og når den prøver at sætte den rigtige værdi i denne og den ikke eksistere i din titel-tabel mere får du en fejl?

derfor skal du lave en try catch omkring den linie hvor du sætter "selectedindex"
Avatar billede jobless Nybegynder
09. oktober 2006 - 09:29 #12
Jeg sætter ikke nogen selectedindex, værdien er jo bundet (<asp:DropDownList SelectedValue='<%# Bind("Titel") %>' ).
Avatar billede c-sharp Nybegynder
09. oktober 2006 - 09:44 #13
Nå du har lavet det i design view, den er jeg ikke så skrap til, men jeg vil tro at du i din codebehind vil kunne håndtere det i RowCreatedDataBound. Så istedet for at sætte den parameter i din aspx side så validere du den i RowCreatedDataBound og sætter den der fra.
Avatar billede jobless Nybegynder
09. oktober 2006 - 09:59 #14
Jeg har lavet det udfra eksemplerne her: http://quickstarts.asp.net/QuickStartv20/aspnet/doc/ctrlref/data/formview.aspx

og jeg kan ikke finde de nævnte events på hverken mit formview, datasource eller dropdownlist ?!?
Avatar billede c-sharp Nybegynder
09. oktober 2006 - 10:19 #15
Det er klar sorry, tænkte lige på at du brugte et grid...

Jeg ved desværre ikke lige hvordan du kan håndtere den fejl på den måde du har bygget tingene op. Det mest rigtige vil jo stadig være at gøre som neoman skriver.

Hvis jeg får tid senere skal jeg nok prøve at kigge lidt på det igen.
Avatar billede jobless Nybegynder
09. oktober 2006 - 11:33 #16
Nu har jeg fjernet  SelectedValue='<%# Bind("Titel") %>' så jeg ikke får fejlen når siden åbnes.

Herefter vil jeg i ddl_databound finde værdien og sætte denne, hvis den findes på listen.

Nu er jeg imidlertid stødt i et andet problem, for når jeg vil opdatere kan jeg ikke fange værdien i min dropdownlist i min updateparameter (den bruger min defaultvalue istedet vor valgt værdi).

Any suggestions ?
Avatar billede jobless Nybegynder
09. oktober 2006 - 13:56 #17
Nu har jeg ændret min dropdownlist til en usercontrol, med en ste/get property.

Denne kan jeg styre/teste inden bindingen, og derfor fejlsøge om den relaterede post findes.

Noget af en omvej for et lille problem, men det virker !!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester