Почему WinForm Designer отображает сообщение «Значение не может быть нулевым. Имя параметра: контекст»? - PullRequest
11 голосов
/ 25 ноября 2011

У меня есть приложение Windows # Forms ac #, использующее .NET 3.5.

Моя машинная среда выглядит следующим образом:

  • Visual Studio 2010 Premium, SP1
  • Windows 7 Professional, SP1
  • 32-разрядный процессор

У меня есть пользовательский элемент управления, * UserControl , который содержит несколько других элементов UserControls.

Я вызываю основной UserControl в Windows Forms Designer в Visual Studio, затем начинаю щелкать различные встроенные элементы UserControls и произвольно менять некоторые свойства, например Text .Затем я нажимаю кнопку панели инструментов Сохранить .Затем я продолжаю вносить дополнительные изменения в свойства элементов управления и нажимаю Сохранить .

Через некоторое время (и это не предсказуемо) Visual Studio отобразит диалоговое окно с сообщением об ошибке..

Дизайнер WinForms отображает модальное диалоговое окно с заголовком « Microsoft Visual Studio » и двухстрочным сообщением « Значение не может быть пустым. Имя параметра: контекст "и кнопка ОК.

К сожалению, после закрытия этого диалогового окна нажатием кнопки ОК Visual Studio теперь повредила сгенерированный дизайнером код моей формы.Единственный способ восстановить мой код - из файла резервной копии.

Единственный найденный мной обходной путь - установить Localizable в false для UserControl в Свойства Окно.Это не долгосрочный обходной путь, поскольку мне нужно, чтобы этот UserControl был локализуем в нашем производственном коде.

Мой проект довольно прост, без веб-служб и т. Д.

Я пытался отладить с помощьюдругой экземпляр Visual Studio, чтобы посмотреть, смогу ли я перехватить какие-либо исключения, но исключения не генерируются.Нет отладочных выходов какой-либо важности.

Кто-нибудь еще видел эту проблему?Поиск предложений.

Дополнительная информация ...

Мне удалось успешно подключить второй экземпляр Visual Studio и определить, что действительно было выдано исключение.(Мне пришлось снять флажок с параметром отладки «Просто мой код» и включить сервер символов и т. Д.).

Видимо, когда я нажимаю Сохранить в конструкторе WinForm, a System.ArgumentNullException происходит в System.dll , в методе System.ComponentModel.Design.Serialization.ContextStack.Push (контекст объекта) .Итак, параметр context имеет значение null, что является проблемой.До сих пор не знаю, почему это происходит.

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

System.dll! System.ComponentModel.Design.Serialization.ContextStack.Push (контекст объекта) + 0x88байт
System.Design.dll! System.ComponentModel.Design.Serialization.ResourceCodeDomSerializer.ApplyCacheEntry (System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.erMesl.DesignMant.Serialization.Derialization.Serialization.Derialization.DerializeЭлементSerialization.DesignerSerializationManager}, значение объекта = {ReveilleSystem.UserInterface.BoldLabel}) + 0xf64 байта
System.Design.dll! System.Windows.Forms.Design.ControlCodeDomSerializer.Serialize (System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}, значение объекта = {ReveilleSystem.UserInterface.BoldLabel}) + 0x83 байта
System.Design.dll! System.ComponentModel.Design.Serialization.CodeDomSerializerBase.SerializeToExpression (System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerInel. }) + 0x173 байта
System.Design.dll! System.ComponentModel.Design.Serialization. .EditorBase}, System.Collections.ICollection members = {System.ComponentModel.ComponentCollection}) + 0x195 байт
System.Design.dll! System.ComponentModel.Design.Serialization.CodeDomDesignerLoader. System.Design.dll! System.ComponentModel.Design.Serialization.BasicDesignerLoader.Flush () + 0x111 байт
Microsoft.VisualStudio.Design.dll! Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.Flush () + 0xa0 байт
System.Design.dll! System.ComponentModel.Design.DesignSurface.Flush () + 0x21 байт
Microsoft.VisualStudio.Shell.Design.dll! Microsoft.VisualStudio.Shell.Design.DesignerWindowPane.OnFlush () + 0x33 байта
Microsoft.VisualStudio.Shell.Design.dll! Microsoft.VisualStudio.Shell.Design.DesignerWindowPane.Microsoft.VisualStudio.Shell.Interop.IVsBatchUpdate.FlushPendingUpdates (uint резервируется) + 0x2a байт
Microsoft.VisualStudio.Editor.Implementation.dll! Microsoft.VisualStudio.Editor.Implementation.VsTextBufferAdapter.Microsoft.VisualStudio.Shell.Interop.IVsBatchUpdate.FlushPendingUpdates (uint dwReserved 0) + Microsoft.VisualStudio.Editor.Implement.dll! uint nFormatIndex = 0) + 0x2f байт
[Родной для управляемого перехода]
msenv.dll! DllUnregisterServer () + 0x10c990 байт
[Кадры ниже могут быть неправильными и / или отсутствующими, символы не загружены для msenv.dll] msenv.dll! DllUnregisterServer () + 0x10cce8 байт
msenv.dll! DllUnregisterServer () + 0x3e1d6 байт
[Управляемый к нативному переходу]
Майкрософт.VisualStudio.Editor.Implementation.dll! [Родной для управляемого перехода]
csproj.dll! DllGetClassObject () + 0x14e87 байт msenv.dll! DllUnregisterServer () + 0x12cbc9 байт
msenv.dll! DllUnregisterServer () + 0x12c940 байт
msenv.dll! VStudioTerm () + 0x4ab22 байт
msenv.dll! VStudioMain () + 0x1bb97 байт
msenv.dll! VStudioMain () + 0x1b74c байт
msenv.dll! VStudioTerm () + 0x3ba6d байт
msenv.dll! VStudioMain () + 0x1b8e1 байт
[Управляемый к нативному переходу]
Microsoft.VisualStudio.Shell.Design.dll! Microsoft.VisualStudio.Shell.Design.Serialization.DesignerDocDataService.LockedDocData.Save () + 0xbc байт
Microsoft.VisualStudio.Shell.Design.dll! Microsoft.VisualStudio.Shell.Design.Serialization.DesignerDocDataService.Microsoft.VisualStudio.Shell.Interop.IVsRunningDocTableEvents.OnAfterSave (uint docCookie) + 0x98 by 0 [Родной для управляемого перехода]
msenv.dll! DllUnregisterServer () + 0xd6984 байта
msenv.dll! DllUnregisterServer () + 0xd68f0 байт
msenv.dll! DllUnregisterServer () + 0x12cc40 байт
msenv.dll! DllUnregisterServer () + 0x12c940 байт
msenv.dll! VStudioTerm () + 0x4ab22 байт
msenv.dll! VStudioMain () + 0x1bb97 байт
msenv.dll! VStudioMain () + 0x1b74c байт
msenv.dll! VStudioTerm () + 0x3ba6d байт
msenv.dll! VStudioMain () + 0x1b8e1 байт
msenv.dll! DllUnregisterServer () + 0x34e5c байт
msenv.dll! DllMain () + 0x5c5 байт
msenv.dll! DllMain () + 0x2609d байт
msenv.dll! DllMain () + 0x265a7 байт
msenv.dll! DllUnregisterServer () + 0x170768 байт
msenv.dll! DllUnregisterServer () + 0x1e56f8 байт
msenv.dll! DllMain () + 0x1ea7f байт
msenv.dll! DllMain () + 0x1e70b байт
msenv.dll! DllUnregisterServer () + 0x170894 байта
msenv.dll! DllUnregisterServer () + 0x378a71 байт
msenv.dll! DllUnregisterServer () + 0x378bb8 байт
msenv.dll! DllUnregisterServer () + 0x378aa1 байт
msenv.dll! 6861124f ()
[Управляемый к нативному переходу]
Microsoft.VisualStudio.Shell.10.0.dll! Microsoft.Internal.VisualStudio.PlatformUI.DataSource.Invoke (строковый глагол, объект pvaIn, выходной объект pvaOut) + 0x21 байт
Microsoft.VisualStudio.Shell.UI.Internal.dll! Microsoft.VisualStudio.PlatformUI.VsCommand.Execute (параметр объекта) + 0x29 байт PresentationFramework.dll! MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource (System.Windows.Input.ICommandSource commandSource, bool userInitiated) + 0xb4 байта
PresentationFramework.dll! System.Windows.Controls.Primitives.ButtonBase.OnClick () + 0x54 байт
PresentationFramework.dll! System.Windows.Controls.Button.OnClick () + 0x4d байт PresentationFramework.dll! System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp (System.Windows.Input.MouseButtonEventArgs e) + 0x9e байт
PresentationCore.dll! System.Windows.UIElement.OnMouseLeftButtonUpThunk (отправитель объекта, System.Windows.Input.MouseButtonEventArgs e) + 0x6c байт PresentationCore.dll! System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (System.Delegate genericHandler, объект genericTarget) + 0x31 байт
PresentationCore.dll! System.Windows.RoutedEventArgs.InvokeHandler (обработчик System.Delegate, цель объекта) + 0x29 байт
PresentationCore.dll! System.Windows.RoutedEventHandlerInfo.InvokeHandler (цель объекта, System.Windows.RoutedEventArgs routedEventArgs) + 0x3e байт
PresentationCore.dll! System.Windows.EventRoute.InvokeHandlersImpl (источник объекта = {Microsoft.VisualStudio.PlatformUI.VsButton}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}, bool reRaised true) 0
PresentationCore.dll! System.Windows.UIElement.ReRaiseEventAs (System.Windows.DependencyObject sender = {Microsoft.VisualStudio.PlatformUI.VsButton}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventWgs}., System. RoutedEvent newEvent) + 0x114 байта
PresentationCore.dll! System.Windows.UIElement.OnMouseUpThunk (отправитель объекта, System.Windows.Input.MouseButtonEventArgs e) + 0xc5 байт
PresentationCore.dll! System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (System.Delegate genericHandler, объект genericTarget) + 0x31 байт
PresentationCore.dll! System.Windows.RoutedEventArgs.InvokeHandler (обработчик System.Delegate, цель объекта) + 0x29 байт
PresentationCore.dll! System.Windows.RoutedEventHandlerInfo.InvokeHandler (цель объекта, System.Windows.RoutedEventArgs routedEventArgs) + 0x3e байт
PresentationCore.dll! System.Windows.EventRoute.InvokeHandlersImpl (источник объекта = {Microsoft.VisualStudio.PlatformUI.VsButton}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}, bool reRaised = 0) false
PresentationCore.dll! System.Windows.UIElement.RaiseEventImpl (System.Windows.DependencyObject sender = {Microsoft.VisualStudio.PlatformUI.VsButton}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEvent0x79 байт PresentationCore.dll! System.Windows.UIElement.RaiseTrustedEvent (System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}) + 0x41 байт PresentationCore.dll! System.Windows.UIElement.RaiseEvent (System.Windows.RoutedEventArgs args, bool доверено) + 0x2c байт
PresentationCore.dll! System.Windows.Input.InputManager.ProcessStagingArea () + 0x1ff байт
PresentationCore.dll! System.Windows.Input.InputManager.ProcessInput (System.Windows).Input.InputEventArgs input) + 0x45 bytes PresentationCore.dll! System.Windows.Input.InputProviderSite.ReportInput (System.Windows.Input.InputReport inputReport) + 0x62 байта
PresentationCore.dll! System.Windows.Interop.HwndMouseInputProvider.ReportInput (System.IntPtr hwnd,.Windows.Input.InputMode mode, int timestamp, действия System.Windows.Input.RawMouseActions, int x, int y, int wheel) + 0x2c2 байта PresentationCore.dll! System.Windows.Interop.HwndMouseInputProvider.FilterMessage (System.IntPtr hwnd= 1837128, MS.Internal.Interop.WindowMessage msg = WM_LBUTTONUP, System.IntPtr wParam = 0, System.IntPtr lParam = 2293872, ref bool handled = false) + 0x67d байт
PresentationCore.dll! System.Windows.Interop.HwndSource.InputFilterMessage (System.IntPtr hwnd = 1837128, int msg = 514, System.IntPtr wParam = 0, System.IntPtr lParam = 2293872, ref bool handled = false) + 0x75 байт WindowsBase.dll! MS.Wrac.nd(System.IntPtr hwnd = 1837128, int msg = 514, System.IntPtr wParam = 0, System.IntPtr lParam =2293872, ref bool handled = false) + 0xbe байтов
WindowsBase.dll! MS.Win32.HwndSubclass.DispatcherCallbackOperation (объект o) + 0x7d байтов
WindowsBase.dll! System.Windows.Threading.ExceptionWrapper.InternalRealCall (системаОбратный вызов .Delegate, аргументы объекта, int numArgs) + 0x53 байта WindowsBase.dll! MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (source source = {System.Windows.Threading.Dispatcher}, метод System.Delegate, аргументы объекта, int numArgs, System.Delegate catchHandler = null) + 0x42 байта WindowsBase.dll! System.Windows.Threading.Dispatcher.InvokeImpl (приоритет System.Windows.Threading.DispatcherPriority, время ожидания System.TimeSpan, метод System.Delegate, аргументы объекта, int numArgs)+ 0xb4 байта
WindowsBase.dll! MS.Win32.HwndSubclass.SubclassWndProc (System.IntPtr hwnd = 1837128, int msg = 514, System.IntPtr wParam = 0, System.IntPtr lParam = 229384) * 11x10 *1110* 1110 *1110* 1110 *1110* 1110 *1110* 1110 *1110* 1110 *1110* 1110 *1110* 1110 *1110* 1110 *1110* 1110 *1110* 1110 *1110* 1110 *1110* 1110 *1110* 1110 * 1110user32.dll! gapfnScSendMessage () + 0x1cf bytes
user32.dll! gapfnScSendMessage () + 0x2cf bytes
user32.dll! gapfnScSendMessage () + 0x901 байт
user32.dll! DispatchMessageW () + 0xf байт
msenv.dll! DllGetClassObject () + 0x37521 байт
msenv.dll! DllGetClassObject (DllGetClassObject ()+ 0x375aa байт
msenv.dll! DllCanUnloadNow () + 0x190f байт msenv.dll! DllCanUnloadNow () + 0x1840 байт msenv.dll! DllCanUnloadNow () + 0x17a1 байт msenv.dll!DllCanUnloadNow () + 0x16b0 байт msenv.dll! VStudioMain () + 0x78 байт
devenv.exe! 2fcb0637 ()
devenv.exe! 2fcb0fd4 ()
devenv.exe! 2fc2020d8 ()
.exe! 2fcb2148 ()
devenv.exe! 2fcbea7f ()
kernel32.dll! BaseThreadInitThunk () + 0x12 байт
ntdll.dll! RtlInitializeExceptionChain () + 0xef байт
ntdll.dll! RtlInitializeExceptionChain () + 0xc2 байта

[Update2]

Мне кажется, я нашел причину своей проблемы.

Основываясь на предложениях SLaks, я пересмотрел файл X.Designer.cs , связанный с моим UserControl.В X.Designer.cs было объявлено несколько других элементов управления (флажок, метки и т. Д.), Но на самом деле они не отображались в пользовательском интерфейсе.Я подозреваю, что когда я разрабатывал свой UserControl с помощью редактора WinForm, я, вероятно, прошел несколько циклов добавления / удаления дочерних элементов управления, и в какой-то момент некоторые из этих дочерних элементов управления были потеряны в файле X.Designer.cs.Я вернулся к нелокализованной версии моего UserControl ( Localizable = False ), затем удалил все осиротевшие дочерние элементы управления, затем перекомпилировал, затем открыл UserControl в WinForm Designer, затем вернул Localizable обратно в Trueи все сохранил.Кажется, сейчас это работает.Я обновлю это в будущем, если это не будет решением.

Ответы [ 2 ]

6 голосов
/ 25 ноября 2011

У вас есть код в обработчике событий в элементе управления, который ссылается на остальную часть вашего приложения.
Когда элемент управления используется в конструкторе, этот код завершается ошибкой (поскольку остальная часть кода не выполняется) и выдает исключение.

Вам нужно проверить if (DesignMode) и не запускать такую ​​логику в конструкторе.

Чтобы помочь найти проблему, вы можете запустить вторую копию Visual Studio, прикрепить отладчик к первой копии и установить Разбить все исключения .

1 голос
/ 02 октября 2014

Одной из возможных причин является то, что свойство Text для метки внутри TableLayoutPanel должно быть пустым. Этот элемент управления не может быть выбран, так как он имеет нулевой размер в окне. Вы можете найти причину этой и других подобных ошибок, сравнив текст хороших и плохих версий файлов * .Designer.vb или .cs. Если ошибка не позволяет сохранить поврежденный файл, вы можете использовать команду copy - paste для получения копии во временный текстовый файл. Сравните, используя Notepad ++ или старый DOS-фк или тому подобное.

Редактировать: Один из приемов состоит в том, чтобы пару раз нажать Отменить в окне «Формы», а затем повторить для того же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...