QA@IT

VB.NETの”オブジェクト参照がオブジェクトインスタンスに設定されていません”について

37684 PV

はじめまして、質問させていただきます。

今現在、VBにて工程管理のデータベースを作っております。
内容は、プロジェクトの進行状況をデータベース内で管理し、今現在の状況を入力したりします。
完了したプロジェクトは、そのプロジェクト名をオレンジ色で表示し、今現在手を付けているプロジェクトは青で、
まだ手を付けていないものは緑で表示させます。
そして、そのプロジェクトの進行状況をグラフにして見やすくするものを作っております。

しかし、プログラムの矢印の部分で
「オブジェクト参照がオブジェクトインスタンスに設定されていません」
というエラーが出ており、どこをどのように直せばよいかわからず作業が止まってしまっています。
このエラーの原因と、対処方法を教えてください。

よろしくお願いします。

 Private Sub TreeViewLoad()

        Dim control As New Controller
        Dim projectlist As ArrayList = control.GetProjectList 'コントローラからプロジェクト情報を取得

        Me.TreeView_Project.Nodes.Clear()

        Dim rootNode As TreeNode
        rootNode = New TreeNode()
        rootNode.Text = "プロジェクト"    'ルートノードの生成
        TreeView_Project.Nodes.Add(rootNode)


        Dim project As ProjectClass
        For Each project In projectlist 'プロジェクトをTreeNodeに追加
            Dim i As Integer = 0
 **→**    Dim myTreeNodeArray(project.ProcessList.Count - 1) As TreeNode 'プロジェクト毎の工程のTreeNode
            Dim proc As ProcessClass

            For Each proc In project.ProcessList
                proc.OKValue = control.GetOKTotalValue(proc.ProcessID)
                proc.NGValue = control.GetNGTotalValue(proc.ProcessID)

                '工程の状況、工程番号m、工程名、総良品数、総不良品数、生産予定数をTreeに表示
                myTreeNodeArray(i) = New TreeNode(proc.ProcessStat + proc.ProcessNo + _
                                                  ":" + proc.ProcessName + _
                                                  " [ " + proc.OKValue.ToString + _
                                                  "(" + proc.NGValue.ToString + ")" + _
                                                  "/" + proc.ProductValue.ToString + " ] ") '工程のTreeNodeの生成

                myTreeNodeArray(i).Tag = proc 'TreeNode毎に工程を割り当て

                '工程の状況(未着手、着手、完了)を色分け
                If proc.ProcessStat = "未着手" Then
                    myTreeNodeArray(i).ForeColor = Color.Green
                ElseIf proc.ProcessStat = "着手" Then
                    myTreeNodeArray(i).ForeColor = Color.Blue
                Else
                    myTreeNodeArray(i).ForeColor = Color.Orange

                End If

                i += 1
            Next proc
            Dim projectNode As New TreeNode(project.ProjectNo + ":" + project.ProjectName + "[" + project.Group.GroupName + "]", myTreeNodeArray)

            projectNode.ForeColor = Color.Red
            projectNode.Tag = project
            Me.TreeView_Project.Nodes(0).Nodes.Add(projectNode)  'プロジェクトをTreeNodeに追加
        Next project

        With Me.TreeView_Project
            .ExpandAll()
            .ForeColor = Color.Navy
            .BackColor = Color.Azure
            .LineColor = Color.Red
            .ContextMenuStrip = Me.ContextMenuStrip_Edit 'TreeViewを右クリックしたときのメニューの割り当て
        End With

    End Sub
コード
  • どの行でそのエラーが出るかぐらいは書けませんか? -
  • エラーが出る行の左の方に矢印をかいていたのですが、わかりにくくてすみません -
  • **→** ですね。すみません、分からなかったです。多分、project か project.ProcessList が Nothing になっているからだと思います。それが何故 Nothing になるかはアップされているコードからは分かりません。control.GetProjectList あたりの問題かなぁ・・・と想像してますが、想像の域を超えません。 -

回答

    Dim myTreeNodeArray(project.ProcessList.Count - 1) As TreeNode 'プロジェクト毎の工程のTreeNode

変数 project もしくは、project.ProcessList に値が設定されていないんじゃないでしょうか。

デバッガで↑変数の値をウオッチしてみれば確認できるはずです。

編集 履歴 (0)
Dim projectlist As ArrayList = control.GetProjectList
Dim myTreeNodeArray(project.ProcessList.Count - 1) As TreeNode

この流れからいって、Controller.GetProjectList()内で生成しているProjectClass.ProcessListがNothingなんでしょうね。
例えばイメージが
 ProjectList
  ├プロジェクト1
  │ ├工程1
  │ └工程2
  └プロジェクト2
    └工程1

というイメージだった時、プロジェクトに対して1つも工程(Process)がない時に、Processに該当するクラスなどのオブジェクトを返却していないんでしょうね。
あくまでもプロジェクトは見つかったわけだし、その工程が1つもないというだけでNothingを返しているんだと思います。

そうすると、後処理も、以下のようになりそうですが。

If project.ProcessList.Count < 1 Then
  Continue For
End If
Dim myTreeNodeArray(project.ProcessList.Count - 1) As TreeNode

仮にProcessList = Nothingになることが正しい仕様だとするならば、それを事前にチェックすることになるでしょう。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。