带有动态数据和多选问题的c#.NET ListBox

本文关键字:问题 NET ListBox 动态 数据 | 更新日期: 2023-09-27 17:58:30

我试图从一个包含多选和动态ListItems的ListBox中获取值。我的问题是,一旦按下"分配"按钮,我就无法获取值。

我的想法是,我有10-15个列表项,应该为它们分配值。我希望能够选择其中的5个,然后按下我的分配按钮,然后继续为列表中剩下的这些项目分配其他值。

出于某种原因,我的ListBox.Item.Count总是像1行一样返回。

问题:在.NET 4.0中使用ListBox时,是否需要考虑一些不明显的问题

部分代码

正面:

 <fieldset>
    <legend>
       <asp:Label ID="Label1" runat="server" 
            Text="<%$ Resources:lang, ExtensionsTitleAB %>"></asp:Label>
    </legend>
    <div class="extLeft"> 
       <table>
          <tr>
             <td>
                <asp:Label ID="Label5" runat="server" 
                     Text="<%$ Resources:lang, ExtensionsTmNumber %>"></asp:Label>
             </td>
             <td>
                <asp:TextBox runat="server" ID="txtTmNumber"></asp:TextBox>
             </td>
          </tr>
          <tr>
             <td>
                <asp:Label ID="Label6" runat="server"
                     Text="<%$ Resources:lang, ExtensionsTmName %>"></asp:Label>
             </td>
             <td>
                <asp:TextBox runat="server" ID="txtTmName"></asp:TextBox>
              </td>
           </tr>
           <tr>
              <td>
                 <asp:Label ID="Label7" runat="server"
                      Text="<%$ Resources:lang, ExtensionsTmRegistered %>">
                 </asp:Label>
              </td>
              <td>
                 <asp:TextBox runat="server" ID="txtTmRegistered"></asp:TextBox>
              </td>
           </tr>
           <tr>
              <td>
                 <asp:Label ID="Label8" runat="server" 
                      Text="<%$ Resources:lang, ExtensionsTmLocality %>">
                 </asp:Label>
              </td>
              <td>
                 <asp:TextBox runat="server" ID="txtTmLocality"></asp:TextBox>
              </td>
           </tr>
           <tr>
              <td>
                 <asp:Label ID="Label9" runat="server" 
                      Text="<%$ Resources:lang, ExtensionsMemberShipId %>">
                 </asp:Label>
              </td>
              <td>
                 <asp:TextBox runat="server" ID="txtMembershipIdFaseOne">
                 </asp:TextBox>
              </td>
           </tr>
        </table>
     </div>
     <div class="extMiddle">            
        <asp:Button runat="server" ID="btnAssignAB" OnClick="btnAssign_Click"
                    Text="<%$ Resources:lang, ButtonAssignExtensions %>" /> 
     </div>
     <div class="extRight">
        <p><asp:Label ID="Label4" runat="server" 
                Text="<%$ Resources:lang, ExtensionsListHelp %>">
           </asp:Label>
        </p>
        <asp:ListBox runat="server" ID="listABContainer" 
                     SelectionMode="Multiple" AutoPostBack="false">
        </asp:ListBox>
     </div>
  </fieldset>    

代码隐藏:

public partial class extensions : System.Web.UI.Page
    {
        private model.OrderHandling orderHandling;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["dataobject"] != null)
            {
                orderHandling = (OrderHandling)Session["dataobject"];
            }
            else
            {
                String url = "http://" + Request.Url.Authority + "/Default.aspx";
                Response.Redirect(url);
            }
            if (!IsPostBack)
            {
                addListItems();
            }                    
        }
        private void addListItems()
        {
            foreach (OrderLine line in orderHandling.order.getOrderLines())
            {
                if (line.price.getPriceType().Equals(Price_Types.SUNRISE_ONE) 
                  || line.price.getPriceType().Equals(Price_Types.SUNRISE_TWO))
                {
                    listABContainer.Items.Add(
                      new ListItem(line.domain.domainName, line.domain.domainName));
                    System.Diagnostics.Debug.WriteLine("added a domain " + 
                       "to list listABContainer : " + line.domain.domainName);
                }
                else if (line.price.getPriceType().Equals(Price_Types.LANDRUSH)
                        || line.price.getPriceType().Equals(Price_Types.GENERAL))
                {
                    listCDContainer.Items.Add(
                       new ListItem(line.domain.domainName, line.domain.domainName));
                    System.Diagnostics.Debug.WriteLine("added a domain " +
                       "to list listCDContainer : " + line.domain.domainName);
                }
            }            
        }
        protected void btnAssign_Click(object sender, EventArgs e)
        {                
                assignTMExtensions(); 
        }
        private bool assignTMExtensions()
        {
            bool success = true;
            TradeMarkExtension tmExt = new TradeMarkExtension();
            String errorMsg = "";
            if (!String.IsNullOrEmpty(txtTmNumber.Text) 
                  && 
               tmExt.isValid(EXTENSION_KEYS.TM_NUMBER, txtTmNumber.Text, null))
            {
                tmExt.setExtension(EXTENSION_KEYS.TM_NUMBER, txtTmNumber.Text);
            }               
            if (success)
            {
                System.Diagnostics.Debug.WriteLine("Succes: time for domainExtension, listCount : " + listABContainer.Items.Count);
                foreach (ListItem list in listABContainer.Items)
                {
                    if (list.Selected)
                    {
                        System.Diagnostics.Debug.WriteLine("Found a selected item " + list.Value);
                        try
                        {
                            OrderLine ol = orderHandling.order.getOrderLine(list.Value);
                            ol.domain.addExtension(tmExt);
                            System.Diagnostics.Debug.WriteLine("Addedd domainExtension");
                        }
                        catch (Exception e)
                        {
                            System.Diagnostics.Debug.WriteLine("FAILED domainExtension");
                            showError.Text = "An exception has occured. Please reload the page and try again.";
                            return false;
                        }
                    }
                }
                Session["dataobject"] = orderHandling;
                removeListItems(listABContainer);
            }
            else
            {
                showError.Text = errorMsg;
            }
            return success;
        }
        private void removeListItems(ListBox list)
        {
            int i = 0;
            while(i < list.Items.Count)
            {
                if (list.Items[i].Selected)
                {
                    list.Items.RemoveAt(i);
                }
                i++;
            }
        }
    }

带有动态数据和多选问题的c#.NET ListBox

类似的东西?

ASPX页面

<asp:ListBox ID="ListBox1" runat="server" SelectionMode="Multiple" AutoPostBack="false" />
<asp:Button ID="ButtonSubmit" runat="server" Text="Submit" OnClick="ButtonSubmit_Click" />

背后的代码

   protected void Page_Load(object sender, EventArgs e)
   {
      if (!IsPostBack)
      {
         DataBindListBox();
      }
   }
   protected void ButtonSubmit_Click(object sender, EventArgs e)
   {
      List<ListItem> selectedItems1 = ListBox1.Items.Cast<ListItem>().Where(li => li.Selected).ToList();
      // or
      string[] selectedItems2 = (Request.Form[ListBox1.UniqueID] ?? string.Empty).Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
   }
   private void DataBindListBox()
   {
      var data = Enumerable.Range(1, 5).Select(i => new { Text = i.ToString(), Value = i.ToString() }).ToList();
      ListBox1.DataSource     = data;
      ListBox1.DataTextField  = "Text";
      ListBox1.DataValueField = "Value";
      ListBox1.DataBind();
   }

有一点似乎是错误的:

private void removeListItems(ListBox list)
{
    int i = 0;
    while(i < list.Items.Count)
    {
        if (list.Items[i].Selected)
        {
            list.Items.RemoveAt(i);
        }
        i++;
    }
}

删除项目时不要增加i,否则会跳过项目。

当然,这只会隐藏下一个选定的项目。。。