2016-08-16 115 views
0

我想从Access数据库表填充树状图。从Access数据库填充树状图

这个想法是将省作为父节点,然后将城市作为子节点,然后将郊区作为该子节点的子节点。

我已经有一些代码,但arrParentType = nParent.Tag.Split("=");不会工作,我不知道为什么。

有人能帮我解决这个问题吗?

void tvProvincesFill() 
{ 
    OleDbConnection con = new OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = E:\Users\Me\Documents\C# Projects\MyProject1\Data\database.accdb; Persist Security Info =False;"); 

    OleDbDataReader treeProvince; 
    OleDbCommand cmdSelectProvinces = new OleDbCommand(("SELECT Province.Province_Code, Province.Province_name " + ("FROM (Province) " + ("GROUP BY Province.Province_Code, Province.Province_name " + ("HAVING Province.Province_name<>\' \' " + "ORDER BY Province.Province_name")))), con); 
    if ((con.State != ConnectionState.Open)) 
    { 
     con.Open(); 
    } 

    treeView1.Nodes.Clear(); 
    treeProvince = cmdSelectProvinces.ExecuteReader(); 
    while (treeProvince.Read()) 
    { 
     TreeNode nProvince = new TreeNode(); 
     nProvince.Text = treeProvince["Province_name"].ToString(); 
     nProvince.Tag = ("Province_Code=" + treeProvince["Province_Code"].ToString()); 
     this.treeView1.Nodes.Add(nProvince); 
     tvProvincesLoadChildNodes(nProvince); 
     // Load City and suburb info for current province 
     nProvince = null; 
    } 

    // frmMain.lblProvince.BackColor = Color.Empty 
    treeProvince = null; 
    cmdSelectProvinces = null; 
} 

// Fill Provinces for Geographic Criteria 
void tvProvincesLoadChildNodes(TreeNode nParent) 
{ 
    // Load City and Suburb sub nodes for Provinces 
    string[] arrParentType; 
    arrParentType = nParent.Tag.Split("="); 
    if ((arrParentType[0] == "Province_Code")) 
    { 
     // Add City sub-nodes 
     OleDbDataReader drCities; 
     OleDbCommand cmdGetCities = new OleDbCommand(("SELECT Area_File.City " + ("FROM (Area_File) " + ("GROUP BY Area_File.City, Area_File.Province_Code " + ("HAVING Area_File.City<>\' \' AND Area_File.Province_Code=" 
         + (arrParentType[1] + " ORDER BY Area_File.City"))))), con); 
     drCities = cmdGetCities.ExecuteReader(); 
     while (drCities.Read()) 
     { 
      TreeNode nCity = new TreeNode(); 
      nCity.Text = drCities["City"].ToString(); 
      nCity.Tag = ("City=" + drCities["City"].ToString()); 
      nParent.Nodes.Add(nCity); 
      tvProvincesLoadChildNodes(nCity); 
      // Load Suburbs for current city node 
      nCity = null; 
     } 

     drCities = null; 
     cmdGetCities = null; 
    } 
    else if ((arrParentType[0] == "City")) 
    { 
     // Add Suburb sub-nodes 
     OleDbDataReader drSuburbs; 
     OleDbCommand cmdGetSuburbs = new OleDbCommand(("SELECT Area_File.Suburb " + ("FROM (Area_File) " + ("GROUP BY Area_File.Suburb, Area_File.City " + ("HAVING Area_File.Suburb<>\' \' AND Area_File.City=\'" 
         + (arrParentType[1] + ("\'" + " ORDER BY Area_File.Suburb")))))), con); 
     drSuburbs = cmdGetSuburbs.ExecuteReader(); 
     while (drSuburbs.Read()) 
     { 
      TreeNode nSuburb = new TreeNode(); 
      nSuburb.Text = drSuburbs["Suburb"].ToString(); 
      nSuburb.Tag = ("Suburb=" + drSuburbs["Suburb"].ToString()); 
      nParent.Nodes.Add(nSuburb); 
      nSuburb = null; 
     } 

     drSuburbs.Close(); 
     cmdGetSuburbs = null; 
    } 

    arrParentType = null; 
} 

回答

0

我看到两件事情会阻碍代码的工作:

  1. TreeNode.Tag是一个对象,不能分割。您需要首先使用ToString()将其转换为字符串。

  2. 分割功能需要一个字符作为参数。你正在给它提供一个字符串。使用.Split('=')代替.Split(“=”)。

如果你改变,你的标签拆分到行:

arrParentType = nParent.Tag.ToString().Split('='); 

它应该工作的罚款。

希望这会有所帮助。