Pertanyaan ASP.NET Web Forms DropDownList memiliki SelectedValue yang tidak valid karena tidak ada dalam daftar item


Pertama-tama ada pertanyaan ( DropDownList memiliki SelectedValue yang tidak valid karena tidak ada dalam daftar item , DropDownList "memiliki SelectedValue yang tidak valid karena tidak ada dalam daftar item" , asp: DropDownList Error: 'DropDownList1' memiliki SelectedValue yang tidak valid karena tidak ada dalam daftar item ) tentang hal ini dan ada solusi yang diusulkan tetapi pertanyaan saya adalah benar-benar MENGAPA ini terjadi. Apa lagi saya tidak puas dengan solusi yang disarankan dan saya menemukan mereka cukup jelek.

Jadi ada halaman dengan daftar drop-down dan tombol:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="TestWebApplication.WebForm2" ViewStateMode="Disabled" %>

<html lang="en" >
<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="ddlTest" runat="server">
        </asp:DropDownList>
        <asp:Button Text="Test" ID="btnTest" runat="server" onclick="btnTest_Click" />
    </div>
    </form>
</body>
</html>

Saya mengikat ddlTest dengan beberapa item di Page_Init dan kemudian di btnTest_Click saya mengikat lagi:

using System;

namespace TestWebApplication
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Init(object sender, EventArgs e)
        {
            //SelectedIndex is -1, SelectedValue is "", SelectedItem is null
            ddlTest.DataSource = new[] { 1, 2, 3 };
            ddlTest.DataBind();
            ddlTest.SelectedValue = "3";
        }

        protected void btnTest_Click(object sender, EventArgs e)
        {
            //SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3}
            ddlTest.ClearSelection();
            //SelectedIndex is 0, SelectedValue is "1", SelectedItem is {1}
            ddlTest.SelectedIndex = -1; //Nothing changes including SelectedIndex
            ddlTest.SelectedValue = ""; //Nothing changes including SelectedValue
            ddlTest.Items.Clear();
            //SelectedIndex is -1, SelectedValue is "", SelectedItem is null
            ddlTest.DataSource = null; //Nothing changes except for the DataSource property
            ddlTest.DataSource = new[] { 1, 2 };
            ddlTest.DataBind();//Exception!
            //'ddlTest' has a SelectedValue which is invalid because it does not exist in the list of items.
            //Parameter name: value
        }
    }
}

Mengapa saya mendapatkan pengecualian. Saya mencoba berbagai versi ini dan tidak ada yang berhasil. Saya mencoba hanya menggunakan ClearSelection tetapi masih mendapat pengecualian yang sama. Apakah bug ini ada dalam kontrol atau sesuatu yang saya lewatkan. Apakah solusi jelek dari pertanyaan lain satu-satunya solusi?

Catatan - bug dapat direproduksi bahkan jika tombol dihapus dan semua kode dipindahkan dalam penangan kejadian tunggal. Cukup ikat satu kali setel nilai yang dipilih dan ikat lagi.


15
2018-05-04 15:46


asal


Jawaban:


Saya telah mengirimkan bug di Connect untuk masalah ini. Itu diselesaikan sebagai "Tidak akan memperbaiki" yang dalam pikiran saya berarti itu sebenarnya bug. Solusi tersedia:

ddlTest.Items.Clear();
ddlTest.SelectedValue = null;

https://connect.microsoft.com/VisualStudio/feedback/details/666808/asp-net-dropdownlist-selectedvalue-is-persisted-which-results-in-exception-if-the-control-is-databound-second- waktu

Saya agak mempertimbangkan ini jawabannya.


31
2017-09-11 09:08



Mengapa saya mendapatkan pengecualian.

Setelah Page_Init () dipanggil, ddlTest telah terikat ke 3 item: "1", "2" dan "3". Anda kemudian mengatur SelectedValue ke "3" dan memanipulasi segala macam hal yang terkait dengan kontrol DropDownList. Tetapi kontrol masih terikat ke daftar sebelumnya - Anda belum menelepon .DataBind () lagi meskipun Anda telah mengubah properti DropDownList. Pengecualian terjadi karena kontrol masih terikat pada {1, 2, 3}, itu tergantung pada sebelumnya. Pilihan Terpilih dan Anda baru saja mencoba. DataBind () ke daftar yang tidak termasuk "3".


3
2018-05-06 21:12



Saya memiliki masalah yang sama dan memperbaikinya dengan menambahkan metode DataBinding.

protected void myDDL_DataBinding(object sender, EventArgs e)
{
    if (myDDL.SelectedIndex != -1)
    {
        myDDL.SelectedIndex = 0;
    }
}

Pada halaman desain ...

<asp:DropDownList ID="myDDL" runat="server" 
    AutoPostBack="true" OnDataBinding="myDDL_DataBinding"
    OnSelectedIndexChanged="myDDL_SelectedIndexChanged">
</asp:DropDownList>

3
2017-10-05 19:32



1) Sebagaimana tertulis, contoh Anda benar-benar melempar pengecualian ddlTest.SelectedValue = "";, karena tidak ada item dalam koleksi dengan Value dari "". Saya pikir ini akan diharapkan dalam keadaan apa pun.

2) Saya mendapatkan pengecualian setiap kali saya mencoba mengaturnya SelectedValue atau SelectedIndex dari DDL ke sesuatu yang AKAN tidak valid pada saat DDL diberikan. Tetapi pengecualian tidak terjadi sampai DropDownList.Items Koleksi sebenarnya diubah, misalnya dengan DropDownList.Databind(). Hal pertama yang saya lakukan adalah membuat perubahan ini menjadi Page_Init:

protected void Page_Init(object sender, EventArgs e)
{
    //SelectedIndex is -1, SelectedValue is "", SelectedItem is null
    if (!IsPostBack)
    {
        ddlTest.DataSource = new[] { 1, 2, 3 };
        ddlTest.DataBind();
        ddlTest.SelectedValue = "3";
    }
}

Sekarang yang menarik adalah contoh pertama ini mengeluarkan pengecualian, tetapi yang kedua tidak. Mereka berdua mengatur SelectedValueyang valid pada saat itu, tetapi nilai dalam contoh pertama ("3") tidak akan valid pada saat halaman menampilkan:

protected void btnTest_Click(object sender, EventArgs e)
{
    //SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3}
    ddlTest.SelectedValue = "3"; 
    //SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3}
    ddlTest.ClearSelection();
    //SelectedIndex is 0, SelectedValue is "1", SelectedItem is {1}
    ddlTest.Items.Clear();
    //SelectedIndex is -1, SelectedValue is "", SelectedItem is null
    ddlTest.DataSource = null;
    ddlTest.DataSource = new[] { 1, 2 };
    ddlTest.DataBind(); //Exception!
    //'ddlTest' has a SelectedValue which is invalid because it does not exist in the list of items.
    //Parameter name: value
}

protected void btnTest_Click(object sender, EventArgs e)
{
    //SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3} (from viewstate)
    ddlTest.SelectedValue = "2"; 
    //SelectedIndex is 1, SelectedValue is "2", SelectedItem is {3}
    ddlTest.ClearSelection();
    //SelectedIndex is 0, SelectedValue is "1", SelectedItem is {1}
    ddlTest.Items.Clear();
    //SelectedIndex is -1, SelectedValue is "", SelectedItem is null
    ddlTest.DataSource = null;
    ddlTest.DataSource = new[] { 1, 2 };
    ddlTest.DataBind(); //No Exception...
}

Jadi, kesimpulan apa yang bisa kita tarik dari ini? Yah sepertinya masalahnya adalah karena pengaturan SelectedIndex atau SelectedValue milik DDL sebelum isi DDL dapat diubah pada siklus halaman yang sama. Jika nilai yang ditetapkan sebelumnya masih tersedia di konten baru DropDownList.Items, Anda dalam bisnis. Tetapi jika tidak ada di sana, Anda mendapatkan pengecualian.

Tebakan saya adalah ini ada hubungannya dengan keamanan benang tapi saya bukan ahli itu jadi mudah-mudahan seseorang dapat berkomentar.


2
2018-05-04 18:05



Dalam kasus saya, saya punya DropdownList di templatedfield dari gridview. Sekarang datasource dari grid employeeid  barang. Saya memiliki ini dalam proses yang tersimpan, isnull(employeeid,0) untuk sumber data dan tebak apa DropdownListtidak memiliki nilai 0 pada barang-barangnya; jadi saya mengubahnya menjadi isnull (employeeid, 1) karena item pertama di DropdownListpunya employeeid =1 dan masalah terpecahkan ini


0
2017-07-25 17:16



Karena tidak ada sumber data ketika halaman Anda dimuat ulang (pos balik terjadi), Anda harus menambahkan kontrol SqlDataSource di file .aspx Anda bahkan di halaman reload halaman mengenali DropDownList's DataSource. Kemudian Anda dapat menggunakan InsertCommand, UpdateCommand, DeleteCommand dan SelecCommand untuk mendapatkan DB Anda.


-2
2018-02-03 08:50