web-dev-qa-db-ja.com

SelectedValueはアイテムのリストに存在しないため無効です

私はこの問題に繰り返し遭遇し、それを引き起こしている原因を特定できません。 DataBindで例外が発生します:SelectedValue which is invalid because it does not exist in the list of items

ここにいくつかの重要な情報があります:

  1. 基になるデータが変更されたときに、listOrgsを定期的にリロードします。
  2. Organization.DTListAll呼び出しは、2つのInt、Stringペアを返します。
  3. 返されたデータに重複またはnull値はありません
  4. 以下の最初の2行の後、listOrgs.Items.Countは0で、選択された値は0です
  5. DataBindオペレーションの実行後に選択される値は、データの最初の行のID値です
  6. この例外は、このコードが新しいページのロード後に初めて実行されるときに発生します
listOrgs.Items.Clear(); 
listOrgs.SelectedValue = "0"; 
listOrgs.DataSource = new Organization().DTListAll(SiteID); 
listOrgs.DataTextField = "OrganizationName"; 
listOrgs.DataValueField = "OrganizationID"; 
listOrgs.DataBind();
31
Bob Jones

どうやら私が投稿したソリューションは完全に効果的ではなかったようです...最終的には私のアプリケーションでこれに変更しました:

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();
60
PMarques

このエラーが何度も発生しました。
奇妙なことに、データソースを設定してアイテムを削除した後に再バインドする前に、選択されたインデックス= -1です。

selectedIndex = -1;を明示的に設定すると、機能し、エラーはスローされません。

つまり、既に-1に設定していても、-1に設定するとエラーが発生しなくなります。

変なの?

7
DazManCat

設定してみてくださいlistOrgs.SelectedValue = "0"DataSourceを更新した後

現時点では、空のリストの最初のアイテムを選択しようとしています。

3
ChrisF

それがあなたのケースかどうかはわかりませんが、同じ問題があり、どうやら説明がなかったため、データベースのフィールドのメモ帳にコピーアンドペーストすると、値の先頭にNULLがあったことに気付きました。

奇妙なことに、選択した結合テーブルが機能していた。私は行を削除して再挿入しましたが、問題なく動作しました。

1
Alex

あなたがまだこの問題を抱えている場合、これが私がそれを解決した方法です:

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
1
PMarques

@PMarquesの回答は私を助け、私の問題を解決しました。

しかし、実験をしていると、なぜ最初にエラーが発生したのかが頭の中でわかりました。

私は「テキスト」属性を設定していましたが、これは、それを囲むラベルまたはフィールドセット+凡例を作成する可能性があると考えていました(作成しません)。

リストの Textプロパティ は、ListControlのSelectedValueプロパティに影響を与えます。

したがって、textプロパティが何をしたのかを誤解する私の間違い。

1
Alex KeySmith

これで最初の2行を変更します。

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

同じエラーが繰り返し発生し、デフォルトの選択された値をインデックス-1に設定しないようにしてしまいました。

コードにコメントしましたddlDRIBidAmt.SelectedValue = -1

この値は、ページコントロールがデフォルト値にリセットされたときに設定されました。

0
Anjali

私は答えるのが遅すぎることを知っていますが、私が試したことは汚い解決策ですが、それはうまくいきました。データバインド後、インデックス0にアイテムを挿入します

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

そしてセッティングで、

私はトライキャッチを配置しています、キャッチでは値を-1に設定しています

0
user240141