【问题标题】:Listbox items not getting moved to other list box in asp,net列表框项目没有移动到asp,net中的其他列表框
【发布时间】:2025-11-25 03:40:01
【问题描述】:

我有两个列表框,其中一个是源,另一个是目标。

我想在按钮点击事件后将选中的项目转移到目标列表框。

我在互联网上搜索并找到了来自here 的样本。但就我而言,它不起作用。

我的 ASP 源文件是:

<asp:Table ID="tbvl" Width="100%" runat="server">
    <asp:TableRow>
        <asp:TableCell Width="45%">
            <asp:ListBox ID="lstsource" CssClass="uppercase" runat="server" Width="100%"  Height="140" SelectionMode="Multiple"></asp:ListBox>
        </asp:TableCell>
        <asp:TableCell Width="10%" HorizontalAlign="Center" Height="100%">
            <asp:Table ID="Table1" runat="server" Height="100%">
                  <asp:TableRow>
                        <asp:TableCell Height="25%"><asp:Button ID="btnsd" CssClass="button" runat="server"  Text=">>" Width="40" /></asp:TableCell>
                  </asp:TableRow>
                  <asp:TableRow>
                        <asp:TableCell Height="25%"><asp:Button ID="btnds" runat="server" CssClass="button" Text="<<" Width="40" /></asp:TableCell>
                  </asp:TableRow>
                  <asp:TableRow>
                        <asp:TableCell Height="25%"><asp:Button ID="btnallsd" runat="server" CssClass="button" Text=">" Width="40" /></asp:TableCell>
                  </asp:TableRow>
                  <asp:TableRow>
                        <asp:TableCell Height="25%"><asp:Button ID="btnallds" runat="server" CssClass="button" Text="<" Width="40" /></asp:TableCell>
                  </asp:TableRow>
              </asp:Table>
          </asp:TableCell>
          <asp:TableCell Width="50%">
               <asp:ListBox ID="lstdestination" runat="server" CssClass="uppercase" Width="100%" Height="140" SelectionMode="Multiple"></asp:ListBox>                            
          </asp:TableCell>
       </asp:TableRow>

</asp:Table>

而我的Click() 事件是;

void btnallsd_Click(object sender, EventArgs e)
{
    for (int i = lstsource.Items.Count - 1; i >= 0; i--)
    {
        if (lstsource.Items[i].Selected)
        {
            lstdestination.Items.Add(lstsource.Items[i]);
            lstdestination.ClearSelection();
            lstsource.Items.Remove(lstsource.Items[i]);
        }
    }
}

当我单击按钮时,页面只会刷新,但项目并未添加到目标列表框中。

我应该怎么做才能得到正确的输出。

请帮忙。

【问题讨论】:

  • 当页面被刷新时,两个列表框也会被刷新并且回发的原因会出现这个问题。首先确保这一点。
  • 我应该做些什么改变..?你能指定@harhar
  • 可以使用ajax更新面板控件。

标签: c# asp.net listboxitems aspbutton


【解决方案1】:

您必须首先确保ListBoxes 在回发时没有数据绑定。否则,您将始终使用它们的默认项填充它们,并且它们将再次被取消选择。

所以使用IsPostBack 属性,例如:

protected void Page_Load(Object sendeer, EventArgs e)
{
    if(!IsPostBack)
    {
        DataBindListBoxes();
    }
}

您还必须使按钮单击事件处理程序至少受到保护,并将事件处理程序添加到 aspx 标记中(或在代码隐藏中以编程方式):

代码隐藏:

protected void btnallsd_Click(object sender, EventArgs e){//...}

aspx:

<asp:Button ID="btnallsd" OnClick="btnallsd_Click" ....

要查找所选项目,您也可以使用 Linq:

protected void btnallsd_Click(object sender, EventArgs e)
{
    var selected = lstsource.Items.Cast<ListItem>()
                   .Where(li => li.Selected);
    while (selected.Any())
    {
        var item = selected.First();
        lstdestination.Items.Add(item);
        lstsource.Items.Remove(item);
    }
    lstdestination.ClearSelection();
}

【讨论】:

    【解决方案2】:

    嗯,试试这个:

     private void MoveListBoxItems(ListBox source, ListBox destination)
                {        
                    ListBox.SelectedObjectCollection sourceItems = source.SelectedItems;
                    foreach (var item in sourceItems)
                    {
                        destination.Items.Add(item);
                    }
                    while (source.SelectedItems.Count > 0)
                    {
                        source.Items.Remove(source.SelectedItems[0]);
                    }
                }
    

    使用:在您从 1 移动到 2 按钮的点击事件上:

    MoveListBoxItems(listBox1, listBox2);
    

    【讨论】:

      【解决方案3】:

      试试这个

      protected void moveRight_Click(object sender, EventArgs e)
         {
         for (int i = 0; i < lbFirst.Items.Count; i++)
         {
         if (lbFirst.Items[i].Selected)
         {
         lbSecond.Items.Add(lbFirst.Items[i]);
         lbFirst.Items.Remove(lbFirst.Items[i]);
         }
         }
         }
      

      【讨论】: