2011-08-12 16 views
0

List of of PartsにバインドされたDataGridViewがあります。リストの最後の項目は常に「ダミー部分」です。グリッドに余分な行を作成するために、ユーザーはリストに部品を追加するために最初のセルに入力することができます。 ユーザーがx個以上の文字を特定のセルに入力すると、入力しているセルの下に検索結果を含む新しいDataGridViewが表示され(Googleの候補を少し見て)、一致の1つを選択してその部分を追加できますリストに追加します。DataGridView NullReferenceExceptionはフォーカスを失った後InitializeEditingControlValueにある

私は、EditControlShowingイベントを処理することでこれを行います。このイベントは、TextChangedのハンドラを持つTextBox変数に '編集コントロール'を割り当てます。

バグ:

私は、ユーザが下矢印キーを打つ場合、フォーカスが第二のDataGridView(検索結果)へ変更したいです。 EditControlShowingハンドラは最初に正常に動作し、フォーカスを2番目のDataGridViewに移動し、最初のDataGridViewを「見かけ上」の機能状態にします。つまり、他のすべてのイベントハンドラが機能します。しかし、EditControlShowingハンドラが2回目に起動すると、DataGridViewはInitializeEditingControlValueでNullReferenceExceptionをスローします。 エラーをスローするDataGridViewの独自の呼び出しであるため、デバッガは私のコードで "Application.Run"に移動しますが、これは役に立ちません。 しかし、私は、DataGridViewをその状態にする呼び出しと、例外がスローされる点は、最初のDataGridViewからフォーカスを奪ったときに、2番目のDataGridView(または他のコントロールそのことについては)。 しかし、ユーザーが(マウスでクリックするなどして)DataGridViewにフォーカスを変更させると、DataGridViewは問題なくそのまま残ります。

EditControlShowingのハンドラ中にDataGridViewからフォーカスを奪う理由が、後で別の方法で動作する必要がある理由を知っている人はいますか?

私はCancelEdit、更新、有効/無効などを有効に試してみた...私を助けに

任意の提案は、DataGridViewの中に何が起こっているのを確認?私は前と後のブレークポイントでそれを調べることで何も目立つものを見つけることはできません。私はどのオブジェクトがDataGridViewの独自のコードとしてnullであるかを調べる方法を知りません...

多くのおかげです。

答えて

0

OK、私は(コードがブーであるが、意味を成さなければならない)TextChangedイベントハンドラでBeginInvokeメソッドを使用して、これを解決:

//The event handler 
private def CellAsTextBoxTextChanged(sender as object, e as EventArgs): 
    ... 
    self.BeginInvoke(ShowPartSelectionArea, currentCell, _CellAsTextBox.Text) 

//The method which amongst other things, sets the focus to another control 
private def ShowPartSelectionArea(currentCell as DataGridViewCell, searchString as string): 
    ... 
    AnotherDataGridView.Focus() 
    ... 

私は以前にフォーカス(呼び出しの時点で直接BeginInvokeメソッドを使用してみました)上そのような他の制御、:

private def CellAsTextBoxTextChanged(sender as object, e as EventArgs): 
    ... 
    ShowPartSelectionArea(currentCell, _CellAsTextBox.Text) 

private def ShowPartSelectionArea(currentCell as DataGridViewCell, searchString as string): 
    ... 
    self.BeginInvoke(AnotherDataGridView.Focus()) 
    ... 

しかし、後者は最初の方法は、実際に第二の方法はないのに対し、それがない、すべてを完了するためのDataGridViewのセルを可能にするかもしれないので、動作しませんでした。

同じ問題に直面している人は、BeginInvokeをコールスタックのどこで使用しているのかお伝えしたいと思います。

関連する問題