חריג מסוג InvalidOperationException
-
אני נתקל בחריג הנ"ל ואינני יודע מה לעשות :shock: :shock:
אתאר את המצב בו אני נתקל בו.
יש לי את החלון הראשי של התוכנית, מתוכו אני יכול להכנס לכמה חלונות ניהול:
אחד מהם הוא ניהול תרומות. בתוכו ישנה אפשרות להוספת תרומה לתורם שכבר קיים במערכת (בכרטיסיה ("טאב אייטם") אחת), ובכרטיסייה אחרת ישנה אפשרות לראות את כל התרומות הפעילות (וכאשר לכרטיסיה הנ"ל, מופעלת אוט' פונקציה שמחשבת את סך התרומות של כל תורם נכון להיום..)כאשר אני נכנס לחלון הנ"ל ומוסיף תרומה חדשה (או כמה) ואח"כ נכנס לכרטיסיה של הצגת התרומות - הכל מצויין! ואני רואה שם את התרומות שהוספתי.
אולם, כאשר נכנסתי כבר לכרטיסיה של הצגת התרומות, ואח"כ חזרתי לכרטיסיה של הוספת התרומות, והוספתי תרומות חדשות, ואז אני חוזר לכרטיסיה של הצגת התרומות - קופץ לי החריג הנ"ל שתוקע את התכנה:
ניסיתי לתפוס אותו ע"י הקוד הבא:private void previewDonations_Loaded(object sender, RoutedEventArgs e) { try { foreach (Donation donat in AddTorem.donations) { donat.SumAllDonat = donat.SumAllDonation(donat); } } catch (InvalidOperationException ioe) { MessageBox.Show(ioe.Message); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
אולם ללא הועיל, אפי' ששמתי שם breakpoint - זה לא עזר.. כנראה שהחריג לא נזרק משם.. אבל זה מוזר.. כי אם אני לא נכנס לשם - לא קורה כלום, ורק כאשר אני נכנס לכרטיסיה הנ"ל אז התכנה נתקעת וא"כ לכאו' נראה שזה בגלל שהיא מנסה לבצע את המתודה הנ"ל ולא מצליחה..
ניסיתי גם לקרוא כאן על החריג הנ"ל, אך לא כ"כ הצלחתי להבין משם מה הבעיה ואיך להתמודד עמה.
אשמח לעזרה!
תודה רבה רבה מראש!
מה הייתי עושה בלעדיכם??
ושיהיה לכולנו חודש טוב וזמן טוב ומבורך!פורסם במקור בפורום CODE613 ב17/08/2015 21:45 (+03:00)
-
זה לא מספיק צריך עוד...
במיוחד תסתכל ב stack trace
innerException
וגם ב message
תעתיק לפה את הטקסט שלהם ולא תמונה.stack trace =
ב- System.Windows.Controls.ItemContainerGenerator.Verify()
ב- System.Windows.Controls.VirtualizingStackPanel.MeasureChild(IItemContainerGenerator& generator, IContainItemStorage& itemStorageProvider, IContainItemStorage& parentItemStorageProvider, Object& parentItem, Boolean& hasUniformOrAverageContainerSizeBeenSet, Double& computedUniformOrAverageContainerSize, Boolean& computedAreContainersUniformlySized, IList& items, Object& item, IList& children, Int32& childIndex, Boolean& visualOrderChanged, Boolean& isHorizontal, Size& childConstraint, Rect& viewport, VirtualizationCacheLength& cacheSize, VirtualizationCacheLengthUnit& cacheUnit, Boolean& foundFirstItemInViewport, Double& firstItemInViewportOffset, Size& stackPixelSize, Size& stackPixelSizeInViewport, Size& stackPixelSizeInCacheBeforeViewport, Size& stackPixelSizeInCacheAfterViewport, Size& stackLogicalSize, Size& stackLogicalSizeInViewport, Size& stackLogicalSizeInCacheBeforeViewport, Size& stackLogicalSizeInCacheAfterViewport, Boolean& mustDisableVirtualization, Boolean isBeforeFirstItem, Boolean isAfterFirstItem, Boolean isAfterLastItem, Boolean skipActualMeasure, Boolean skipGeneration, Boolean& hasBringIntoViewContainerBeenMeasured, Boolean& hasVirtualizingChildren)
ב- System.Windows.Controls.VirtualizingStackPanel.MeasureOverrideImpl(Size constraint, Nullable1& lastPageSafeOffset, List
1& previouslyMeasuredOffsets, Nullable`1& lastPagePixelSize, Boolean remeasure)
ב- System.Windows.Controls.VirtualizingStackPanel.MeasureOverride(Size constraint)
ב- System.Windows.Controls.Primitives.DataGridRowsPresenter.MeasureOverride(Size constraint)
ב- System.Windows.FrameworkElement.MeasureCore(Size availableSize)
ב- System.Windows.UIElement.Measure(Size availableSize)
ב- System.Windows.ContextLayoutManager.UpdateLayout()
ב- System.Windows.UIElement.UpdateLayout()
ב- System.Windows.Controls.TabItem.OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
ב- System.Windows.UIElement.OnPreviewGotKeyboardFocusThunk(Object sender, KeyboardFocusChangedEventArgs e)
ב- System.Windows.Input.KeyboardFocusChangedEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
ב- System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
ב- System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
ב- System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
ב- System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
ב- System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
ב- System.Windows.Input.InputManager.ProcessStagingArea()
ב- System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
ב- System.Windows.Input.KeyboardDevice.TryChangeFocus(DependencyObject newFocus, IKeyboardInputProvider keyboardInputProvider, Boolean askOld, Boolean askNew, Boolean forceToNullIfFailed)
ב- System.Windows.Input.KeyboardDevice.Focus(DependencyObject focus, Boolean askOld, Boolean askNew, Boolean forceToNullIfFailed)
ב- System.Windows.Input.KeyboardDevice.Focus(IInputElement element)
ב- System.Windows.UIElement.Focus()
ב- System.Windows.Controls.TabItem.SetFocus()
ב- System.Windows.Controls.TabItem.OnMouseLeftButtonDown(MouseButtonEventArgs e)
ב- System.Windows.UIElement.OnMouseLeftButtonDownThunk(Object sender, MouseButtonEventArgs e)
ב- System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
ב- System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
ב- System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
ב- System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
ב- System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
ב- System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e)
ב- System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
ב- System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
ב- System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
ב- System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
ב- System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
ב- System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
ב- System.Windows.Input.InputManager.ProcessStagingArea()
ב- System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
ב- System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
ב- System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
ב- System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
ב- System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
ב- MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
ב- MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
ב- System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
ב- System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
ב- System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
ב- MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
ב- MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
ב- System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
ב- System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
ב- System.Windows.Application.RunDispatcher(Object ignore)
ב- System.Windows.Application.RunInternal(Window window)
ב- System.Windows.Application.Run(Window window)
ב- System.Windows.Application.Run()
ב- AppDonorNew.App.Main() ב- C:\Users\Latitude E7240\Documents\Visual Studio 2015\Projects\AppDonorNew\AppDonorNew\obj\Debug\App.g.cs:שורה 0
ב- System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
ב- System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
ב- Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
ב- System.Threading.ThreadHelper.ThreadStart_Context(Object state)
ב- System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
ב- System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
ב- System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
ב- System.Threading.ThreadHelper.ThreadStart()innerException =
{"Information for developers (use Text Visualizer to read this):\r\nThis exception was thrown because the generator for control 'System.Windows.Controls.DataGrid Items.Count:8' with name '(unnamed)' has received sequence of CollectionChanged events that do not agree with the current state of the Items collection. The following differences were detected:\r\n Accumulated count 7 is different from actual count 8. [Accumulated count is (Count at last Reset + #Adds - #Removes since last Reset).]\r\n\r\nOne or more of the following sources may have raised the wrong events:\r\n System.Windows.Controls.ItemContainerGenerator\r\n System.Windows.Controls.ItemCollection\r\n System.Windows.Data.ListCollectionView\r\n System.Collections.Generic.List`1[[Person.Donation, Person, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]\r\n(The starred sources are considered more likely to be the cause of the problem.)\r\n\r\nThe most common causes are (a) changing the collection or its Count without raising a corresponding event, and (b) raising an event with an incorrect index or item parameter.\r\n\r\nThe exception's stack trace describes how the inconsistencies were detected, not how they occurred. To get a more timely exception, set the attached property 'PresentationTraceSources.TraceLevel' on the generator to value 'High' and rerun the scenario. One way to do this is to run a command similar to the following:\n System.Diagnostics.PresentationTraceSources.SetTraceLevel(myItemsControl.ItemContainerGenerator, System.Diagnostics.PresentationTraceLevel.High)\r\nfrom the Immediate window. This causes the detection logic to run after every CollectionChanged event, so it will slow down the application.\r\n"}
message =
An ItemsControl is inconsistent with its items source.
See the inner exception for more information.תודה רבה!
פורסם במקור בפורום CODE613 ב17/08/2015 22:40 (+03:00)
-
מה שרואים כאן שהאוסף שלך משתנה באופן לא תקין
האוספים של WPF הם לא כמו מערך פרימיטיבי אלא עם המון אירועים ובדיקות ושיכלולים
לדעתי אין טעם יותר מידי לחפור איפה הטעות ולנסות לסתום עם איזה טלאי
אלא צריך לתכנן את כל המערכת בצורה נכונה שהוספה לא תתנגש עם הצגה והכל יעבוד כמו שצריךפעל לפי השלבים הבאים:
תחליט מה אתה רוצה שהתוכנה תציג
תברר איך עשים את זה ב WPF כלומר לא איך אפשר לעשות אלא איך מלכתחילה התכוונו לתת לך אפשרות לעשות את זה.
ואז תעשה את זה בצורה הנכונה.פורסם במקור בפורום CODE613 ב18/08/2015 00:14 (+03:00)
-
אני לא יודע מה הבעיה אבל בשביל לדעת פרטי שגיאה צריך פשוט להיכנס לView Detilled כמו שכתב רחמים, ואז לבדוק את הMessage. במידה והמאפיין InnerExeption לא null אז לפתוח את ה+ ולבדוק את השגיאה הפנימית, גם שם לבדוק הודעה ואם יש InnerExeption וכן הלאה רקורסיבית.
פורסם במקור בפורום CODE613 ב18/08/2015 10:37 (+03:00)
-
רחמים: לא ככ הבנתי אותך. אסביר שוב, יש לי מסך ראשי שבתוכו יש מס' מסכי משנה:
- הוסף תורם - בו יש ג' כרטיסיות: א. להזין את פרטי התורם. ב. להזין את פרטי התרומה. ג. להזין את פרטי אמצעי התשלום.
- ניהול התרומות - שבו יש כמה כרטיסיות: א. להוסיף תרומה נוספת תחת תורם קיים. ב. הצגת התורמים. ג. הצגת התרומות. ד. חיפוש תורמים / תרומות.
- שמירת הנתונים לקובץ שהמשתמש בוחר (יותר מדוייק לתיקייה שהוא בוחר).
- טעינת הנתונים מתוך הנ"ל.
עכשיו הכל עובד טוב, ב"ה.
הבעיה שלי היא שאני רוצה לאפשר להוסיף תרומה לתורם קיים בחלון 2, וזה גם עובד כאשר אני מזין תרומה ואח"כ נכנס לכרטיסיה ג זה מציג אותה. רק אם אני עובד הפוך נכנס לג ואחכ חוזר לא' ואחכ חוזר לג זה נתקע. כך שלא נראה לי שהבעיה שהתכנה בנויה עקום.. אבל אולי כן.. אז אשמח אם תבהיר יותר למה אתה מתכוון.לדוד,
יש שני חריגים סה"כ:
הראשון ההודעה שלו היא:
An ItemsControl is inconsistent with its items source.
See the inner exception for more information.השני ההודעה שלו היא:
Information for developers (use Text Visualizer to read this):
This exception was thrown because the generator for control 'System.Windows.Controls.DataGrid Items.Count:7' with name '(unnamed)' has received sequence of CollectionChanged events that do not agree with the current state of the Items collection. The following differences were detected:
Accumulated count 6 is different from actual count 7. [Accumulated count is (Count at last Reset + #Adds - #Removes since last Reset).]One or more of the following sources may have raised the wrong events:
System.Windows.Controls.ItemContainerGenerator
System.Windows.Controls.ItemCollection
System.Windows.Data.ListCollectionView
System.Collections.Generic.List`1[[Person.Donation, Person, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
(The starred sources are considered more likely to be the cause of the problem.)The most common causes are (a) changing the collection or its Count without raising a corresponding event, and (b) raising an event with an incorrect index or item parameter.
The exception's stack trace describes how the inconsistencies were detected, not how they occurred. To get a more timely exception, set the attached property 'PresentationTraceSources.TraceLevel' on the generator to value 'High' and rerun the scenario. One way to do this is to run a command similar to the following:
System.Diagnostics.PresentationTraceSources.SetTraceLevel(myItemsControl.ItemContainerGenerator, System.Diagnostics.PresentationTraceLevel.High)
from the Immediate window. This causes the detection logic to run after every CollectionChanged event, so it will slow down the application.תודה רבה!
פורסם במקור בפורום CODE613 ב18/08/2015 15:30 (+03:00)
-
מה שנראה לי עכשיו.. אולי זה בגלל שאני משתמש בlist רגיל ולא בobserlvCollection (או משהו כזה..)??
כי נראה לי שהבעיה זה בגלל הבינדינג ולא בגלל המתודה שרצה כשאני נכנס לכרטיסיה הנ"ל.. אלא שכיון שהבינדינג כבר נבנה ועכשיו המקור שלו (הליסט) השתנה (נוספה לו שורה) והוא לא התעדכן על כך.. אז הוא קורס..
יכול להיות? או שזה לא קשור??
סליחה אם חפרתי יותר מדי... :lol:פורסם במקור בפורום CODE613 ב18/08/2015 16:26 (+03:00)
-
מה שנראה לי עכשיו.. אולי זה בגלל שאני משתמש בlist רגיל ולא בobserlvCollection (או משהו כזה..)??
כי נראה לי שהבעיה זה בגלל הבינדינג ולא בגלל המתודה שרצה כשאני נכנס לכרטיסיה הנ"ל.. אלא שכיון שהבינדינג כבר נבנה ועכשיו המקור שלו (הליסט) השתנה (נוספה לו שורה) והוא לא התעדכן על כך.. אז הוא קורס..
יכול להיות? או שזה לא קשור??
סליחה אם חפרתי יותר מדי... :lol:טוב אז אחרי הרבה דם יזע ודמעות
עליתי על השגיאה - אכן כן, הבעיה היא שהשתמשתי בליסט ולא בObservableCollectionבניתי תוכנה קטנה רק עם שני כרטיסיות ובדקתי ואכן כשהשתמשתי בליסט זה קרס (אותה שגיאה) וכששיניתי לObservableCollection - הכל עבד חלק!!
מסקנה: מהיום בWPF רק אבל רק ObservableCollection!!!פורסם במקור בפורום CODE613 ב18/08/2015 18:40 (+03:00)
-