2009-09-04 9 views
29

Często spotykam ten problem i nie mam pojęcia, co go powoduje. Dostaję wyjątek w DataBind: SelectedValue which is invalid because it does not exist in the list of items.Wybrana wartość, która jest nieprawidłowa, ponieważ nie istnieje na liście pozycji.

Oto niektóre ważne informacje:

  1. I reload listOrgs okresowo, gdy dane źródłowe nie zmieniło.
  2. Wywołanie Organization.DTListAll zwraca 2 wartości Int, pary ciągów.
  3. Istnieje żaden duplikat lub wartości null w zwracanych danych
  4. Po pierwszych dwóch liniach Poniżej listOrgs.Items.Count wynosi 0, a wybrana wartość jest 0
  5. Wybrana wartość po operacji jest wykonywana DataBind wartość identyfikatora w pierwszym rzędzie w danych
  6. wyjątek zdarza się po raz pierwszy kod jest wykonywany po stronie świeżego ładunku
listOrgs.Items.Clear(); 
listOrgs.SelectedValue = "0"; 
listOrgs.DataSource = new Organization().DTListAll(SiteID); 
listOrgs.DataTextField = "OrganizationName"; 
listOrgs.DataValueField = "OrganizationID"; 
listOrgs.DataBind(); 
+0

Na co linia robi wyjątek występuje? Część informacyjna nr 5 sugeruje, że każda instrukcja wykonywana jest bez wyjątku. –

Odpowiedz

0

Zmiana pierwsze dwa linia z tym:

listOrgs.SelectedItem.Selected = false; 
listOrgs.Items.Clear(); 
+0

Ustawienie SelectedItem.Selected = false zgłasza wyjątek –

+0

Co to jest wyjątek? może powinieneś ponownie utworzyć listę rozwijaną przed powiązaniem: listOrgs = new DropDownList(); – Canavar

3

spróbuj ustawić listOrgs.SelectedValue = "0" po odświeżeniu DataSource

W tej chwili staramy się wybrać pierwszą pozycję w pustej listy.

+0

To działało. –

1

W przypadku nadal masz ten problem ten jest rozwiązany jak ja go:

listOrgs.SelectedIndex = -1; // Clears the SelectedIndex to avoid the exception 
listOrgs.DataSource = new Organization().DTListAll(SiteID); 
listOrgs.DataTextField = "OrganizationName"; 
listOrgs.DataValueField = "OrganizationID"; 
listOrgs.DataBind();   //Unless you have "listOrgs.AppendDataBoundItems = true" you don't need to clear the list 
57

Widocznie rozwiązanie napisałem nie był całkowicie skuteczny ... W końcu w mojej aplikacji zmienia się w ten sposób:

listOrgs.Items.Clear(); 
listOrgs.SelectedIndex = -1; 
listOrgs.SelectedValue = null; 
listOrgs.ClearSelection();  // Clears the selection to avoid the exception (only one of these should be enough but in my application I needed all..) 
listOrgs.DataSource = new Organization().DTListAll(SiteID); 
listOrgs.DataTextField = "OrganizationName"; 
listOrgs.DataValueField = "OrganizationID"; 
listOrgs.DataBind(); 
+11

To jedyne rozwiązanie, które sprawdziło się u mnie. Nigdy nie zdawałem sobie sprawy, jak okropne jest ddl w magazynie – Mario

+0

Zrobiłem klasę wywodzącą się z rozwijanego menu i przesłoniłem zestaw właściwości DataSource, aby po prostu wywołać te rzeczy, więc nie musiałem pamiętać, aby zrobić to wszędzie i to działa jak urok. Dzięki! – Justin

+0

To działało również dla mnie. Ale złapałem się na herezji: "Czy nie będzie łatwiej stworzyć nową instancję klasy DropDownList i przypisać ją do tego samego identyfikatora?" Westchnienie. –

7

Ciągle otrzymuję ten błąd.
Dziwne jest to, że przed ustawianiem źródła danych i ponownym wiązaniem po usunięciu elementu, wybrany został indeks o wartości = -1.

Jeśli jawnie ustawię selectedIndex = -1;, to działa i nie generuje błędu.

Tak więc mimo że już -1 ustawienie na -1 zatrzymuje je przed błędami.

Weird eh?

+0

Co udowadnia podstawowe szaleństwo w projektowaniu tej kontroli. – mm201

+0

Miałem takie samo doświadczenie! Najpierw zrobiłem 'ddl.ClearSelection()', które wyczyściło zarówno wybraną wartość jak i index.Still dostałem błąd. Kiedy jednak jawnie ustawiam 'ddl.SelectedIndex = -1' i' ddl.SelectedValue = null', DZIAŁA! ??? –

1

Nie jestem pewien, czy to twój przypadek, ale miałem ten sam problem i najwyraźniej nie było żadnego wyjaśnienia, wtedy zdałem sobie sprawę z wykonania kopii i wklejenia w notatniku pola bazy danych, które na początku wartości było NULL .

Ciekawe, że działały wybrane tabele łączenia. Usunąłem wiersz i ponownie wstawiłem, po tym jak działałem poprawnie.

1

@Parakowana odpowiedź pomogła mi rozwiązać problem.

Jednak podczas eksperymentowania kliknęłam w głowę, dlaczego otrzymałem błąd.

Ustawiłem atrybut "Tekst" myśląc, że może on stworzyć dla mnie znaczącą etykietę lub zestaw pól + legendę (której nie ma).

Lista Text property dotyczy właściwości SelectedValue dla obiektu ListControl.

Tak więc mój błąd polegający na błędnym zinterpretowaniu właściwości tekstu.

0

Powtarzało się powtarzanie tego samego błędu i próbowałem zakończyć, nie ustawiając domyślnej wybranej wartości na Indeks -1.

ja skomentował mój kod ddlDRIBidAmt.SelectedValue = -1

Wartość ta została ustalona w czasie, gdy moja strona Kontrole zostały zresetowane do wartości domyślnych.

0

Wiem, że jest za późno na odpowiedź, ale to, co próbowałem, to brudne rozwiązanie, ale zadziałało. Po wiązania z danymi, jestem wstawić element o indeksie 0

ddl.Items.Insert(0, new ListItem("---Select---","-1")); 

A w ustawieniu

Jestem umieszczenie try catch, W połowu jestem Ustawienie wartości na -1

Powiązane problemy