3

System.Web.UI.WebControls.ListItems の Collections.Generic.List で asp:DropDownList を DataBind しようとしています。DataBind() がこのエラーをスローしています。

System.ArgumentOutOfRangeException: 'ddlPlatinumOptions' には、アイテムのリストに存在しないため無効な SelectedValue があります。

.ascx

<asp:DropDownList ID="ddlPlatinumOptions" runat="server" AutoPostBack="true" width="100%"></asp:DropDownList>

.ascx.cs

public void BindPlatinumOptions()
{
    ddlPlatinumOptions.DataTextField = "Text";
    ddlPlatinumOptions.DataValueField = "Value";
    ddlPlatinumOptions.DataSource = _platinumOptions;
    ddlPlatinumOptions.DataBind(); // Throwing Error
}

プレゼンター

MattressProtectionInfo standard = RF_ProtectionPlan.GetMattressPlanInfo(MattressId, false);
MattressProtectionInfo premium = RF_ProtectionPlan.GetMattressPlanInfo(MattressId, true);
List<ListItem> plans = new List<ListItem>();                  
if (standard != null)
{
    plans.Add(new ListItem(standard.Price.ToString("C") + " - Standard 5-Year Platinum Protection", standard.ProductID.ToString()));
}
if (premium != null)
{
    plans.Add(new ListItem(premium.Price.ToString("C") + " - Premium 5-Year Platinum Protection", premium.ProductID.ToString()));
}

_view.PlatinumOptions = plans;
_view.BindPlatinumOptions();

データ例

  • 値 = "21696" テキスト = "$99.95 - 標準の 5 年間プラチナ プロテクション"
  • 値 = "21702" テキスト = "$119.95 - プレミアム 5 年間プラチナ プロテクション"

私が試したこと

  • 私のデータの前にデータソースとデータバインディングをヌルにして、何かをクリアします(dataBindでも壊れました)
  • DataTextField と DataValueField の位置を再配置する (時間の無駄 - 変更なし)
  • データバインドの前に、選択したインデックスを 0 と宣言する
  • ddlPlatinumOptions.Items.Clear();
  • ddlPlatinumOptions.ClearSelection();

ストローをつかんでいます。データバインドがドロップダウンリスト内にないものを選択しようとしているかのように見えます。

コードに表示されていないエラーがありますか? 何か案は?

4

2 に答える 2

5

この問題にも直面した後、ASP.NET ソース コードをデバッグしたところ、ASP.NET ソース コードに欠陥 (?) が見つかりました (したがって、問題の解決策が見つかりました)。

内部的には、System.Web.UI.WebControls.Listcontrol最近使用されSelectedValueた . そのため、が からすでに設定されSelectedValueた後にデータ バインディングが発生すると (プロパティがネイティブにクリアされます) 、データ バインディング操作は、以前にキャッシュされたアイテムを検索して事前に選択しようとします。残念ながら、キャッシュされた値が新しいリストに見つからない場合、現在の値を黙ってそのままにしておくのではなく、例外をスローします。SelectedValueRequest.Form[]DataSourceSelectedValue null

ViewState データ バインディングにおよびデータ ソース オブジェクトを使用すると、後のデータ バインド操作でSelectedValue取得したが削除されるため、彼らはそうしたと思いますRequest.Form[]

そのため、ページ ライフサイクル内で複数のデータ バインディング操作を実行しListControl、データ ソースが異なる場合は常に、この例外が発生します。


ASP.NET コードの概要は次のとおりです。

    public virtual string SelectedValue
    {
        set
        {
            if (Items.Count != 0)
            {
                // at design time, a binding on SelectedValue will be reset to the default value on OnComponentChanged
                if (value == null || (DesignMode && value.Length == 0))
                {
                    ClearSelection();
                    return;
                    // !!! cachedSelectedValue is not getting reset here !!!
                }

            ...

            // always save the selectedvalue
            // for later databinding in case we have viewstate items or static items
            cachedSelectedValue = value;
        }
    }


そして、ここに解決策があります:

それ以外の:

    dropDownBox.DataSource = ...;
    dropDownBox.DataBind();

これを書きます:

    dropDownBox.Items.Clear();
    dropDownBox.SelectedValue = null;
    dropDownBox.DataSource = ...;
    dropDownBox.DataBind();


(この操作は、がまだ空でないdropDownBox.Items.Clear();場合にのみ必要です。)dropDownBox.Items

于 2016-11-22T16:53:42.610 に答える