列表框中的第一项始终被读取而不是列表框

时间:2016-04-16 05:28:33

标签: c# asp.net webforms listbox viewstate

让我再试一次......我在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(列表框中突出显示的条目)。请看下面这张图片:

Code snippets with debugging data and "Existing Products:" lst_Products listbox

我是否误解了SelectedIndex部分代码的目的?我认为这是想要阅读突出显示的项目。如果没有,我该怎么做才能阅读列表框中的选定(突出显示)项目?

以下是我的代码的一小部分,其中包含用于比较的调试数据:

Smaller code snippet with debugging data embedded

具体来说,我在列表框中鼠标选择索引1以突出显示它,然后点击删除按钮,但索引0将被删除。

所以我的问题是:

  1. 为什么索引0“selected = true”尽管我在列表框中突出显示索引1?
  2. 如何选择索引1(或索引0除外),以便我的删除例程将其删除以删除它?我正在尝试根据索引从列表框中派生文本字符串。
  3. 是否有更合适的代码来执行相同的操作?
  4. 感谢您的帮助。

3 个答案:

答案 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 })

如果我刚开始使用字典并以相同的方式创建唯一键,则可能可以避免这种情况,但是那样的话我就不会结束了。