なぜWinFormデザイナはメッセージ "値はnullではありません。パラメータ名:コンテキスト"を表示しますか?

.NET 3.5を使用しているC#Windows Formsアプリケーションがあります。

私のマシン環境は以下の通りです:

  • Visual Studio 2010 Premium、SP1
  • Windows 7 Professional、SP1
  • 32ビットプロセッサ

私はいくつかの他のUserControlsを含む UserControl - 誘導カスタムコントロールを持っています。

Visual StudioのWindowsフォームデザイナでメインのUserControlを表示してから、さまざまな埋め込みUserControlsをクリックし、 Text のようなプロパティをランダムに変更します。 [保存]ツールバーボタンをクリックします。その後、コントロールのプロパティをさらに変更して、[保存]をクリックします。

ある時点で(これは予測できません)、Visual Studioはエラーダイアログを表示します。

WinFormsデザイナは、 " Microsoft Visual Studio "のタイトルと "値はnullにできません。パラメータ名:コンテキスト"という2行のメッセージを持つモーダルダイアログを表示します。 OKボタンがあります。

残念ながら、OKボタンをクリックしてこのダイアログを閉じると、Visual Studioはフォームのデザイナ生成コードを破損しています。私のコードを復元する唯一の方法は、バックアップファイルからです。

私が見つけた唯一の回避策は、 Properties ウィンドウのUserControlの Localizable false に設定することです。このUserControlをプロダクションコードでローカライズできるようにするためには、長期的な回避策ではありません。

私のプロジェクトはかなりシンプルで、Webサービスもありません。

私は、Visual Studioの別のインスタンスを使用してデバッグしようとしましたが、例外を捕捉できるかどうかを確認していますが、例外は生成されません。重要度の高いデバッグ出力はありません。

他に誰もこの問題を見たことがありますか?提案を探しています。

詳細情報...

Visual Studioの2番目のインスタンスを正常にアタッチして、実際に例外がスローされたことを確認できました。 (私は "Just My Code"デバッグオプションのチェックを外し、シンボルサーバなどを有効にしなければならなかった)。

どうやら、WinFormデザイナーで[保存]をクリックすると、システム System.dll System.ArgumentNullException ComponentModel.Design.Serialization.ContextStack.Push(オブジェクトコンテキスト)したがって、コンテキストパラメータはnullです。これが問題です。これがなぜ起こっているのかまだまだわかりません。

ここにスタックトレースがあります:

RaiseEventImpl(System.Windows.DependencyObject sender = {Microsoft.VisualStudio.PlatformUI.VsButton}、System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs})+ 0x79バイト       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 trusted)+ 0x2cバイト
      PresentationCore.dll!System.Windows.Input.InputManager.ProcessStagingArea()+ 0x1ff bytes
      PresentationCore.dll!System.Windows.Input.InputManager.ProcessInput(System.Windows.Input.InputEventArgs入力)+ 0x45バイト       PresentationCore.dll!System.Windows.Input.InputProviderSite.ReportInput(System.Windows.Input.InputReport inputReport)+ 0x62バイト
      PresentationCore.dll!System.Windows.Interop.HwndMouseInputProvider.ReportInput(System.IntPtr hwnd、System.Windows.Input.InputModeモード、intタイムスタンプ、System.Windows.Input.RawMouseActionsアクション、int x、int y、intホイール)+ 0x2c2バイト       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.Win32.HwndWrapper.WndProc(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(System.Delegateコールバック、オブジェクトargs、int numArgs)+ 0x53バイト       WindowsBase.dll!MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(オブジェクトソース= {System.Windows.Threading.Dispatcher}、System.Delegateメソッド、オブジェクトargs、int numArgs、System.Delegate catchHandler = null)+ 0x42バイト       WindowsBase.dll!System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority priority、System.TimeSpanタイムアウト、System.Delegateメソッド、オブジェクトargs、int numArgs)+ 0xb4バイト
      WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd = 1837128、int msg = 514、System.IntPtr wParam = 0、System.IntPtr lParam = 2293872)+ 0x104バイト
      user32.dll!gapfnScSendMessage()+ 0x1cfバイト
      user32.dll!gapfnScSendMessage()+ 0x2cfバイト
      user32.dll!gapfnScSendMessage()+ 0x901バイト
      user32.dll!DispatchMessageW()+ 0xfバイト
      msenv.dll!DllGetClassObject()+ 0x37521バイト
      msenv.dll!DllGetClassObject()+ 0x375aaバイト
      msenv.dll!DllCanUnloadNow()+ 0x190fバイト       msenv.dll!DllCanUnloadNow()+ 0x1840バイト       msenv.dll!DllCanUnloadNow()+ 0x17a1バイト       msenv.dll!DllCanUnloadNow()+ 0x176eバイト       msenv.dll!DllCanUnloadNow()+ 0x16b0バイト       msenv.dll!VStudioMain()+ 0x78バイト
      devenv.exe!2fcb0637()
      devenv.exe!2fcb0fd4()
      devenv.exe!2fcb20d8()
      devenv.exe!2fcb2148()
      devenv.exe!2fcbea7f()
      kernel32.dll!BaseThreadInitThunk()+ 0x12バイト
      ntdll.dll!RtlInitializeExceptionChain()+ 0xefバイト
      ntdll.dll!RtlInitializeExceptionChain()+ 0xc2バイト

[Update2]

私は自分の問題の理由を見つけたと思う。

SLakの提案に基づいて、私は自分のUserControlに関連付けられた X.Designer.cs ファイルを再調査しました。 X.Designer.csで宣言された他のコントロール(チェックボックス、ラベルなど)がいくつかありましたが、実際にUIに表示されませんでした。私はWinFormエディタを使ってUserControlを開発していたのですが、子コントロールを追加/削除するサイクルがいくつかあり、X.Designer.csファイルでこれらの子コントロールの一部が孤立していると思われます。私は自分のUserControl( Localizable = False )のローカライズされていないバージョンに戻り、次に孤立した子コントロールをすべて削除してから、再コンパイルして、WinForm DesignerでUserControlを開き、Localizableを真実であり、すべてを救った。これは今働いているようだ。これが解決策ではない場合、私はこれを将来更新します。

11

2 答え

他のアプリケーションを参照するコントロールのイベントハンドラにコードがあります。
デザイナでコントロールを使用すると、このコードは失敗し(コードの残りが実行されていないため)、例外がスローされます。

if(DesignMode)をチェックし、そのようなロジックをデザイナーで実行する必要はありません。

問題を見つけるために、Visual Studioの2番目のコピーを開始し、デバッガを最初のコピーにアタッチし、すべての例外にブレークを設定することができます。

6
追加された
@ハザ:いいえ。 VS 捕捉が例外であるためです。すべての例外でブレークを設定する必要があります。
追加された 著者 SLaks,
それは例外なので、それは非常に奇妙です。間違ったタイプのコードをデバッグしているかもしれません(例えば、アンマネージド)。ダイアログが表示されたら、デバッガを一時停止し、意味のあるスレッドと呼び出しスタックを確認できるようにします。
追加された 著者 SLaks,
それは非常に奇妙です。予期しない時間にプロパティを変更するロジックがありますか?
追加された 著者 SLaks,
残念ながら、私の投稿が既に述べたように、別のVisual Studioのデバッグでは例外が発生しなかったので、私のコードはエラーの原因ではないと推測していますが、Visual Studioにとっては内部的なものです。また、ローカリゼーションプロパティを変更すると、その動作が変更されるのはなぜですか?まだ謎。
追加された 著者 ahazzah,
私は同じことを話していると信じています。 Visual Studioの2番目のインスタンスでDebug/Exceptionsメニュー項目をクリックした後、例外ダイアログが表示されたら、キャッチされているかどうかにかかわらず、例外がスローされたときにデバッガが破損するようにすべてのオプションをチェックしました。だから "Break On All Exceptions"が実際に効力を発揮しています。
追加された 著者 ahazzah,
あなたのコメントは、私がそれを守るように奨励しました。私はついに例外情報を捕まえることができました。質問への更新を参照してください。
追加された 著者 ahazzah,

考えられる原因の1つは、TableLayoutPanel内のラベルのTextプロパティを空にしているようです。ウィンドウ内のサイズがゼロであるため、そのコントロールを選択することはできません。 * .Designer.vbまたは.csファイルの良品バージョンと悪いバージョンのテキスト比較を行うことで、これと他の同様のエラーの原因を見つけることができます。エラーが原因で不良ファイルを保存できない場合は、コピー&ペーストを使用して一時テキストファイルにコピーを取得できます。メモ帳++や古いDOSのfcなどを使って比較してください。

編集:1つのトリックは、[フォーム]ウィンドウで[元に戻す]を2回押してから同じ操作をやり直すことです。

1
追加された