FineUI 官方论坛

标题: 【已确认+代码贡献勋章】DropDownList一个令人困惑的BUG [打印本页]

作者: Gnid    时间: 2014-8-2 15:14
标题: 【已确认+代码贡献勋章】DropDownList一个令人困惑的BUG
这个BUG是有关两个DropDownList互动产生的问题,请看前台页面代码,很简单,一个Form,两行FormRow,各有一个DropDownList,一个是商品类别,一个商品名称,如下:
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="EmptyProjectNet40_FineUI.Test" %>

  2. <!DOCTYPE html>

  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head runat="server">
  5.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6.     <title></title>
  7. </head>
  8. <body>
  9.     <form id="form1" runat="server">
  10.         <f:PageManager ID="PageManager1" runat="server" />
  11.         <f:Form ID="Form2" runat="server" ShowBorder="false" ShowHeader="false" Width="200px">
  12.             <Rows>
  13.                 <f:FormRow ID="FormRow1" runat="server">
  14.                     <Items>
  15.                         <f:DropDownList ID="ddlLB" runat="server" Label="商品类别" AutoPostBack="true" OnSelectedIndexChanged="ddlLB_SelectedIndexChanged"></f:DropDownList>
  16.                     </Items>
  17.                 </f:FormRow>
  18.                 <f:FormRow ID="FormRow2" runat="server">
  19.                     <Items>
  20.                         <f:DropDownList ID="ddlSP" runat="server" Label="商品名称"></f:DropDownList>
  21.                     </Items>
  22.                 </f:FormRow>
  23.             </Rows>
  24.         </f:Form>
  25.     </form>
  26. </body>
  27. </html>
复制代码
后台代码也很简单,定义了一个公用类SP,有4个属性:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using FineUI;

  5. namespace EmptyProjectNet40_FineUI
  6. {
  7.     public class SP
  8.     {
  9.         public int SPID { get; set; }       //商品ID
  10.         public string SPLB { get; set; }        //商品类别
  11.         public int SPSL { get; set; }        //商品数量
  12.         public string SPMC { get; set; }        //商品名称
  13.     }

  14.     public partial class Test : System.Web.UI.Page
  15.     {
  16.         protected void Page_Load(object sender, EventArgs e)
  17.         {
  18.             if (!IsPostBack)
  19.             {
  20.                 FillSPLB();
  21.                 FillSPMC();
  22.             }

  23.         }

  24.         private List<SP> GetListSP()
  25.         {
  26.             List<SP> list = new List<SP>();

  27.             list.Add(new SP { SPID = 1, SPLB = "蔬菜", SPMC = "白菜", SPSL = 10 });
  28.             list.Add(new SP { SPID = 2, SPLB = "蔬菜", SPMC = "青菜", SPSL = 20 });
  29.             list.Add(new SP { SPID = 3, SPLB = "蔬菜", SPMC = "萝卜", SPSL = 30 });
  30.             list.Add(new SP { SPID = 4, SPLB = "蔬菜", SPMC = "青椒", SPSL = 40 });
  31.             list.Add(new SP { SPID = 5, SPLB = "蔬菜", SPMC = "黄瓜", SPSL = 50 });

  32.             list.Add(new SP { SPID = 6, SPLB = "水果", SPMC = "苹果", SPSL = 10 });
  33.             list.Add(new SP { SPID = 7, SPLB = "水果", SPMC = "香蕉", SPSL = 20 });
  34.             list.Add(new SP { SPID = 8, SPLB = "水果", SPMC = "梨子", SPSL = 30 });
  35.             list.Add(new SP { SPID = 9, SPLB = "水果", SPMC = "桃子", SPSL = 40 });
  36.             list.Add(new SP { SPID = 10, SPLB = "水果", SPMC = "杨梅", SPSL = 50 });

  37.             return list;
  38.         }

  39.         private void FillSPLB()
  40.         {
  41.             var linq = GetListSP().Select(t => t.SPLB).Distinct();

  42.             ddlLB.Items.Clear();
  43.             foreach (var item in linq)
  44.             {
  45.                 ddlLB.Items.Add(new ListItem(item.ToString(), item.ToString()));
  46.             }
  47.         }

  48.         private void FillSPMC()
  49.         {
  50.             string _SPLB = this.ddlLB.SelectedValue;

  51.             List<SP> list = GetListSP().Where(t => t.SPLB == _SPLB).ToList<SP>();

  52.             this.ddlSP.Items.Clear();
  53.             foreach (SP sp in list)
  54.             {
  55.                 //这样添加就出现问题
  56.                 ddlSP.Items.Add(new ListItem(sp.SPMC, sp.SPSL.ToString()));

  57.                 //这样添加就没有问题
  58.                 //ddlSP.Items.Add(new ListItem(sp.SPMC, sp.ID.ToString()));
  59.             }
  60. ddlSP.SelectedIndex = 0;
  61.         }

  62.         protected void ddlLB_SelectedIndexChanged(object sender, EventArgs e)
  63.         {
  64.             FillSPMC();
  65.             Alert.ShowInTop(ddlSP.SelectedItem.Text);
  66.         }
  67.     }
  68. }
复制代码

问题来了,如果这样添加商品名称项:ddlSP.Items.Add(new ListItem(sp.SPMC, sp.SPSL.ToString()));
注意,这里的商品数量SPSL在原始的list中不同实例有重复,即有数量均为10的商品,则会发生如下情况
页面首次打开,如下图:
[attach]6119[/attach]

点击商品类别,选择“水果”,正常情况下,应该是商品名称DropDownList所有项目清空,并添加了全部商品类别为“水果”的商品,同时由于我默认选中了第一个,则应该会弹出对话框并显示“苹果”,问题是,为什么商品名称第一个显示是“白菜”,但是弹出对话框是“苹果”呢?如下图:
[attach]6120[/attach]

我们改变策略,默认选中第二个商品名称,即FillSPMC()中最后一行改成ddlSPMC.SelectedIndex=1;结果...依然不行,如下图:
[attach]6121[/attach]

我们再改变策略,页面加载后,先手工选择第二个商品名称,然后再选择商品类别“水果”,OYeah,终于正确了,如下图:
[attach]6122[/attach]


我已经用空项目重现了BUG,三石兄请帮忙看看,Test.aspx是用FINEUI做的,有问题;Test2.aspx是用ASP.NET原生控件做的,木有问题。
[attach]6123[/attach]




作者: sanshi    时间: 2014-8-2 18:48
多谢指出,这是一个隐藏的BUG,已经修正并Checkin:

-修正下拉列表在数据重新加载后没有更新选中值的问题(Gnid-6018)。

你由此获得“代码贡献勋章”!
作者: Gnid    时间: 2014-8-2 20:44
目前我暂时的解决办法是,加载这类列表的时候,用ID等全表唯一的值,貌似不会发生错误。
作者: zhouyou    时间: 2014-9-13 22:24
我也遇到了这个问题,更新版本就可以解决吗
作者: Gnid    时间: 2014-9-14 22:07
4.1.2版解决了这个BUG.




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