خطأ: SelearValue الذي غير صالح لأنه غير موجود في قائمة العناصر

StackOverflow https://stackoverflow.com/questions/1317262

سؤال

لدي GridView التي تربط إلى ObjectDAtAsource (ObjstudentDetails). في وضع تحرير / إدراج GRIDVIVEVIVEN ONE من الحقول هي قائمة هبوطية تحصل عليها خيارات قائمة اختيار من جدول البحث. لدي هذه القائمة القائمة المنسدلة إلى عنصر تحكم ObjectDataSource (OBJSTATELIST) الذي يمثل جدول البحث. إنه يعمل بشكل جيد طالما أن القيمة الموجودة في ObjStudentDetsails ObjectDatasource تطابق إحدى القيم في Objstatelist ObjectDatasource، على الأقل في حالة قيمة سلسلة غير فارغة على أي حال.

يحتوي OBJSTATELIST على هذه القيم (من Proc المخزنة التي تحتفظ بها - ID # 6 هي سلسلة فارغة "):

StateId     State
----------- -----
6             
4           AL
1           GA
3           KY
2           TN

لدى ObjStudentDetails هذه القيم (من Proc المخزنة التي تحملها):

FirstName   LastName   State
----------- ---------- -----
tone        smith      TN

أو يمكن أن يكون لديك مجموعة النتائج هذه (الحالة هي سلسلة فارغة - '):

FirstName   LastName   State
----------- ---------- -----
jenny       johnson     

في أول نقاط OBJSTUDENTDETISTIONSETS State DropDownList في برنامج EditedEmtemplate يظهر بشكل جيد. في النتائج الثانية، ومع ذلك، أحصل على هذا الخطأ:

'ddlEditState' has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value 

أعتقد أنه نظرا لأن جدول البحث الخاص بي له قيمة بسلسلة فارغة، فإن قيمة ObjStudentDetails ذات سلسلة فارغة لن تتطابق، ولكن شيئا لا يعمل بالطريقة التي أتوقعها.

فيما يلي رمز التحريرية الخاص بي من GridView:

<EditItemTemplate>
  <asp:Panel ID="panEditState" runat="server">
    <asp:DropDownList ID="ddlEditState" runat="server" CssClass="GridviewDropdownlist"
      DataSourceID="objStateList" DataTextField="State" DataValueField="State"      
      SelectedValue='<%# Bind("State") %>'
      Width="50px">
</asp:DropDownList>
</asp:Panel>
</EditItemTemplate>

و OBJSTATELIST، الذي يستدعي طريقة تمرير معلمة جدول البحث عن الاستعلام:

<asp:ObjectDataSource ID="objStateList" runat="server" SelectMethod="GetDropdownData"     TypeName="AIMLibrary.BLL.DropdownData">
<SelectParameters>
<asp:Parameter Name="itemsToGet" DefaultValue="state" />
</SelectParameters>
</asp:ObjectDataSource>

أيه أفكار؟

هل كانت مفيدة؟

المحلول

ابدأ بإعداد خاصية AppendDAboundIboundItEdems على حد سواء. بعد ذلك، أضف ListItem Null عن طريق إضافة ما يلي <asp:ListItem> عنصر لكل قائمة هادفة حتى تبدو العلامات التصريحة:

<asp:DropDownList ID="Categories" runat="server"
    DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
    DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'
    AppendDataBoundItems="True">
    <asp:ListItem Value="">[nothing selected]</asp:ListItem>
</asp:DropDownList>

نصائح أخرى

أظن أن هناك العديد من السيناريوهات المختلفة التي يمكن أن تسبب هذا الخطأ. في حالتي، كان لدي انخفاض وضعت في حقل القالب. كان المنسدلة مرتبطا بمكتبها الخاص، وقد ارتبط خاصية SelectedValue الخاصة به إلى حقل من مصدر بيانات GRIDVIVE (منفصل).

الآن، مع سيناريو الخاص بي، كانت المشكلة حالة سباق. تم ملء بيانات GridView في GridView ويرتبطها قبل أن تتحول المنسوجات بدورها. وهذا يعني أيضا أنه يجري تعيين اختلال المنسوجات قبل إنشاء عناصر المنسوجات من خلال ارتباطاتها الخاصة.

أنا متأكد من أنه يجب أن يكون هناك حلا أفضل، لكنني لم يكن لدي الكثير من الوقت للبحث. قمت بإنترنت GridView والخروج من DataSources (معنى، إزالة المهام من المصمم) واختار ربط برمجيا. بهذه الطريقة، يمكنني ربط المنسوجات بشكل صريح بحيث ستكون قيم البنود الخاصة بها متاحة عند ربط GridView نفسه.

حتى الان جيدة جدا. مجرد عدد قليل من الخطوط الإضافية من التعليمات البرمجية في page_load

appenddatabounditems = "صحيح"> يعمل ولكن ليس في جميع الحالات. جعل القائمة المنسدلة داخل GridView لا تزال لغزا يجب على Microsoft حلها. يقولون التنمية هو ASP أسرع بكثير من PHP. حسنا هذا هو يومي الثالث على هذا صغير مشكلة ولا يزال ليس لديه حل.

حسنا، نظرا لأن هذه مشكلة شائعة، أعتقد أنها تستحق نشر إجابة فعليا: بعد الكثير من النظر حول لقد وجدت حلولين - حسنا، تصحيح واحد حقيقي.

  1. الترقيع: تعيين إعداد DDL AppendDataBoundItem=true أضف Anda عنصر واحد يدويا إلى القائمة (أي "يرجى تحديد" مع قيمة فارغة):

    <ASP: DropDownList معرف = "DropDownList5 RunAT =" Server "appenddatabounditems =" صحيح "...> <ASP: ListItem> يرجى تحديد </ ASP: ListItem> </ ASP: القائمة المنسدلة>

يبدو أن هذا يعمل في حوالي 80٪ من الحالات. كان لدي موقف غريب عندما اضطررت إلى ترقية الاستعلام الحالي (والعمل) المستخدم من قبل DDL للسماح بقيمة أخرى من المعلمة - كان الاستعلام شيئا مشابها SELECT ID, Name from EMPLOYEES where Department =@Department والسم في الأصل @Department يمكن أن يكون فقط مساويا "المخططين" و "ورشة عمل" - بعد إضافة "اللوجستية" توقف DDL في غامضة العمل فقط للقيمة الجديدة للإدارة.

  1. الحل المناسب: ربط DDL أثناء GridView_RowDataBound الحدث (تنبيه بفضل هذه المقالة

تؤخذ المعلمة الخاصة بي كنص من الملصق (إعداد مكان آخر)

    protected void GridView5_RowDataBound(object sender, GridViewRowEventArgs e)
    {

    //********** this  is a workaround for the annoying problem with dropdownlist in gidview without adding new item ************
    if (e.Row.RowType == DataControlRowType.DataRow && GridView5.EditIndex == e.Row.RowIndex)
    {
        DropDownList DropDownList5 = (DropDownList)e.Row.FindControl("DropDownList5");
        string query = "SELECT gkey as empID, name FROM [employees] where department=@department";
        SqlCommand command = new SqlCommand(query);
        command.Parameters.AddWithValue("@department", lblDepartment.Text);
        DropDownList5.DataSource = GetData(command);
        DropDownList5.DataTextField = "name";
        DropDownList5.DataValueField = "empID";
        DropDownList5.DataBind();
    }

وطريقة getdata:

   private DataTable GetData (SqlCommand cmd)
{
    string strConnString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    using (SqlConnection con = new SqlConnection(strConnString))
    {
        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            cmd.Connection = con;
            sda.SelectCommand = cmd;
            using (DataTable dt= new DataTable())
            {
                sda.Fill(dt);
                return dt;
            }
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top