FineUI 官方论坛

标题: 下拉列表DropDownList的FindByValue方法失效修正。 [打印本页]

作者: Moongg    时间: 2014-2-20 13:48
标题: 下拉列表DropDownList的FindByValue方法失效修正。
这几天在做控件的反射,用到 DropDownList1.Items.FindByText 和 DropDownList1.Items.FindByValue,反觉是无效的,以下为修复过程。


请三石确认一下是否为bug。如是,请修正。


ASPX页面

  1. <x:DropDownList ID="DropDownList1" runat="server" Label="Label">
  2.             <x:ListItem Text="请选择" Value="0" />
  3.             <x:ListItem Text="男" Value="男" />
  4.             <x:ListItem Text="女" Value="女" />
  5.         </x:DropDownList>
复制代码

cs 页面
  1. //DropDownList1.SelectedValue = "男"; // OK
  2.                 //DropDownList1.SelectedIndex = 1; // OK

  3.                 DropDownList1.Items.FindByText("男").Selected = true; // 失败
  4.                 DropDownList1.Items.FindByValue("男").Selected = true; // 失败
复制代码
定位到 DropDownList1.SelectedValue ,同样调用了 FindByValue,
  1. set
  2.             {
  3.                 foreach (ListItem item2 in Items)
  4.                 {
  5.                     item2.Selected = false;  //注意这里的循环
  6.                 }

  7.                 if (value != null)
  8.                 {
  9.                     ListItem item = Items.FindByValue(value);
  10.                     if (item != null)
  11.                     {
  12.                         item.Selected = true;
  13.                     }
  14.                 }
  15.             }
复制代码

定位到 DropDownList1.Items.FindByValue
  1. public ListItem FindByValue(string value)
  2.         {
  3.             IEnumerator enumerator = GetEnumerator();

  4.             while (enumerator.MoveNext())
  5.             {
  6.                 ListItem item = enumerator.Current as ListItem;

  7.                 if (item != null && item.Value == value)
  8.                 {
  9.                     return item;
  10.                 }
  11.             }

  12.             return null;
  13.         }
复制代码

区别在于 DropDownList1.SelectedValue 有这个循环
foreach (ListItem item2 in Items)
{
     item2.Selected = false;
}


于是改造:在 DropDownList1.Items.FindByValue 的循环中加入
item.Selected = false;变成
  1. while (enumerator.MoveNext())
  2.             {
  3.                 ListItem item = enumerator.Current as ListItem;

  4.                 item.Selected = false;

  5.                 if (item != null && item.Value == value)
  6.                 {
  7.                     return item;
  8.                 }
  9.             }
复制代码
DropDownList1.SelectedValue 的循环可以注释掉,然后测试:
  1. //DropDownList1.SelectedValue = "男"; // OK
  2. //DropDownList1.SelectedIndex = 1; // OK

  3. DropDownList1.Items.FindByValue("男").Selected = true; // 正常,同理设置以下:
复制代码
FineUI_v3.3.3_source_all\FineUI\WebControls\Field.TextField.DropDownList\ListItem\ListItemCollection.cs
1、FindByValue方法的的 while (enumerator.MoveNext()) 加入 item.Selected = false;

2、FineUI_v3.3.3_source_all\FineUI\WebControls\Field.TextField.DropDownList\DropDownList.cs 中的
public string SelectedValue 的set属性 注释:以下
//foreach (ListItem item2 in Items)
                //{
                //    item2.Selected = false;
                //}




报告完毕!!!!








欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/) Powered by Discuz! X3.4