我正在使用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);
}
}
答案 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中。希望你有相同的结果。祝你好运!