带有动态数据和多选问题的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++;
}
}
}
类似的东西?
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,否则会跳过项目。
当然,这只会隐藏下一个选定的项目。。。