ListBox의 메소드를 제거하는 메소드 대신 Foreach 메소드를 어떻게 사용할 수 있습니까?
문제
어떻게 사용할 수 있습니까? 초 대신 방법 첫 번째?
첫 번째 (웹 사용자 컨트롤)
public void Remove()
{
int count = this.ListBox1.Items.Count;
for (int i = count - 1; i > -1; i--)
{
if (ListBox1.Items[i].Selected)
{
ListBox1.Items.Remove(ListBox1.Items[i]);
}
}
}
test.aspx (첫 번째 테스트)
protected void btnRemove_Click(object sender, EventArgs e)
{
ItemOrderer2.Remove();
}
두 번째 (웹 사용자 제어)
public void Remove(string value)
{
ListItem li = new ListItem();
li = ListBox1.Items.FindByValue(value);
if (li != null)
{
this.ListBox1.Items.Remove(li);
}
test.aspx (두 번째 테스트)
protected void btnRemove_Click(object sender, EventArgs e)
{
// ItemOrderer2.Remove();
if (ItemOrderer2.Items.Count > 0)
foreach (ListItem li in ItemOrderer2.Items)
{
if (li.Selected)
{
ItemOrderer2.Remove(li.Value);
}
}
}
해결책
당신은 사용할 수 없습니다 foreach
내부에서 데이터를 제거하는 경우 foreach
- (의도적으로) 반복자를 깨뜨립니다.
만약에 for
작동하는 이유는 무엇입니까? 당신이있는 경우 자포자기한 사용 foreach
, 그런 다음 a 분리된 먼저 목록 - 예를 들어 :
List<ListItem> remove = new List<ListItem>();
foreach(ListItem li in ItemOrdere2.Items) {
if(li.Selected) remove.Add(li);
}
foreach(ListItem li in remove) {
ItemOrderer2.Remove(li); // or similar
}
사용 가능한 경우 첫 번째 쿼리를 LINQ에서 단순화 할 수 있습니다.
다른 팁
값을 먼저 목록으로 제거한 다음 제거 기능을 통해 실행할 수 있습니다. 필요한 경우 더 강화 될 수 있습니다.
var removedValues = ItemOrderer2.Items
.Where(li => li.Selected)
.Select(li => li.Value).ToList();
foreach (var removedValue in removedValues) {
ItemOrderer2.Remove(removedValue);
}
Foreach 루프에서 반복하는 컬렉션을 수정할 수 없습니다.
즉, ListBox에서 선택한 항목을 제거하려고하는 것 같습니다. 다음과 같은 것을 사용할 수도 있습니다.
while(ItemOrderer2.SelectedItem != null)
{
ItemOrderer2.Items.Remove(ItemOrderer2.SelectedItem);
}
글쎄, 당신은 oreach를 사용하여 Ilist <>를 변경할 수 없습니다. 단순히 항목 수를 변경하기 때문입니다.
또한, 당신이 보여주는 첫 번째 방법은 결함이 있습니다. count는 20으로 시작할 수 있지만 방법으로 10 개의 항목을 제거하면 Count는 여전히 20이며 Ilist <>의 경계를 벗어납니다.
기본적으로 반복하는 동안 물건을 제거 / 추가하려면 다음과 같은 작업을 수행해야합니다.
for (int i = 0; i < ListBox1.Items.Count; i++)
{
if (ListBox1.Items[i].Selected)
{
ListBox1.Items.RemoveAt(i)
i--;
}
}
I를 확인하십시오. 항목 [2]이 선택되었다고 가정 해 봅시다. 루프가 갈 것이라고 가정 해 봅시다.
- count> 0이 진행되는 경우
- 항목 [0]이 선택되면 제거하십시오 (그렇지 않음)
- 우리 카운터를 증가시킵니다
- 카운트> 1이 진행되는 경우
- 항목 [1]이 선택되면 제거하십시오 (그렇지 않음)
- 우리 카운터를 증가시킵니다
- 카운트> 2가 진행되는 경우
- 항목 [2]이 선택되어 제거합니다 (IT IS)
- 항목 제거 [2] (이제, 이전 항목 [3]은 항목 [2]입니다.
- 카운터를 줄입니다
- 우리 카운터를 증가시킵니다
- 카운트> 2가 진행되는 경우
- ...
도움이 되었기를 바랍니다 :)
제휴하지 않습니다 StackOverflow