DropDownList AppendDAdAboundItems (البند الأول ليكون فارغا ولا التكرارات)

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

سؤال

انا املك DropDownList داخل UpdatePanel التي يتم ملؤها على عون البريد SqlDataSource. وبعد لديها معلمة هي عنصر تحكم آخر. أحتاج أحيانا إلى أعين سجولي متعددة، ولكن ما يحدث هو أنه في كل مرة يتم تحديث لوحة التحديث، تتم إضافة العناصر إلى DropDownList. وبعد لذلك DropDownList ينتهي وجود بيانات غير صحيحة أو بيانات متكررة.

لدي AppendDataBoundItems خاصية مجموعة true لأنني بحاجة إلى العنصر الأول ليكون فارغا.

كيف يمكنني التغلب على هذه المشكلة؟ هل هناك طريقة أخرى للحصول على عنصر أول فارغ؟

(هذه DropDownList في تطبيق Web ASP.NET 2.0، و CodeBehind في C #)

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

المحلول

بدلا من استخدام AppendDataboundItems='true' (مما سيؤدي إلى أن المشكلة التي تتحدث عنها)، تستجيب ل DataBound حدث ل DropDownList ثم أضف عنصر "فارغ" الخاص بك إلى أعلى القائمة.

<asp:DropDownList runat="server" ID="MyList"
  ondatabound="MyListDataBound"></asp:DropDownList>

ثم في الكود الخاص بك وراء:

protected void MyListDataBound(object sender, EventArgs e)
{
    MyList.Items.Insert(0, new ListItem("- Select -", ""));
}

نصائح أخرى

هناك إجابات جيدة هنا، لكنني شعرت بالحاجة إلى إدراج المزيد من المعلومات لأن هناك خيارات متعددة تعمل ونحن بحاجة إلى تحديد ما يجب استخدامه.

أولا، يجب أن نفهم AppendDataBoundItems. وبعد إذا AppendDataBoundItems = "true", ListItems تضاف إلى DropDownList دون مسح القديم. وإلا فإن DropDownList يتم مسحه قبل التالي DataBind. msdn appenddataboundItems doc.

هناك أساسا 2 الخيارات التي تغطيها معظم الإجابات:

1. حدد خيارا فارغا في HTML وإضافة Listitems من قاعدة البيانات إلى القائمة المنسدلة مرة واحدة فقط.

لاحظ 3 أشياء هنا:

  • فارغ ListItem يتم تعريفه في HTML
  • AppendDataBoundItems="true"
  • DataBind لا يطلق على أبعد من ذلك أو عندما DropDownList عدد العناصر هو> 1

مصدر:

<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
    <asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>

رمز وراء:

protected void Page_Load(object sender, System.EventArgs e)
{
    if (MyList.Items.Count <= 1 ) {
        MyList.DataSource = MyDataSource;
        MyList.DataBind();
    }
}

ملاحظة: أحب منطق التحقق من فحص العد مقابل IsPostBack. وبعد على الرغم من أن أبعاد الأخشاب غالبا ما يكون سبب تكرار Dinkding Databining، فمن الممكن أن تتسبب في طرق أخرى. التحقق من عدد العناصر هو أساسا فقط التحقق لمعرفة ما إذا كان قد تم تحميله بالفعل.

أو (خيار للاستخدام IsPostBack في حين أن)

protected void Page_Load(object sender, System.EventArgs e)
{
    if (!IsPostBack) {
        MyList.DataSource = MyDataSource;
        MyList.DataBind();
    }
}

2. مسح وإعادة تحميل القائمة المنسدلة على كل تحديث الصفحة.

لاحظ 3 الاختلافات من الخيار الأول:

  • AppendDataBoundItems="false" (إذا لم يتم تعريفه بعد ذلك false هل هي القيمة الافتراضية)
  • فارغ ListItem يتم إضافة في الكود وراء. لا يمكننا تحديده في HTML لأنه مع AppendDataBoundItems="false", ، سيتم تطهيرها.
  • DataBind ويدعى كل Page_Load

مصدر:

<asp:DropDownList ID="MyList" runat="server" DataValueField="Id"  DataTextField="Name" 
    OnDataBound="MyList_DataBound" >
</asp:DropDownList>

رمز وراء:

protected void Page_Load(object sender, System.EventArgs e)
{
    MyList.DataSource = MyDataSource;
    MyList.DataBind();
}

protected void MyList_DataBound(object sender, EventArgs e)
{
    MyList.Items.Insert(0, new ListItem("- Select One -", ""));
}

ربما ترتبط بتلك القائمة المنسدلة في الكود الخلف. لذلك يجب أن لا تفعل ذلك بعد عودة مرة أخرى:

// probably in Page_Load method
if (!Page.IsPostBack)
{
    // do data binding here
};

إليك فكرة، يمكننا استخدام أحداث 2: مقيد بيانات و ربط البيانات:

protected void MyListDataBound(object sender, EventArgs e)
{
  MyList.Items.Insert(0, new ListItem("- Select -", ""));
}

protected void MyListDataBinding(object sender, EventArgs e)
{
  MyList.Items.Items.Clear();
}
<asp:DropDownList ID="DropDownList1" AppendDataBoundItems="true" runat="server"
  DataSourceID="SqlDataSource1" DataTextField="state" DataValueField="state">
    <asp:ListItem Text="(Select a State)" Value="" />
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
  ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"
  SelectCommand="SELECT DISTINCT [state] FROM [authors]">
</asp:SqlDataSource>

وهنا فكرة.

هناك عقار في القائمة المنسدلة تسمى AutoPostBack اضبطها على True ثم في الرمز خلفك وضع كل طريقة ربط داخل if(!Page.IsPostBack). وبعد التي عملت بالنسبة لي.

مع تحياتي.

فقط اضف EnableViewState = "FALSE" إلى العلامة المنسدلة

<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource" 
DataTextField="Name" DataValueField="ID" EnableViewState="false" 
AppendDataBoundItems="true">
    <asp:ListItem Value="">Select</asp:ListItem>
</asp:DropDownList>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top