c#.NET ListBox 具有动态数据和多选问题
我试图从其中包含多选和动态 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++;
}
}
}
Im trying to get values from a ListBox
that has multiselection and dynamic ListItems in it. My problem is that I can't get the values once I press my "assign" button.
The idea is that I have like 10-15 listitems and they should be assigned with values. And I want to be able to select like 5 of them and press my assign button and then continue to assign other values to these items left in the list.
For som reason my ListBox.Item.Count
always returns like 1 row.
Question: Is there something you need to think about when using ListBox
in .NET 4.0 that isn't obvious?
Parts of the code
Front:
<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>
The codebehind:
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++;
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
像这样的东西吗?
ASPX页面
代码隐藏
Something like this?
ASPX page
Code Behind
一方面,这似乎是错误的:
删除项目时不要增加 i ,否则会跳过项目。
当然,这只会隐藏下一个选定的项目......
for one thing this seems wrong:
Don't increment i when you remove an item or you'll skip items.
Of course, that only hides the very next selected item...