Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ASP.NET Новый топик    Ответить
 Ошибка Коллекция была изменена; невозможно выполнить операцию перечисления.  [new]
viv
Member

Откуда: Ямайка - колыбель пиратства
Сообщений: 39895
автор

Коллекция была изменена; невозможно выполнить операцию перечисления.
Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

Сведения об исключении: System.InvalidOperationException: Коллекция была изменена; невозможно выполнить операцию перечисления.

Ошибка источника:

Строка 439: protected void btnPhotoDelete_Click(object o, EventArgs e)
Строка 440: {
Строка 441: foreach(ListItem photo in cbl_photos.Items)
Строка 442: {
Строка 443: if (photo.Selected)


Исходный файл: c:\work\practicants\Admin\Practicant.aspx.cs Строка: 441

Трассировка стека:

[InvalidOperationException: Коллекция была изменена; невозможно выполнить операцию перечисления.]
System.Collections.ArrayListEnumeratorSimple.MoveNext() +7488601
Admin_Practicant.btnPhotoDelete_Click(Object o, EventArgs e) in c:\work\practicants\Admin\Practicant.aspx.cs:441
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565


Информация о версии: Платформа Microsoft .NET Framework, версия:2.0.50727.3082; ASP.NET, версия:2.0.50727.3082

У меня есть CheckBoxList который я пытаюсь аяксом изменять. но при обработке вот такая ошибка.

Код

                <asp:Panel ID="pn_photos" runat="server" Width="625px" CssClass="Photos">
                <h3>Фотографии</h3>
                    <a href="" onclick="preview_create(
                        <asp:Literal ID="lit_id" runat="server"></asp:Literal>);" >Создать превью фото практиканта</a>
                    <asp:ScriptManager ID="ScriptManager1" runat="server"/>
                    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                        <Triggers>
                            <asp:PostBackTrigger ControlID="btnPhotoUpload" /> 
                            <asp:PostBackTrigger ControlID="btnPhotoDelete" /> 
                        </Triggers>
                        <ContentTemplate>
                            <asp:CheckBoxList ID="cbl_photos" class="photosList" runat="server">
                            </asp:CheckBoxList>
                            <asp:FileUpload ID="fu_photo" runat="server" />
                            <asp:Label ID="lblMsg" runat="server"></asp:Label>            
                            <br />
                            <asp:Button ID="btnPhotoUpload" runat="server" Text="Загрузить" 
                                OnClick="UploadPhoto" OnClientClick="javascript:showWait();"/>           
                            <asp:Button ID="btnPhotoDelete" runat="server" Text="Удалить" 
                                OnClick="btnPhotoDelete_Click" OnClientClick="javascript:DeleteConfirm();"/>     
                            <asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">
                                <ProgressTemplate>
                                    <asp:Label ID="lblWait" runat="server" BackColor="#507CD1" Font-Bold="True" ForeColor="White" Text="Идет загрузка файла ..."></asp:Label>
                                </ProgressTemplate>
                            </asp:UpdateProgress>
                        </ContentTemplate>
                    </asp:UpdatePanel>
                </asp:Panel>


    protected void btnPhotoDelete_Click(object o, EventArgs e)
    {
        foreach(ListItem photo in cbl_photos.Items)
        {
            if (photo.Selected)
            {
                File.Delete(Request.PhysicalApplicationPath + "images/persons/" + hid_pr_id.Value + "/photos/" + photo.Text);
                cbl_photos.Items.Remove(photo);
            }
        }
    }


Помогите пожалуйста.
21 авг 09, 12:27    [7566097]     Ответить | Цитировать Сообщить модератору
 Ошибка Коллекция была изменена; невозможно выполнить операцию перечисления.  [new]
Nisus
GDN Member

Откуда: GotDotNet.Ru
Сообщений: N/A
нельзя менять коллекцию по которой идешь итератором, надо действовать как-то так:
protected void btnPhotoDelete_Click(object o, EventArgs e)
{
for (int i = cbl_photos.Items.Length - 1; i >= 0; --i)
{
ListItem photo = cbl_photos.Items[i];
if (photo.Selected)
{
File.Delete(Request.PhysicalApplicationPath + "images/persons/" + hid_pr_id.Value + "/photos/" + photo.Text);
cbl_photos.Items.RemoveAt(i);
}
}
}

PS: идем от последнего элемента к первому чтобы при удалении элемента индексы у нас оставались правильными. Иначе они при удалении элементов будут сдвигаться и мы наудаляем не того :)

Данное сообщение получено с GotDotNet.Ru
21 авг 09, 12:53    [7566450]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Коллекция была изменена; невозможно выполнить операцию перечисления.  [new]
KVVK
Member

Откуда:
Сообщений: 36
viv,
Есть подозрение, что вот так делать нельзя:

<a href="" onclick="preview_create(
<asp:Literal ID="lit_id" runat="server"></asp:Literal>);" >Создать превью фото практиканта</a>

Попробуйте без этого
21 авг 09, 13:00    [7566385]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Коллекция была изменена; невозможно выполнить операцию перечисления.  [new]
viv
Member

Откуда: Ямайка - колыбель пиратства
Сообщений: 39895
Nisus
нельзя менять коллекцию по которой идешь итератором, надо действовать как-то так: protected void btnPhotoDelete_Click(object o, EventArgs e)
{
for (int i = cbl_photos.Items.Length - 1; i >= 0; --i)
{
ListItem photo = cbl_photos.Items[i];
if (photo.Selected)
{
File.Delete(Request.PhysicalApplicationPath + "images/persons/" + hid_pr_id.Value + "/photos/" + photo.Text);
cbl_photos.Items.RemoveAt(i);
}
}
}
PS: идем от последнего элемента к первому чтобы при удалении элемента индексы у нас оставались правильными. Иначе они при удалении элементов будут сдвигаться и мы наудаляем не того :)

То есть как? Добавлять можно а удалять нельзя получается?
21 авг 09, 13:55    [7566769]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Коллекция была изменена; невозможно выполнить операцию перечисления.  [new]
Nisus
GDN Member

Откуда: GotDotNet.Ru
Сообщений: N/A
добавлять тоже нельзя, нельзя изменять коллекцию, задействованную в операторе foreach.

Данное сообщение получено с GotDotNet.Ru
21 авг 09, 14:20    [7566962]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Коллекция была изменена; невозможно выполнить операцию перечисления.  [new]
viv
Member

Откуда: Ямайка - колыбель пиратства
Сообщений: 39895
ага, понятно

Спасибо
21 авг 09, 14:53    [7567226]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Коллекция была изменена; невозможно выполнить операцию перечисления.  [new]
viv
Member

Откуда: Ямайка - колыбель пиратства
Сообщений: 39895
только вместо cbl_photos.Items.Length надо было cbl_photos.Items.Count :)

А вообще прикольная штукенция эта AsP.Net
21 авг 09, 14:55    [7567243]     Ответить | Цитировать Сообщить модератору
Все форумы / ASP.NET Ответить