【问题标题】:.DataSource outputs a duplicate list?.DataSource 输出重复列表?
【发布时间】:2013-02-07 16:48:36
【问题描述】:

当用户从下拉列表中选择一个值并单击按钮时,该值将添加到第二个列表(也显示在屏幕上)。

问题是当用户单击按钮时,所选值被添加到第二个列表中,但是下拉列表被复制并添加到原始下拉列表中。

所以我们在原始下拉列表中有 1、2、3,用户选择“1”并按下按钮。 '1' 被添加到第二个列表并显示在屏幕上,但是当用户单击下拉列表时,它现在包含 2、3、1、2、3

我用断点检查了我的代码,我认为它与 .dataSource 有关。

protected void UpdatePage()
{
   int Id = System.Convert.ToInt32(Id.Value);

   List<Contractor> allContractors = new List<Contractor>();
   ClarkeDBDataContext db = new ClarkeDBDataContext();

   allSubContractors = (from BoqContractors in db.BOQ_Contractors
                        where BoqContractors.Bill_Of_Quantity_id == tempBoqId
                        select BoqContractors.Contractor).ToList();

   repeaterShowContractorName.DataSource = allContractors;
   repeaterShowContractorName.DataBind();

   IEnumerable<Sub> availableContractors = 
       (from sc in db.Contractors
        select sc).ToList().Except(allContractors);

    //i've tried to set it to null to test it, but to no avail
    DropDownListContractors.DataSource = null;
    DropDownListContractors.DataSource = availableContractors;
    DropDownListContractors.DataBind();
 }

【问题讨论】:

    标签: asp.net datasource


    【解决方案1】:

    由于 ViewState 和 Postback,ddl 中存在原始值。 ddl 在回发时重新填充。这就是原始值存在的原因。

    我不确定在这个用例中为什么需要从数据库中重新获取数据。如果你确实需要 从数据库刷新列表,只需在设置DataSource 之前调用DropDownListContractors.Clear()。这将清除列表。

    但是,就像我之前所说的,我认为您不需要从 db 重新绑定 ddl。只需从您的代码中删除这些行(回发时),它应该可以按您的意愿工作:

       IEnumerable<Sub> availableContractors = 
           (from sc in db.Contractors
            select sc).ToList().Except(allContractors);
    
        //i've tried to set it to null to test it, but to no avail
        DropDownListContractors.DataSource = null;
        DropDownListContractors.DataSource = availableContractors;
        DropDownListContractors.DataBind();
    

    【讨论】:

      【解决方案2】:

      在 VB 方面,DropDownListContractors.ClearSelection() 是不够的,如果您没有选择数据,在我的情况下,我没有任何数据,但仍需要清除列表中的数据。

      如果我只使用 DropDownListContractors.Items.Clear(),它将清除我的列表中已有的数据,并在我的 aspx 页面中设置。 (有时我需要保留一两行以及数据绑定数据)。

      我发现的唯一解决方法是在页面加载中添加一个条件,无论页面是否已经从我们的数据库中获取了源。该数据不太可能改变。:

      If Not Page.IsPostBack Then
        'myComboBox.Items.Clear() 
        'Can't use this, i got one or two items i gotta keep from the aspx page
        'myComboBox.DataSource = Nothing 
        'DOESNT WORK
        myComboBox.DataSource = someSource
        myComboBox.DataBind()
      End If
      

      如果我支持你的情况,我只需调用 items.clear() 并在后面的 .vb 代码中手动添加我需要的项目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        相关资源
        最近更新 更多