【发布时间】:2014-04-07 22:04:16
【问题描述】:
我正在尝试从复选框列表中获取所选项目,并在单击按钮时将它们添加到列表框中。我能够通过使用以下方法来实现这一点:
protected void AddSelectedField(object sender, EventArgs e)
{
foreach (ListItem column in ColumnsList.Items)
{
if (column.Selected)
{
SelectedColumns.Add(column.Text);
}
}
foreach (String column in SelectedColumns)
{
SelectedFieldsList.Items.Add(column);
}
}
但是,这样做的问题是用户仍然可以在回发发生后添加他们已经选择的相同项目。我尝试了以下方法,但这甚至不再将所选项目添加到列表框中:
protected void AddSelectedField(object sender, EventArgs e)
{
foreach (ListItem column in ColumnsList.Items)
{
if (column.Selected)
{
foreach (String item in SelectedColumns)
{
if (item != column.Text || SelectedColumns != null)
{
SelectedColumns.Add(column.Text);
}
}
}
}
foreach (String column in SelectedColumns)
{
SelectedFieldsList.Items.Add(column);
}
}
另外,我还需要添加允许用户通过循环遍历列表框中的选定项目来从列表中删除项目的功能。我试过这个:
protected void RemoveSelectedField(object sender, EventArgs e)
{
foreach (ListItem field in SelectedFieldsList.Items)
{
if (field.Selected)
{
SelectedColumns.Remove(item);
}
}
foreach (String field in SelectedColumns)
{
SelectedFieldsList.Items.Add(field);
}
}
还有:
protected void RemoveSelectedField(object sender, EventArgs e)
{
foreach (ListItem field in SelectedFieldsList.Items)
{
if (field.Selected)
{
foreach (String item in SelectedColumns)
{
if (item == field.Text)
{
SelectedColumns.Remove(item);
}
}
}
}
foreach (String field in SelectedColumns)
{
SelectedFieldsList.Items.Add(field);
}
}
这些都没有从列表框 m 中删除选定的项目(我也假设是字符串列表)。关于检查正在添加的项目是否已经存在,我也尝试过:
protected void AddSelectedField(object sender, EventArgs e)
{
foreach (ListItem column in ColumnsList.Items)
{
if (column.Selected && !SelectedColumns.Contains(column.Text))
{
SelectedColumns.Add(column.Text);
}
}
foreach (String column in SelectedColumns)
{
SelectedFieldsList.Items.Add(column);
}
}
就好像它忽略了 if 语句的第二部分,它检查列表是否包含当前列表项的文本。
【问题讨论】:
-
你试过HashSet而不是List吗?这是一种不允许重复的数据结构。
-
刚刚尝试过,它做同样的事情。我认为它再次添加它的事实可能是由于方法底部的 foreach 将项目添加到 SelectedFieldsList (列表框控件)。
-
@TonyBarsotti 嗯,看看你的最后一个方法
protected void AddSelectedField(object sender, EventArgs e)似乎应该做你想做的事 - 只添加不存在的列。你能说明你是如何声明SelectedColumns的吗? -
HashSet
SelectedColumns = new HashSet ();之前是 List SelectedColumns = new List ();它是在我班的最顶层声明的。 -
另外我想知道你如何在
protected void RemoveSelectedField(object sender, EventArgs e)中没有异常 - 注意 -You cannot remove elements inside a foreach-loop because the looping mechanism requires that state be saved. The runtime cannot tell if you removed an element that was to be looped over in a subsequent iteration.换句话说,在 foreach 循环中调用SelectedColumns.Remove(item);应该会导致InvalidOperationException。您可以改用for循环。