DropDownList AppendDAdAboundItems (البند الأول ليكون فارغا ولا التكرارات)
-
06-09-2019 - |
سؤال
انا املك 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>