从Access数据库填充Treeview

本文关键字:Treeview 填充 数据库 Access | 更新日期: 2023-09-27 18:02:29

我正在尝试从Access Database表中填充Treeview。

思路是将省作为父节点,然后将城市作为子节点,然后将郊区作为该子节点的子节点。

我已经有了一些代码,但是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;
}

从Access数据库填充Treeview

我看到两件事会阻止代码工作:

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

  2. split函数需要一个字符作为参数。你给它提供了一个字符串。使用。split('=')代替。split("=")。

如果你将分隔标签的行改为:

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

应该没问题。