トップ回答者
TreeViewの内部処理について

質問
-
お世話になります。
TreeViewコントロールの挙動について質問致します。
◎現状説明
現在、TreeViewコントロールを使用し、以下のようなTreeViewを作成しています。
親ノードに紐付くノードは以下2つ
AAグループ と ABグループ
上記2つのグループにさらにノードが4つずつ紐付けられています。
画面起動時にTreeViewを描画し、
後は更新ボタンを押下する毎にTreeViewコントローラを初期化して、再描画しています。
開発環境は Windows 7 Pro SP1 32 Bit / VisualStudio 2010 Professional .NetFramework4.0 です。
------------------------------------------------------------------------------------------------
◎コード
更新ボタンクリック時、TreeViewを作成する箇所のみ抜粋です。
TreeView1.Nodes.Clear
For intIndex as integer = 0 to 1
'親ノードの作成
Dim strParentNm as string =String.empty
if intIndex = 0 Then
strParentNm = "AAグループ"
Else
strParentNm = "ABグループ"
End If
Dim trNode as new TreeNode(strParentNm,0,0)
trNode.tag =strParentNm.Replace("グループ",string.empty)
trNode.Text =strParentNm
'親ノードに追加
TreeView1.nodes.add(trNode) '←エラーは該当箇所でintIndex=1の時のみで発生してます。
'子ノードの作成(別関数で)
call fncMakeChildNode(trNode)
Next
****************************************************************
'子ノード作成関数
private function fncMakeChildNode(Byref trChldNode as TreeNode) As Boolean
Dim treeGrpChldNode() As TreeNode = New TreeNode(4) {}
for intChldIndex as integer = 0 to 3
treeGrpChldNode(intChldIndex) = New TreeNode("****",
3,
3 )'各子ノードに固有のTagとTextプロパティをセットする
treeGrpChldNode(intChldIndex).tag = "****"
treeGrpChldNode(intChldIndex).Text = "****"
'※ **** 部分は子ノードで重複がないように設定
Next
'グループノードに追加
trChldNode.Nodes.AddRange(treeGrpChldNode)End Function
****************************************************************
------------------------------------------------------------------------------------------------
◎相談させていただきたい事項
更新ボタンを押下してTreeViewの再描画時、20回に1度くらいの割合で、以下エラーメッセージが 表示されます。
------------------------------------------------------------------------------------------------
Just-In-Time (JIT) デバッグを呼び出すための詳細については、
ダイアログ ボックスではなく、このメッセージの最後を参照してください。
************** 例外テキスト **************
System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
場所 System.Windows.Forms.TreeView.CustomDraw(Message& m)
場所 System.Windows.Forms.TreeView.WmNotify(Message& m)
場所 System.Windows.Forms.TreeView.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
------------------------------------------------------------------------------------------------エラー発生箇所は、上記コードの『TreeView1.nodes.add(trNode) 』の部分です。
但し、上記箇所でintIndex = 1 の時のみ発生します。
尚、NullReferenceExceptionとなっていますが、TreeNodeにセットする値は正常時とエラーメッセージ表示時で違いがないことは確認しています。
上記エラーメッセージの解決方法をご教授いただけますでしょうか?
また、エラーメッセージには、TreeView.CustomDraw(Message& m) となっていますが、
上記、処理は.NET Framework内で処理されていると思われますが、
この処理の詳細を確認する手段はありますでしょうか?
以上です。ご指導の程宜しくお願い致します。
- 編集済み yamato7241 2017年6月16日 6:21
回答
-
詳しく読んでいないので外しているかもしれませんが、通常は動作しており、特に条件が変わったわけでもないが適当な頻度で発生するエラーであれば、.NET Frameworkの不具合の可能性もあります。
私もあるアプリで悩まされましたが、4.6.2のバージョンで修正されたという情報を見つけ、クライアントをそれにバージョンアップしたところ、ぴたりと不具合が収まりました。対象のクライアントは100台以上ありますので、ほぼ間違いなくそれが原因だと考えています。★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク yamato7241 2017年6月16日 9:35
-
とりあえずやってみることとしては、
- ClearからAddの完了までを、TreeView.BeginUpdate/EndUpdateで囲む
- TreeView.Nodesへの追加を最後にして(先に各々のTreeNodeを子ノードの追加含め作っておいて)、TreeView.Nodes.AddRangeで一括追加するようにする
といった辺りですかねー。
- 回答としてマーク yamato7241 2017年6月16日 9:35
すべての返信
-
詳しく読んでいないので外しているかもしれませんが、通常は動作しており、特に条件が変わったわけでもないが適当な頻度で発生するエラーであれば、.NET Frameworkの不具合の可能性もあります。
私もあるアプリで悩まされましたが、4.6.2のバージョンで修正されたという情報を見つけ、クライアントをそれにバージョンアップしたところ、ぴたりと不具合が収まりました。対象のクライアントは100台以上ありますので、ほぼ間違いなくそれが原因だと考えています。★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク yamato7241 2017年6月16日 9:35
-
早速、ご意見頂きましてありがとうございます。
やはりそうなのでしょうか。
エラーがどこで出ているのか?切り分けができていない状況でした。
自分のプログラムを100%信用しているわけではないので、
まずは自分を疑うところから始めてみたのですが(笑)
該当するようなMSDNの文書がないか、探してみたいと思います。
又、Frameworkのバージョンを上げて、同操作試してみたいと思います。
貴重なご意見本当にありがとうございました。
- 回答としてマーク yamato7241 2017年6月16日 9:35
- 回答としてマークされていない yamato7241 2017年6月16日 9:36
-
とりあえずやってみることとしては、
- ClearからAddの完了までを、TreeView.BeginUpdate/EndUpdateで囲む
- TreeView.Nodesへの追加を最後にして(先に各々のTreeNodeを子ノードの追加含め作っておいて)、TreeView.Nodes.AddRangeで一括追加するようにする
といった辺りですかねー。
- 回答としてマーク yamato7241 2017年6月16日 9:35
-
自己レスです。
Hongliangさんからご指導頂いた方法試してみました。
該当エラー今のところは確認できなくなりました。
※気まぐれに発生するエラーなので、今は抑えられているだけかもしれませんが・・・
但し、BeginUpdate / EndUpdateを使用すると、TreeViewを一括で描画する為か、
子ノードのテキストが一瞬、重なって描画されてしまいました。
これは見た目だけの問題なので、やり方を工夫してみます。
ご指導頂いた方法から、描画を瞬時に何度も行うことで、エラーが発生しているのではないか?と
考える事ができますし、ご指導頂いた方法が有効だったのかなと思います。
色々なご意見頂きまして、ありがとうございました。