2013-02-22 20 views
5

मेरे पास DataGrid डेटा की कई पंक्तियां और कॉलम प्रदर्शित करता है, प्रत्येक अपने Property से जुड़ा हुआ है। DataGridTabControl पर नहीं है, लेकिन जब भी वह खिड़की पर रहता है उसे बंद कर दिया जाता है और फिर से खोल दिया जाता है तो मुझे त्रुटि संदेश मिलता है: 'DeferRefresh' is not allowed during an AddNew or EditItem transaction.केवल अगरDataGrid की कोशिकाओं में से एक या अधिक के साथ सत्यापन समस्याएं थीं।WPF DataGrid संपादन मोड से बाहर नहीं निकलता

उदाहरण के लिए: संपत्ति DataGrid के cell एक double है और उपयोगकर्ता में प्रवेश करती है "हैलो" जाहिर है तो WPF's स्वत: लाल बॉर्डर cell के आसपास प्रदर्शित किया जाता है करने के लिए बाध्य। अब, यदि उपयोगकर्ता विंडो बंद करना था, और इसे फिर से खोलना त्रुटि उत्पन्न होगी।

मैं क्यों त्रुटि फेंक दिया जा रहा है, क्योंकि cell "संपादन मोड" छोड़ने नहीं है पता है।

मैं इस त्रुटि को कैसे हल कर सकता हूं?

अन्य नोट्स:

  • मैं this question पर ध्यान दिया है, लेकिन यह एक TabControl पर एक DataGrid से संबंधित है (जो मेरा नहीं है)।
  • मैंने उपयोगकर्ता के इनपुट को सीमित करने का प्रयास किया है ताकि Cell को double की आवश्यकता हो या फिर केवल double स्वीकार करें, लेकिन समस्या यह है कि उपयोगकर्ता के दशमलव बिंदु ("।") की संख्या को सीमित करने के लिए कोई अच्छा तरीका नहीं है। सम्मिलित कर सकते हैं मैं PreviewTextInput के माध्यम से उपयोगकर्ता इनपुट को नियंत्रित कर रहा हूं और केवल 0-9 और "।" की अनुमति देता हूं।

अपवाद विस्तार (अगर यह मदद करता है)

System.InvalidOperationException was unhandled 
    Message='DeferRefresh' is not allowed during an AddNew or EditItem transaction. 
    Source=PresentationFramework 
    StackTrace: 
     at System.Windows.Data.CollectionView.DeferRefresh() 
     at System.Windows.Controls.ItemCollection.SetCollectionView(CollectionView view) 
     at System.Windows.Controls.ItemsControl.OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
     at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
     at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) 
     at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType) 
     at System.Windows.Data.BindingExpressionBase.Invalidate(Boolean isASubPropertyChange) 
     at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange) 
     at System.Windows.Data.BindingExpression.Activate(Object item) 
     at System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt attempt) 
     at System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance) 
     at MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance) 
     at MS.Internal.Data.DataBindEngine.Run(Object arg) 
     at MS.Internal.Data.DataBindEngine.OnLayoutUpdated(Object sender, EventArgs e) 
     at System.Windows.ContextLayoutManager.fireLayoutUpdateEvent() 
     at System.Windows.ContextLayoutManager.UpdateLayout() 
     at System.Windows.Interop.HwndSource.SetLayoutSize() 
     at System.Windows.Interop.HwndSource.set_RootVisualInternal(Visual value) 
     at System.Windows.Window.SetRootVisualAndUpdateSTC() 
     at System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight) 
     at System.Windows.Window.CreateSourceWindow(Boolean duringShow) 
     at System.Windows.Window.ShowHelper(Object booleanBox) 
     at REACT.ViewModel.ReceiverListViewModel.ShowWindow(String name) in C:\Users\jcarroll42\Documents\Sandbox\REACT\SW\Source\ViewModel\ReceiverListViewModel.cs:line 238 
     at REACT.Commands.ShowWindowCommand.Execute(Object parameter) in C:\Users\jcarroll42\Documents\Sandbox\REACT\SW\Source\Commands.cs:line 137 
     at MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated) 
     at System.Windows.Controls.Button.OnClick() 
     at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e) 
     at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
     at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
     at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) 
     at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
     at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
     at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
     at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args) 
     at System.Windows.Input.InputManager.ProcessStagingArea() 
     at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) 
     at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel) 
     at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
     at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
     at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
     at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) 
     at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
     at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
     at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
     at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
     at System.Windows.Application.RunInternal(Window window) 
     at System.Windows.Application.Run() 
     at REACT.App.Main() in C:\Users\jcarroll42\Documents\Sandbox\REACT\SW\Source\obj\x86\Debug\App.g.cs:line 0 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

मैं अगर जरूरत अब और जानकारी प्रदान करने में प्रसन्नता होगी।

+0

क्या आप हर बार नई विंडो/डेटाग्रिड उदाहरण का उपयोग कर रहे हैं। – Liju

+0

@ लिजू हां, मैं हूं। –

+1

मैंने विंडो क्लोजिंग इवेंट के अंदर बटनब्लैह.फोकस() को कॉल करके एक ही समस्या हल की, यह सेल पर लॉस्टफोकस ईवेंट को आग लगाने के लिए मजबूर करता है। मुझे पता नहीं है कि एक और समाधान है कि बटन "सहेजें" और "रद्द करें" बटन का उपयोग करके विंडो को बंद करने की अनुमति दें। – Jack

उत्तर

5

यह एक बग है जिसे .NET Framework 4.5+ के साथ तय किया गया था। दुर्भाग्यवश, हम में से उन लोगों के लिए जो पिछले संस्करणों से फंस गए हैं, त्रुटि अभी भी एक समस्या है। मैंने पाया है कि सबसे अच्छा समाधान DataGridproperties पर string टाइप करें। इस तरह, उपयोगकर्ता इनपुट पर पूर्ण नियंत्रण उपलब्ध है। पूर्ण नियंत्रण के साथ, उपयोगकर्ता किसी भी त्रुटि को ट्रिगर करने में सक्षम नहीं होना चाहिए, और DataGrid प्रोग्राम को क्रैश नहीं करेगा।

+0

मुझे .NET 4.5.1 के साथ यह सटीक समस्या है। – l33t

+0

@ l33t कभी इसे ठीक करें? मैं भी .NET 4.5 चला रहा हूं और अभी भी इसे देख रहा हूं। – MarqueIV

+2

@ जोर्डन, क्या आप इस दस्तावेज़ को लिंक कर सकते हैं जब यह ठीक से तय/संबोधित किया गया था? क्या यह 4.5 या 4.5.1, 4.5.2, आदि में था? मुझे उन खोजों पर कुछ भी नहीं मिला जो इसे संबोधित किया गया था, अकेले ही तय किया गया। – MarqueIV

8

जब आप इसकी आवश्यकता संस्करण को रद्द करने में datagrid के लिए मजबूर करने की कोशिश कर सकते हैं:

myDatagrid.CommitEdit(); 
myDatagrid.CancelEdit(); 

यह मेरे लिए काम किया, मैं ने वही समस्या जब पंक्तियों को पुन: क्रम था।

+1

आप यह कोड कहां रखते हैं? मैंने इसे इस्तेमाल किए गए बटन द्वारा उठाए गए ईवेंट पर रखने की कोशिश की है खिड़की को बंद करने के लिए, लेकिन यह मेरे लिए समस्या का समाधान नहीं करता है – FrancescoDS

+0

@ फ्रांसेस्कोड्स अरे, मुझे एक समान समस्या थी, और त्रुटि को ग्रिड.इटमससोर्स = डेटा; लाइन द्वारा ट्रिगर किया जा रहा था। मैंने सचमुच उस रेखा से ठीक पहले रखा त्रुटि उत्पन्न हुई और यह मेरे लिए काम किया - मेरे लिए यह डेटाग्रिड में एक सेल पर एक गलत डबल क्लिक के कारण हुआ था (डबल क्लिक प्रोग्राम को विश्वास था कि उपयोगकर्ता सेल की सामग्री को संपादित करने की कोशिश कर रहा था लेकिन वह नहीं था उपयोगकर्ताओं का इरादा) – ajivani

संबंधित मुद्दे