让我再试一次......我在ASP.NET webform中的删除功能:
//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将被删除。
所以我的问题是:
感谢您的帮助。
答案 0 :(得分:0)
您是否尝试过关注?
{% extends 'base.html.twig' %}
{% set list = '' %} {# HERE I SET A GLOBAL VAR #}
{% block body %}
<section>
<h2>{% trans %}MODULES{% endtrans %}</h2>
{% for m in plan.Modules %}
{{- block('module') -}}
{{ list }} {# HERE JUST FOR TESTING - IT'S EMPTY #}
{% endfor %}
</section>
{{ list }} {# HERE I WANT IT DISPLAYED, YET IT'S EMPTY :( #}
{% endblock %}
{% block module %}
<h3>{{ m.Module.title }}</h3>
{# HERE SOME MODULE TEXT I GET FROM COMPLICATED RELATIONS #}
{% if m.Module.list %}
{% set temp %}
{{ m.Module.shortTitle }}<br/>
{% endset %}
{% set list = list~temp %}
{% for l in m.Module.list %}
{% set temp %}
{{ l }}
{% endset %}
{% set list = list~temp %}
{% endif %}
{% endfor %}
{% endif %}
{{ list }} {# HERE IT'S WORKING #}
{% endblock %}
答案 1 :(得分:0)
我在Winform上的列表框遇到了同样的问题 - 列表中的第一项是自动选择的。我首先清除了选择列表(VB.NET代码):
lboxMembershipTypes.SelectedItems.Clear()
然后我根据我的数据集中选择的项目选择了列表框中的项目:
'check each row in the dataset
For Each MembershipROW In MyDataset.Tables(0).Rows
'select this membership type in the listbox
MembershipType = MembershipROW.Item("MembershipType")
MembershipIndex = lboxMembershipTypes.FindStringExact(MembershipType)
'is this membership in our list?
If (MembershipIndex <> ListBox.NoMatches) Then
'is this membership selected?
If (MembershipROW.Item("SelectMembership")) Then
'select this membership type
lboxMembershipTypes.SetSelected(MembershipIndex, True)
End If
End If
Next
我做了一个更通用的解决方案,而不仅仅是检查第一个项目是否被选中,如果没有,那么取消选择它 - 但是,这也可以。
答案 2 :(得分:0)
我知道这是一个旧线程。但是2.5年后,我遇到了同样的问题,而google运气不佳,发现这个线程的问题完全相同(甚至是调试示例)。
我通过使重复的listitem值变得唯一来解决此问题。我将这个列表框数据绑定到了一个有重复项的namevaluecollection来的linq var(是的,我不想使用字典,因为我想按部门将成员分组,并希望将部门作为键)。
这就是我为数据源所做的操作并遇到了问题:
var members = nvc_members.AllKeys.SelectMany(nvc_members.GetValues, (k, v) => new { key = k, value = v })
然后我将键分配给值,并将值分配给数据列表中的文本。
此更改使我在列表框中做出了唯一的设置:
var members = nvc_members.AllKeys.SelectMany(nvc_members.GetValues, (k, v) => new { key = k+"-"+v, value = v })
如果我刚开始使用字典并以相同的方式创建唯一键,则可能可以避免这种情况,但是那样的话我就不会结束了。