C# - System.InvalidOperationException: die Auflistung wurde geändert; der Enumerationsvorgang kann nicht ausgeführt werden
Ich habe recherchiert das Problem und nicht das gefunden, was betrifft mich das noch nicht. Ich bin nicht versucht zu Bearbeiten, etwas, was ich bin Durchlaufen.
************** Exception Text **************
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
at System.Collections.Generic.List`1.Enumerator.MoveNext()
Hier ist meine Funktion, was es ist:
internal static bool CloseAllForms()
{
try
{
if (clsGlobal.g_objfrmCustomerInformation != null)
clsGlobal.g_objfrmCustomerInformation.Close();
if (clsGlobal.g_objfrmSearchCustomer != null)
clsGlobal.g_objfrmSearchCustomer.Close();
if (clsGlobal.g_objfrmSwipeLicense != null)
clsGlobal.g_objfrmSwipeLicense.Close();
if (clsGlobal.g_objfrmSearchResults != null)
clsGlobal.g_objfrmSearchResults.Close();
if (clsGlobal.g_objfrmCustomerData != null)
clsGlobal.g_objfrmCustomerData.Close();
if (clsGlobal.g_objfrmPurchaseOrder != null)
clsGlobal.g_objfrmPurchaseOrder.Close();
if (clsGlobal.g_objfrmAddPurchaseOrderItem != null)
clsGlobal.g_objfrmAddPurchaseOrderItem.Close();
if ((clsGlobal.g_objfrmCustomerInformation == null) && (clsGlobal.g_objfrmSearchCustomer == null) && (clsGlobal.g_objfrmSwipeLicense == null) && (clsGlobal.g_objfrmSearchResults == null) && (clsGlobal.g_objfrmCustomerData == null) && (clsGlobal.g_objfrmPurchaseOrder == null) && (clsGlobal.g_objfrmAddPurchaseOrderItem == null))
{
PrepareImageBar();
return true;
}
else
{
PrepareImageBar();
return false;
}
}
catch (Exception ex)
{
string ErrorMessage;
ErrorMessage = "Error: " + ex.Message +
"\r\nSource: " + ex.Source +
"\r\nTargetSite: " + ex.TargetSite.ToString() +
"\r\nStackTrace: " + ex.StackTrace.ToString();
if (ex.Data.Count > 0)
{
ErrorMessage += "\r\nData Count: " + ex.Data.Count.ToString() +
"\r\nKeys: " + ex.Data.Keys.ToString() +
"\r\nValues: " + ex.Data.Values.ToString();
}
MessageBox.Show(ErrorMessage, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
CustomFunctions.emailExceptionToAuthor(ex);
return false;
}
}
Dies ist, wie ich die Funktion aufrufen:
if (CloseAllForms())
{
if (clsGlobal.g_objfrmPurchaseOrder == null)
{
clsGlobal.g_objfrmPurchaseOrder = new frmPurchaseOrder();
clsGlobal.g_objfrmPurchaseOrder.FormClosed += PurchaseOrderFormClosed;
clsGlobal.g_objfrmPurchaseOrder.MdiParent = clsGlobal.g_objfrmMDIMain;
clsGlobal.g_objfrmPurchaseOrder.Show();
clsGlobal.g_objfrmPurchaseOrder.BringToFront();
}
else
{
clsGlobal.g_objfrmPurchaseOrder.Show();
clsGlobal.g_objfrmPurchaseOrder.BringToFront();
}
PrepareImageBar();
}
Bitte helfen Sie mir!
UPDATE: Hier ist der vollständige code.
Ausnahme
Finden Sie am Ende dieser Nachricht Informationen über das aufrufen
just-in-time (JIT) Debuggen anstelle dieses Dialogfelds.
************** Exception Text **************
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
at System.Collections.Generic.List`1.Enumerator.MoveNext()
at Microsoft.VisualBasic.PowerPacks.ShapeCollection.Dispose(Boolean disposing)
at Microsoft.VisualBasic.PowerPacks.ShapeContainer.Dispose(Boolean disposing)
at System.ComponentModel.Component.Dispose()
at System.Windows.Forms.Control.Dispose(Boolean disposing)
at System.Windows.Forms.Form.Dispose(Boolean disposing)
at B2HD_Software.frmCustomerData.Dispose(Boolean disposing)
at System.Windows.Forms.Form.WmClose(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
PrepareImageBar();
internal static void PrepareImageBar()
{
clsGlobal.g_objfrmMDIMain.mnuImageBarAddCustomer.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarAddCustomer.Enabled = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarEditCustomer.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarEditCustomer.Enabled = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarFindCustomer.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarFindCustomer.Enabled = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarStartSearch.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarStartSearch.Enabled = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarSwipeLicense.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarSwipeLicense.Enabled = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarViewNotes.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarViewNotes.Enabled = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarNewPurchase.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarNewPurchase.Enabled = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarAddItem.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarAddItem.Enabled = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarModifyItem.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarModifyItem.Enabled = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarDeleteItem.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarDeleteItem.Enabled = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarTakePicture.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarTakePicture.Enabled = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarSavePicture.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarSavePicture.Enabled = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarSave.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarSave.Enabled = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarCancel.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarCancel.Enabled = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarAdmin.Visible = false;
clsGlobal.g_objfrmMDIMain.mnuImageBarAdmin.Enabled = true;
switch (clsGlobal.ActiveForm())
{
case "CustomerInformation":
clsGlobal.g_objfrmMDIMain.mnuImageBarTakePicture.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarSave.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarCancel.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarCancel.Enabled = true;
break;
case "SearchCustomer":
clsGlobal.g_objfrmMDIMain.mnuImageBarStartSearch.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarSwipeLicense.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarCancel.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarStartSearch.Enabled = false;
break;
case "SwipeLicense":
clsGlobal.g_objfrmMDIMain.mnuImageBarCancel.Visible = true;
break;
case "CustomerData":
clsGlobal.g_objfrmMDIMain.mnuImageBarCancel.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarViewNotes.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarNewPurchase.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarEditCustomer.Visible = true;
break;
case "PurchaseOrder":
clsGlobal.g_objfrmMDIMain.mnuImageBarCancel.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarAddItem.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarDeleteItem.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarModifyItem.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarEditCustomer.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarViewNotes.Visible = true;
clsGlobal.g_objfrmPurchaseOrder.ShowProperButtons();
break;
case "AddPurchaseOrderItem":
clsGlobal.g_objfrmMDIMain.mnuImageBarTakePicture.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarSave.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarCancel.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarViewNotes.Visible = true;
break;
default:
clsGlobal.g_objfrmMDIMain.mnuImageBarAddCustomer.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarFindCustomer.Visible = true;
clsGlobal.g_objfrmMDIMain.mnuImageBarSwipeLicense.Visible = true;
break;
}
}
CloseAllForms()
internal static bool CloseAllForms()
{
if (clsGlobal.g_objfrmCustomerInformation != null)
clsGlobal.g_objfrmCustomerInformation.Close();
if (clsGlobal.g_objfrmSearchCustomer != null)
clsGlobal.g_objfrmSearchCustomer.Close();
if (clsGlobal.g_objfrmSwipeLicense != null)
clsGlobal.g_objfrmSwipeLicense.Close();
if (clsGlobal.g_objfrmSearchResults != null)
clsGlobal.g_objfrmSearchResults.Close();
if (clsGlobal.g_objfrmCustomerData != null)
clsGlobal.g_objfrmCustomerData.Close();
if (clsGlobal.g_objfrmPurchaseOrder != null)
clsGlobal.g_objfrmPurchaseOrder.Close();
if (clsGlobal.g_objfrmAddPurchaseOrderItem != null)
clsGlobal.g_objfrmAddPurchaseOrderItem.Close();
if ((clsGlobal.g_objfrmCustomerInformation == null) && (clsGlobal.g_objfrmSearchCustomer == null) && (clsGlobal.g_objfrmSwipeLicense == null) && (clsGlobal.g_objfrmSearchResults == null) && (clsGlobal.g_objfrmCustomerData == null) && (clsGlobal.g_objfrmPurchaseOrder == null) && (clsGlobal.g_objfrmAddPurchaseOrderItem == null))
{
PrepareImageBar();
return true;
}
else
{
PrepareImageBar();
return false;
}
}
Dies ist, was mein close-Ereignis sieht aus wie auf jedem Formular.
internal static void CustomerInformationFormClosed(object sender, FormClosedEventArgs e)
{
clsGlobal.g_objfrmCustomerInformation = null;
PrepareImageBar();
}
Können Sie eine volle stack-trace? Wissen Sie, wo der code nicht funktioniert (vielleicht etwas in
welche Plattform? (Rapfen? silverlight? wpf? Konsole? etc.)
Es gibt einige code hier fehlt; wahrscheinlich hat
+1 auf @vcsjones Kommentar, wahrscheinlich sind Sie das ändern einer Sammlung während einer Schleife durch die es entweder auf dem gleichen oder einem anderen thread.
Entfernen Sie die try-und catch, es wird verhindert, dass Sie sehen, wo der code wirklich Bomben. Lassen Sie es aus. Verwenden AppDomain.UnhandledException statt.
PrepareImageBar
vielleicht?welche Plattform? (Rapfen? silverlight? wpf? Konsole? etc.)
Es gibt einige code hier fehlt; wahrscheinlich hat
foreach
Loop-Schleife über eine Liste, und irgendwo in der foreach
Schleife, die Sie versuchen, hinzufügen oder entfernen Sie ein Element in der Sammlung.+1 auf @vcsjones Kommentar, wahrscheinlich sind Sie das ändern einer Sammlung während einer Schleife durch die es entweder auf dem gleichen oder einem anderen thread.
Entfernen Sie die try-und catch, es wird verhindert, dass Sie sehen, wo der code wirklich Bomben. Lassen Sie es aus. Verwenden AppDomain.UnhandledException statt.
InformationsquelleAutor Brandon | 2011-07-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich drei Möglichkeiten:
FormClosed
event-handler für eine der Formen (d.h., vielleicht etwas inPurchaseOrderFormClosed
).CloseAllForms()
- Methode ist dabei eine Menge Arbeit in diecatch
. Es könnte möglich sein, dass der code versagt es. Wenn der Fehler Auftritt, sehen Sie dieMessageBox
? Tut die E-Mail geschickt bekommen? Versuchen Sie, kommentieren Sie alle code sehen, wenn Sie weiterhin die Fehlermeldung erhalten. Oder vielleicht auch nur vorübergehend zu ersetzen Sie alle den code in dascatch
mit einemMessageBox.Show(ex.ToString())
so können Sie sicher sein, dass die Ausnahme, die Sie sehen, ist die in dertry
.PrepareImageBar()
. Versuchen Sie das auskommentieren der Methode und sehen, wenn Sie weiterhin die Fehlermeldung erhalten.Von Ihrem stack-trace sieht es aus wie es ist zu Versagen, wenn Sie versuchen zu schließen
frmCustomerData
. Gibt es irgendetwas, was Los ist in derClose
oderDispose
Methoden für das Formular? Wenn Sie nicht immer die message-box würde ich vermuten, dass die Ausnahme aufgetreten ist, in einem separaten thread, so dass vielleicht der Draht einen handler für die Anwendungsdomäne.UnhandledException-Ereignis, wenn Sie Ihre Anwendung starten (wie vorgeschlagen, in den Kommentaren zu deiner Frage).Ich aktualisierte mein code oben, um zu zeigen, das Closed-Ereignis. Ich weiß nicht, wie der Zugriff auf ein Formular aus einem anderen, ohne eine Globale variable festlegen, um jeder form...also wenn das Formular geschlossen ist, setzt es die variable auf null....Gibt es einen besseren Weg, es zu tun?
Wenn Sie überspringen, schließen frmCustomerData, haben Sie weiterhin die Fehlermeldung erhalten? Vielleicht hat es zu tun mit den PowerPacks.
Danke!!!!!! Es war ein paar doofe Zeilen habe ich zeichnete mit den VB powerpacks. Wenn ich Sie loswerden der Fehler geht Weg. Muss ein problem der Entsorgung. Ich werde nur ziehen Sie Sie manuell. Danke für die Festsetzung dieser 4 Tag Kopfschmerzen!
InformationsquelleAutor rsbarro
Ich weiß nicht, wo die Ausnahme aufgetreten ist, aber die Ausnahme erzeugt werden könnte, in
foreach
code-block, in dem die Auflistung wurde geändert. Hier die änderung mittels 'Hinzufügen' oder 'Entfernen' so etwas wie:Einer Sammlung nicht verändert werden, während die Aufzählung.
AKTUALISIERT
Finden, wo es geschah, wenn in Ihrem code während des Debuggens, Sie würde prüfen, ob der "user" nicht behandelte option' in Ausnahmen-dialog (Strg+Alt+E). Bitte beachten Sie jedoch, dass um diese option zu verwenden, VS eingestellt werden muss 'Enable just My Code" in der option Debuggen.
Ich sehe. Die Prüfung mit nur Ihre geposteten code wäre schwierig. Wo VS gestoppt in Ihre source-code mit dieser Ausnahme?
Das ist die Sache (ich vergaß zu erwähnen, es aber). Wenn ich testen Sie es auf einem computer, auf dem VS installiert, debugging oder nicht...keine Fehler. Wenn ich installieren Sie es auf einem anderen Arbeitsplatz, ist es der Fehler ist. Nicht geben Sie mir eine Zeile code oder nichts. Ich weiß nur, dass nach dem trial-and-error, wenn ich nicht die CloseAllForms() es wird keine Fehler. Gibt es einen besseren Weg, um sicherzustellen, dass alle untergeordnete MDI-Fenster sind geschlossen, die ich versuchen könnte?
Ich sehe, dass dies genau Ihr problem. Ich denke, es wäre das Ergebnis von dem Kind entsorgen, aber weiß nicht genau noch. Wenn sich die Suche nach Güte, ich werde Ihnen zeigen, dass es...
InformationsquelleAutor Jin-Wook Chung
Ich gesehen habe, diesen Fehler:
Der Fehler offenbar nur auf einigen windows-Installationen, und ich habe nie bekommen, Sie treten in der Entwicklungsumgebung über die debug-nur die app.
Dies ist ein Fehler in Visual Basic.PowerPacks.
Sehen Sie hier eine Lösung (siehe Ende des Blogs).
Haben Sie grundsätzlich zu überschreiben, die Formen der Dispose () - Methode und manuell entsorgen Sie alle VisualBasic Powerpack Elemente.
InformationsquelleAutor Eric L Robishaw