在winCE下的应用程序,生成时没有任何错误,部署后出现如下错误:“treeview.exe  nullReferenceException 位于 treeview.Form1.SetNodename()位于 treeview.Form1.ShowTree()位于 treeview.Form1_Load() 位于 System.windows.Forms.Form.OnLoad()位于 System.windows.Forms.Form._SetVisbl()位于 System.windows.Forms.Form.Set_Visbl()...

解决方案 »

  1.   

    我的代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlServerCe;namespace treeview
    {
        public partial class Form1 : Form
        {
            //private System.Data.SqlServerCe.SqlCeCommand sqlCeSelectCommand1;
            //private System.Data.SqlServerCe.SqlCeCommand sqlCeInsertCommand1;
            //private System.Data.SqlServerCe.SqlCeConnection sqlCeConnection1;
            //private string cotegory_ID;
            //private string cotegory_FatherID;
            //private string cotegory_Name;
            //private int cotegory_CengCi;
            //private DataTable tblBom = new DataTable();
            private Real_EstatePDADataSet.Building_CotegoryDataTable tblBom = new Real_EstatePDADataSet.Building_CotegoryDataTable();
         
          
           
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                this.ShowTree();//将Cotegory表用树形图的方式显示出来
            }
            //-------------读入数据并准备显示树形图-----------------
            private void ShowTree()
            {
                tblBom.Clear();
               this.building_CotegoryTableAdapter.Fill(tblBom);
               DataView viewBom = new DataView(tblBom);//新建一个数据视图
               viewBom.RowFilter = "层次码=0";            //将数据集中的所有记录逐个根据他们之间的关系添加到树形表中去
                if (viewBom.Count > 0)
                {
                    int i = 0;//由于低层码为0的产品可能不止一个,因此设置序号,以便准确定位父项
                    foreach (DataRowView myRow in viewBom)
                    { 
                        string strName = SetNodeName(myRow["目录编号"].ToString().Trim());
                        //此处是添加前面头两个节点
                        this.treeView1.Nodes.Add(new TreeNode(strName));                    //此处初始化参数是第一个节点,然后该函数会递归添加所有子节点
                        PopulateTreeView(strName, treeView1.Nodes[i], myRow);
                        i++;
                        treeView1.SelectedNode = treeView1.Nodes[0]; //选中第一个节点 
                    }
                }
            }
            //---------根据输入的节点信息,递归调用最终添加所有的节点-----------------------
            private void PopulateTreeView(string parentPart, TreeNode parentNode, DataRowView parentRow)
            {
                string strName = "";
                DataTable tempDataTable = tblBom.Copy();
                DataView viewBom = new DataView(tempDataTable);            //筛选获得当前传递过来的节点的子项,并将其添加到树形图中
                //判断方法是:凡父项编号等于传递过来的节点的目录名称的,就是该节点的子项
                viewBom.RowFilter = "父目录编号 = '" + parentRow["目录编号"].ToString().Trim() + "'";
                //递归的添加每一个节点的所有子节点
                foreach (DataRowView myRow in viewBom)
                {
                    string cotegoryID = myRow["目录编号"].ToString().Trim();
                    strName = SetNodeName(cotegoryID);
                    TreeNode myNode = new TreeNode(strName);
                    myNode.Tag = cotegoryID;
                    parentNode.Nodes.Add(myNode);
                    //函数递归调用,将所有节点按顺序添加完毕
                    PopulateTreeView(strName, myNode, myRow);
                }
            }
            private string SetNodeName(string materialID)
            {
                string strConn = "Data Source = Real_EstatePDA.sdf;password = 'lnicynu'";
                SqlCeConnection cn = new SqlCeConnection(strConn);
                cn.Open();
                try
                {                SqlCeCommand cmd = cn.CreateCommand();
                                   cmd.CommandText = "select 目录名称 from Building_Cotegory where 目录编号='" + materialID + "'";
                    string cotegoryName = cmd.ExecuteScalar().ToString().Trim();
                    cn.Close();
                    return (cotegoryName);
                }
                catch (SqlCeException e)
                {                return (e.ToString());
                    //cn.Close();
                }
            }
            private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {        }       
        }
    }