3

クリーンなWindowsFormsApplicationソリューションを作成し、ToolStripをメインフォームに追加し、その上に1つのボタンを配置しました。 ToolStripButtonClickイベントには、次のように見えるように、私は、またOpenFileDialog追加しました:ToolStripボタンを2回クリックしたときにNullReferenceExceptionがスローされるのはなぜですか?openFileDialog.showDialog()?

private void toolStripButton1_Click(object sender, EventArgs e) 
{ 
    openFileDialog1.ShowDialog(); 
} 

私は他のプロパティやイベントを変更しませんでした。

面白いのは、ToolStripButton(ダイアログが開く前に2番目のクリックが速くなければならない)をダブルクリックしてから、両方のダイアログをキャンセルするか(またはファイルを選択するかどうかは関係ありません)メインフォームのクライアントエリアをクリックすると、NullReferenceExceptionがアプリケーションをクラッシュします(エラーの詳細は投稿の最後に添付されます)。 DoubleClickではありませんが、Clickイベントが実装されています。さらに奇妙なOpenFileDialogは、任意のユーザー実装の形に置き換えられたときに、よりToolStripButtonブロックが二回クリックされていることは何

私は最新のアップデートでWindows 7 Professional(MSDNAAから)で.NET3.5でVS2008を使用しています。私はVSで多くのオプションを変更しなかった(フォントサイズ、ワークスペースフォルダ、行番号のみ)。

誰もこれを解決する方法を知っていますか?私のマシンでは100%複製可能ですが、他のマシンでも同じですか?

私が考えることができる1つの解決策は、OpenFileDialog.ShowDialog()を呼び出す前にボタンを無効にしてから、ボタンを有効に戻すことです(しかし、それはうまくありません)。他のアイデア?

そして今、約束したエラーの詳細:

System.NullReferenceExceptionは
メッセージ=「オブジェクトのインスタンスに設定されていないオブジェクト参照。」未処理でした
ソース= "のSystem.Windows.Forms"
のStackTrace:のSystem.Windows.FormsでSystem.Windows.Forms.NativeWindow.WindowClass.Callbackで
(のIntPtr hWndを、のInt32 MSG、のIntPtr WPARAM、LPARAMのIntPtr)
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(のInt32 dwComponentID、のInt32で.UnsafeNativeMethods.PeekMessage(MSG & MSG、HandleRef HWND、のInt32 msgMin、のInt32 MSGMAX、のInt32削除)
理由、Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32理由、ApplicationContextコンテキスト)WindowsFormsApplication1.Program.MainでSystem.Windows.Forms.Application.Run(フォームのMainForm)でSystem.Windows.Forms.Application.ThreadContext.RunMessageLoop(のInt32理由、ApplicationContextの文脈)における

()C W: \ユーザー\ Marchewek \デスクトップ\ワークスペース\ VisualStudioを\ WindowsFormsApplication1 \のProgram.cs:ライン20
System.AppDomain._nExecuteAssemblyに(アセンブリアセンブリ、文字列[]引数)System.AppDomain.ExecuteAssemblyで
(文字列assemblyFile、証拠assemblySecurity 、String [] args)
マイクロソフトでは、VisualStudio.HostingProcess.HostProc.RunUsersAssembly()System.Threading.ThreadHelper.ThreadStart_Contextで
(オブジェクトの状態)System.Threadingで
System.Threading.ExecutionContext.Run(のExecutionContextのExecutionContext、ContextCallbackコールバック、オブジェクトの状態)で
。 ThreadHelper.ThreadStart()
のInnerException:

+0

VSオプションは無関係です。これはフレームワークのバグのようです。 – SLaks

+0

W2K3ではVS2008、W2K8ではVS2010を使用して問題を再現することができませんでした。 –

+0

また、XPsp3、VS2008、および.NET2.0または3.5を使用してreproできません – Andy

答えて

2

は、私はWindows 7のマシン上でこのような何かを複製することができました - 私は例外を得ることはありませんが、私のフォームは、もはや再描画しません。それは私が例外を飲み込まれている勝者7ボックスでデバッガで実行されていないためかもしれません。

これは私のXPマシンでは起こりません。これは、初めてtoolStripButtonを使用してダブルクリックしたときにのみ発生しました。ダイアログを正常に開いてから閉じた場合、ダブルクリックはダイアログを2回開きません。

私は何をここで起こっていることは競合状態に類似しであることを疑い- フレームワークの開発者がコードを2回入力することができることを期待していなかったが、それは戻ってメッセージループにあるため、新たな呼の発生しています。では、なぜこれが起こっているのですか?私にはバグのように見えます。

toolStripButtonのDoubleClickEnabledプロパティを有効にして、起こりにくい簡単な回避策を見つけました。ダブルクリックハンドラを実装する必要はありません。ダブルクリックをシングルクリックとして扱い、それがすべて機能します。

私は、このようにこれを処理します:

public Form1() 
    { 
     InitializeComponent(); 

     // This is a workaround for a framework bug 
     // see blah blah 
     toolStripButton1.DoubleClickEnabled = true; 

    } 

次の時間あなたはそれを削除してくださいすることができますフレームワークをアップグレードします。

ニール

0

ShowDialogメソッドはモーダルです。通常、ShowDialogが呼び出された後、ダイアログが閉じられるまで、OpenFileDialogはアプリケーションの排他UIフォーカスを持ちます。

ボタンをダブルクリックすると、フレームワークがOpenFileDialogに排他UIフォーカスを与える前に、ShowDialogをもう一度呼び出すことができます。これにより、アプリケーションが無効な状態になりました。

これは不可能ではありませんが、明らかにそれが問題です。ボタンのClickイベントを購読し、最初のクリック後にボタンを無効にする。デザイナーからOpenFileDialogを削除し、Clickハンドラでプログラムで作成します。後者の場合は、ガベージコレクションを確実にするために、ブロックでラップしてください。

private void toolStripButton1_Click(object sender, EventArgs e) 
{ 
    using(var OFD = new OpenFileDialog()) 
    { 
     OFD.ShowDialog(); 
    } 
} 
0

フレーム解像度にエラーが発生する理由の1つとして、画面解像度が考えられます。 私の場合、私は画面の解像度を変更しましたが、その解像度では問題が発生していませんでした。推奨解像度に戻ったときに問題が発生しました。