【发布时间】:2016-08-08 05:07:05
【问题描述】:
让我在这里再试一次...我在 ASP.NET 网络表单中的删除功能:
//delete a product from the product list
protected void btn_Del_Click(object sender, EventArgs e)
{
int index = lst_Products.SelectedIndex; //<=== this is the code that gets me stumped.
//index keeps returning 0 (zero) whether postback or not
//Store product cID and FullLine for LINQ compare
string pFullLine = lst_Products.Items[index].ToString();
int cID = Convert.ToInt32(lst_Products.Items[index].Value);
// Read ViewState
List<Product> allProducts = (List<Product>)ViewState["products"];
List<Product> productsfiltered = allProducts
.Where(product => product.CategoryId == cID && product.FullLine == pFullLine).ToList();
foreach (Product prodToDelete in productsfiltered)
{
//delete it. Most of the time this would only be one item, but more than one entry is possible.
allProducts.Remove(prodToDelete);
}
//store modified product list
ViewState["products"] = allProducts;
//lst_Products.DataBind();
//BindProdData();
//display products
ShowProd();
//show cat ID in Product ID textbox (product ID always = Category ID)
txt_ProdID.Text = cID.ToString();
}
代码中的箭头显示了问题发生的位置:lst_Products.SelectedIndex 给出了错误的索引值,指向列表框中显示的第一项,lst_Products,它指向索引 0 而不是索引 1(在列表框)。看看下面这张图片:
我是否误解了代码中SelectedIndex 部分的用途?我认为它应该阅读突出显示的项目。如果没有,我该怎么做才能阅读列表框中选定的(突出显示的)项目?
下面是我的代码的一小部分,带有调试数据以供比较:
具体来说,我在列表框中用鼠标选择索引 1 以突出显示它,然后点击删除按钮,但索引 0 被删除了。
所以我的问题是:
- 尽管我在列表框中突出显示了索引 1,但为什么索引 0 “selected=true”?
- 如何选择索引 1(或索引 0 以外的索引),以便我的删除例程阻止它删除它?我正在尝试根据索引从列表框中导出文本字符串。
- 是否有更合适的代码来做同样的事情?
感谢您的帮助。
【问题讨论】:
-
如何在列表框中添加项目?是数据源吗?或手动添加 listbox.items.add("some data"); 之类的项目
-
你在 lst_Products.SelectedValue 中得到正确的值吗?
-
@CST 来自 ViewState。这部分代码也可以工作。
-
可以分享listbox的aspx代码
-
(愚蠢地阻止了我的回答。)基于对具有类似功能的不同解决方案代码的测试,我得出的结论是
SelectedItem.Text或SelectedValue确实不 表示列表框上显示的突出显示的条目。它只是表示列表中第一个遇到的具有所选值的条目,无论它是否突出显示。因此,数据结构必须为每个创建的条目包含一个唯一的 ID。这保证了正确的条目将被删除。
标签: c# asp.net webforms listbox viewstate