أثناء عملية تطوير صفحات موقع ASP.NET 2.0، غالبًا ما يكون من الضروري تعيين قيمة SelectedValue لعناصر تحكم القائمة مثل DropDownList إلى قيمة مقروءة من قاعدة البيانات أو أماكن أخرى.
أسهل طريقة هي تحديده مباشرة:
DropDownList1.SelectedValue = "الصين";
لكن في بعض الأحيان، إذا لم يكن هناك عنصر "الصين" في DropDownList1، فسيحدث استثناء في المهمة:
تفاصيل الاستثناء: System.ArgumentOutOfRangeException: يحتوي "DropDownList1" على قيمة SelectedValue غير صالحة لأنه غير موجود في قائمة العناصر.
ما تريد تحقيقه: إذا لم تكن القيمة المحددة موجودة في عنصر القائمة، فلا تقم بتعيين العنصر المحدد ولا تطرح استثناءً.
تحقق من MSDN:
يمكن أيضًا استخدام الخاصية SelectedValue لتحديد عنصر في عنصر تحكم القائمة عن طريق تعيين الخاصية بقيمة العنصر. إذا كان أي عنصر في عنصر تحكم القائمة لا يحتوي على القيمة المحددة، فسيتم طرح System.ArgumentOutOfRangeException.
لكن الشيء الغريب هو أن مثل هذه المهمة لن تسوء في معظم الحالات، ولكنها قد تسوء في بعض الأحيان. لقد تحققت من تنفيذ SelectedValue من خلال التفكير ووجدت السبب.
سلسلة افتراضية عامة SelectedValue
{
يحصل
{
int num1 = this.SelectedIndex;
إذا (num1 >= 0)
{
إرجاع this.Items[num1].Value;
}
سلسلة العودة. فارغة؛
}
تعيين
{
إذا (this.Items.Count != 0)
{
إذا ((value == null) || (base.DesignMode && (value.Length == 0)))
{
this.ClearSelection();
يعود؛
}
ListItem item1 = this.Items.FindByValue(value);
إذا ((((this.Page != null) && this.Page.IsPostBack) && this._stateLoaded) && (item1 == null))
{
throw new ArgumentOutOfRangeException("value", SR.GetString("ListControl_SelectionOutOfRange", new object[] { this.ID, "SelectedValue" }));
}
إذا (العنصر 1! = فارغ)
{
this.ClearSelection();
item1.Selected = true;
}
}
this.cachedSelectedValue = value;
}
}
اتضح أن أخطاء التعيين تحدث فقط عندما تكون الصفحة IsPostBack.
وبالإضافة إلى ذلك، سيحدث استثناء إذا كتبت مثل هذا:
DropDownList1.Items.FindByValue("الصين").Selected = true;
أخيرًا وجدت طريقة لتحقيق المتطلبات المذكورة أعلاه:
DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("الصين"));
أي أنه إذا لم يتم العثور على العنصر المحدد من خلال FindByValue، فسيكون فارغًا، وسيرجع Items.IndexOf(null) -1
http://www.cnblogs.com/weizhuangzhi/archive/2006/12/13/591251.html