none
TreeViewの内部処理について RRS feed

  • 質問

  • お世話になります。

    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内で処理されていると思われますが、

      この処理の詳細を確認する手段はありますでしょうか?

    以上です。ご指導の程宜しくお願い致します。



    2017年6月16日 6:17

回答

  • 詳しく読んでいないので外しているかもしれませんが、通常は動作しており、特に条件が変わったわけでもないが適当な頻度で発生するエラーであれば、.NET Frameworkの不具合の可能性もあります。
    私もあるアプリで悩まされましたが、4.6.2のバージョンで修正されたという情報を見つけ、クライアントをそれにバージョンアップしたところ、ぴたりと不具合が収まりました。対象のクライアントは100台以上ありますので、ほぼ間違いなくそれが原因だと考えています。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク yamato7241 2017年6月16日 9:35
    2017年6月16日 6:40
    モデレータ
  • とりあえずやってみることとしては、

    • ClearからAddの完了までを、TreeView.BeginUpdate/EndUpdateで囲む
    • TreeView.Nodesへの追加を最後にして(先に各々のTreeNodeを子ノードの追加含め作っておいて)、TreeView.Nodes.AddRangeで一括追加するようにする

    といった辺りですかねー。

    • 回答としてマーク yamato7241 2017年6月16日 9:35
    2017年6月16日 7:39

すべての返信

  • 詳しく読んでいないので外しているかもしれませんが、通常は動作しており、特に条件が変わったわけでもないが適当な頻度で発生するエラーであれば、.NET Frameworkの不具合の可能性もあります。
    私もあるアプリで悩まされましたが、4.6.2のバージョンで修正されたという情報を見つけ、クライアントをそれにバージョンアップしたところ、ぴたりと不具合が収まりました。対象のクライアントは100台以上ありますので、ほぼ間違いなくそれが原因だと考えています。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク yamato7241 2017年6月16日 9:35
    2017年6月16日 6:40
    モデレータ
  • 早速、ご意見頂きましてありがとうございます。

    やはりそうなのでしょうか。

    エラーがどこで出ているのか?切り分けができていない状況でした。

    自分のプログラムを100%信用しているわけではないので、

    まずは自分を疑うところから始めてみたのですが(笑)

    該当するようなMSDNの文書がないか、探してみたいと思います。

    又、Frameworkのバージョンを上げて、同操作試してみたいと思います。

    貴重なご意見本当にありがとうございました。

    • 回答としてマーク yamato7241 2017年6月16日 9:35
    • 回答としてマークされていない yamato7241 2017年6月16日 9:36
    2017年6月16日 7:19
  • とりあえずやってみることとしては、

    • ClearからAddの完了までを、TreeView.BeginUpdate/EndUpdateで囲む
    • TreeView.Nodesへの追加を最後にして(先に各々のTreeNodeを子ノードの追加含め作っておいて)、TreeView.Nodes.AddRangeで一括追加するようにする

    といった辺りですかねー。

    • 回答としてマーク yamato7241 2017年6月16日 9:35
    2017年6月16日 7:39
  • ご指摘ありがとうございます。

    ご教授頂いた方法試してみます。

    エラーの原因等、ご存じありませんか?

    同じパラメーターで、発生するときとしないときがあるので、

    今後のためにも理解しておきたいのですが。

    2017年6月16日 9:35
  • 自己レスです。

    Hongliangさんからご指導頂いた方法試してみました。

    該当エラー今のところは確認できなくなりました。

     ※気まぐれに発生するエラーなので、今は抑えられているだけかもしれませんが・・・

    但し、BeginUpdate / EndUpdateを使用すると、TreeViewを一括で描画する為か、

    子ノードのテキストが一瞬、重なって描画されてしまいました。

    これは見た目だけの問題なので、やり方を工夫してみます。

    ご指導頂いた方法から、描画を瞬時に何度も行うことで、エラーが発生しているのではないか?と

    考える事ができますし、ご指導頂いた方法が有効だったのかなと思います。

    色々なご意見頂きまして、ありがとうございました。

    2017年6月19日 0:27