【发布时间】:2011-04-18 14:23:31
【问题描述】:
我正在使用 C# 2.0 - VS 2005 最新 SP。
问题是即使 ListBox SelectionMode 设置为多个,我也无法从 UserGroup 框中捕获第二个项目。我附上了处理列表框的按钮。我已经包含了我试图解决这个问题的两段代码。这是在 cmets 中标记的。
我将第一个选定项目设为真,但第二个选定项目为假。因此,将所选值添加到 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);
}
}
【问题讨论】:
-
什么是“lbStudent”?您是否从两个 ListBox 中选择了项目?
-
这是一个检查学生是否被选中。在数据库中,我将 Student 和 Group 关联到一个 n-m 表映射中。
-
尽管选择了一个项目,但 lst.Student.SelectedIndex 是 -1?
-
@Jan-Frederik Carl - 好吧,Student / Group 这两个控件不会相互加载。虽然我可以编写代码来隐藏此页面上的项目,直到选择学生,但这应该是一个快速/肮脏的管理页面,以方便为客户映射多对多表。由于两个列表框都是从不同的表中填充的,因此我试图防止客户端在尝试将一对项目映射到多对多表之前没有选择一个或其他框的情况。