多选列表框 - 方法似乎不起作用

时间:2011-04-18 14:23:32

标签: c# asp.net listbox

我正在使用C#2.0 - VS 2005最新SP。

问题是即使ListBox SelectionMode设置为multiple,我也无法从UserGroup框中捕获第二项。我附加了处理列表框的按钮。我已经包含了我试图解决此问题的两段代码。这在评论中有所体现。

我将第一个选定项目设为true,但第二个选定项目为false。因此,所选值添加到Grp对象永远不会发生。

 <asp:ListBox ID="UserGroup" Rows="5" runat="server" SelectionMode="multiple" CssClass="txtbox"></asp:ListBox>

代码在这里:

  protected void MapStudentGroup_OnClick(object sender, EventArgs e)
    {
        ListBox lstGroup = this.FindControl("UserGroup") as ListBox;
        ListBox lstStudent = this.FindControl("lbStudent") as ListBox;
        List<Group> Grps = new List<Group>();

        if (lstGroup.SelectedIndex != -1 && lstStudent.SelectedIndex != -1)
        {
            UserGroup usrGrp = new UserGroup();
            usrGrp.Id = Convert.ToInt32(lstStudent.SelectedValue);
            // get selected groups....

            // 1st Method tried here: 
            foreach (ListItem itm in lstGroup.Items)
            {
                if (itm.Selected == true)
                {
                    Group grp = new Group();
                    grp.GroupId = Convert.ToInt32(itm.Value);
                    Grps.Add(grp);
                }
            }

            // 2nd method tried.
            for (int i = 0; i < lstGroup.Items.Count; ++i)
            {
                if (lstGroup.Items[i].Selected == true)
                {
                    Group grp = new Group();
                    grp.GroupId = Convert.ToInt32(lstGroup.Items[i].Value);
                    Grps.Add(grp);
                }
            }

            // 3rd attempt : multiple selected items still not seen - Firefox Issue? 
            List<ListItem> selectedItems = new List<ListItem>();
            int[] selectedItemsIndexes = lstGroup.GetSelectedIndices();
            foreach (int selectedItem in selectedItemsIndexes)
            {
                //selectedItems.Add(lstGroup.Items[selectedItem]);
                Group grp = new Group();
                grp.GroupId = Convert.ToInt32(lstGroup.Items[selectedItem].Value);
                Grps.Add(grp);
            }

            usrGrp.UserGroups = Grps;
            // update group-user mappings...
            usrGrp.UpdateUserGroups(usrGrp);
        }
    }

1 个答案:

答案 0 :(得分:1)

我实际上会通过以下方式简化事情:

    foreach (object itm in lstGroup.SelectedItems)
    {
         Group grp = new Group();
         grp.GroupId = Convert.ToInt32(itm);
         Grps.Add(grp);
    }

这样代码稍微清晰一些。测试这个,我能够让我的所有选择都显示出来。

由于您还没有真正提及有关调试的任何内容,如果上述解决方案对您不起作用,我会在foreach结束后立即设置断点并查看Grps的内容。如果Grps中包含适当数量的项目,则代码中的问题会进一步缩小。也许它在usrGrp.UpdateUserGroups()方法中。

我真的不明白为什么Grps中没有正确数量的项目,但如果没有,请告诉我们,我相信我们可以解决一些问题。

更新:我尝试了代码的精简版本。它适合我。测试一下,然后看看你是否可以重新构建它以完成你需要做的事情。

我已经定义了一个简单的列表来存储选择:

List<int> selectionList = new List<int>();

然后,我使用你的通用框架填充它,除了我直接调用控件,因为它已经存在于当前页面上,而不是依赖于this.FindControl()。

protected void Button1_Click(object sender, EventArgs e)
{
    foreach (ListItem itm in UserGroup.Items)
    {
        if (itm.Selected == true)
        {
            selectionList.Add(Convert.ToInt32(itm.Value));
        }
    }
}

按下此按钮后,如果我选择了3个项目,那么3个项目在selectionList中。希望你有相同的结果。祝你好运!