【问题标题】:How to copy items from one DropDownList to another如何将项目从一个 DropDownList 复制到另一个
【发布时间】:2010-04-19 13:46:08
【问题描述】:

如何将硬编码的项目从一个下拉框中复制到另一个下拉框中并保留键和值?

drpTypes.Items.Add(new ListItem("Tipos de Acções", "1"));
drpTypes.Items.Add(new ListItem("Tipos de Combustível", "2"));
drpTypes.Items.Add(new ListItem("Tipos de Condutor", "3"));

drpTypesCreateEdit.Items.AddRange(drpTypes.Items);

【问题讨论】:

    标签: c# asp.net drop-down-menu


    【解决方案1】:

    同意上面安东尼的评论。

    但是,由于选定的 ListItems 仍将引用原始 DropDownList 的相同对象,因此在更改字段/属性时会产生意想不到的副作用。

    例如:

    drpTypes.Items.Add(new ListItem("Tipos de Acções", "1"));
    drpTypes.Items.Add(new ListItem("Tipos de Combustível", "2"));
    drpTypes.Items.Add(new ListItem("Tipos de Condutor", "3"));
    
    drpTypesCreateEdit.Items.AddRange(drpTypes.Items);
    
    drpTypes.SelectedValue = "2";
    drpTypesCreateEdit.SelectedValue = "3";
    

    drpTypes 和 drpTypesCreateEdit 现在的 SelectedValue 均为“3”,而这显然不是上述代码的意图。

    实例化新的 ListItem 对象而不是仅选择原始对象将解决此问题:

    drpTypesCreateEdit.Items.AddRange(drpTypes.Items.Cast<ListItem>().Select(x => New ListItem(x.Text, x.SelectedValue)).ToArray();
    

    【讨论】:

      【解决方案2】:

      AddRange 需要一个 ListItems 数组。你可以这样做(C# 3+)。

      drpTypesCreateEdit.Items.AddRange(drpTypes.Items.OfType<ListItem>().ToArray()); 
      

      【讨论】:

      • 我在 Items 中没有那个方法 :(
      • 您使用的是什么版本的 .NET?如果 3.5+,为 System.Linq 添加 using 语句。如果是 2.0,您可以简单地选择迭代第一个列表中的项目并将它们一个接一个地添加到第二个。
      • 这不会使同一个 ListIem 对象在多个 DropDownList 之间共享吗?在某些情况下,哪些可能会导致冲突?
      • 是的,这会发生。我在下面的帖子中添加了这个。
      【解决方案3】:

      我无法在 VB.NET 中解决这个问题,我花了一段时间才找到这个答案。 Duplicating DropDownListItems Without Looping

      DropDownList2.DataSource = DropDownList1.Items
      DropDownList2.DataTextField = "Text"
      DropDownList2.DataValueField = "Value"
      DropDownList2.DataBind()
      

      这将在两个下拉列表之间进行深层复制。

      也许管理员可以删除此答案并将这两个问题联系在一起。

      【讨论】:

        【解决方案4】:

        这将是更简单的方法之一..

        drpTypes.Items.Add(new ListItem("Tipos de Acções", "1"));
        drpTypes.Items.Add(new ListItem("Tipos de Combustível", "2"));
        drpTypes.Items.Add(new ListItem("Tipos de Condutor", "3"));
        
        foreach(ListItem li in drpTypes.Items)
        {
            drpTypesCreateEdit.Items.Add(li);
        }
        

        你需要更详细的吗?

        【讨论】:

        • 谢谢,但不是我想要的
        【解决方案5】:
        This is also good for copying DropDownList items to another.
        

        示例: 它会将所有项目从 DropDownList1 复制到 DropDownList2。

        DropDownList1 中的项目:

        <asp:DropDownList ID="DropDownList1" runat="server">
            <asp:ListItem Text="A" Value="1"></asp:ListItem>
            <asp:ListItem Text="B" Value="2"></asp:ListItem>
            <asp:ListItem Text="C" Value="3"></asp:ListItem>
            <asp:ListItem Text="D" Value="4"></asp:ListItem>
            <asp:ListItem Text="E" Value="5"></asp:ListItem>
        </asp:DropDownList>
        

        1-先将DropDownList1复制到Array中。

        ListItem[] ListitemsArray = new ListItem[DropDownList1.Items.Count];
        DropDownList1.Items.CopyTo(ListitemsArray, 0);
        

        2-:现在从 Array 复制到 DropDownList2。

                    foreach (ListItem liItems in ListitemsArray)
                    {
                        DropDownList2.Items.Add(liItems);
                    }
        

        这对我有用!!!!!!!!!!!!!

        【讨论】:

          【解决方案6】:

          我是这样做的,直接从一个下拉菜单到另一个下拉菜单,无需先复制到数组。

            foreach(ListItem listItem in myDropDownList.Items)
              {
                 myOtherDropDownList.Items.Add(listItem)
              }
          

          【讨论】:

            【解决方案7】:

            我是这样用的

            comboBox2.Items.AddRange(comboBox3.Items.OfType<string>().ToArray());
            

            【讨论】:

            • 添加具有更多解释和代码的通用解决方案。这个答案很好,对你有用,但为了回答这个问题,你必须将它命名为非特定于你的代码或场景的通用变量名称和解释。
            【解决方案8】:

            在VB中我用过

            Dim cb As CheckBoxList=new CheckBoxList()
            cb.Items.AddRange(CheckBoxList_Source.Items.Cast(Of ListItem)().Select(Function(f) New ListItem(f.Text, f.Value)).ToArray())
            

            Dim cb As CheckBoxList=new CheckBoxList()
            cb.DataSource = CheckBoxList_Source.Items
            cb.DataBind()
            

            但是这会将 Value 与 Text 绑定,而不是原始 Items 的真实值

            这些是我发现克隆元素的唯一方法

            【讨论】:

              猜你喜欢
              • 2013-01-04
              • 1970-01-01
              • 1970-01-01
              • 2013-12-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-12-16
              • 1970-01-01
              相关资源
              最近更新 更多