递归TreeView构建(使用颜色)

时间:2017-01-27 09:15:41

标签: c# excel colors treeview treenode

我目前正在构建一个小型C#应用,可以让用户将一些数据从Excel转换为另一种工作表中的另一种视图。

在此数据中,有一个层次结构:Entity > Sector > Sub-Sector > Zone > ... > Room (" ......"意味着最多可以有3个额外的未命名步骤)

small view of what the data looks like

如您所见,数据基于颜色,Orange是实体,~Gray是扇区,蓝色是子扇区,白色是房间。

当用户加载Excel文件时,它还会将Worksheet名称作为实体加载并将它们添加到TreeView中;这是如何:

private void BT_load_Click(object sender, EventArgs e)
{
    Tools.SelectExcelFile(OF_xls);
    try
    {
        xlApp = new Excel.Application();
        xlWorkbook = xlApp.Workbooks.Open(LB_path.Text, 3, 1);

        Template_Metro test = new Template_Metro();
        foreach(Excel.Worksheet wSheet in xlWorkbook.Worksheets)
        {
            test.Entites.Add(new Entite(wSheet.Name));
        }
        foreach(Entite entite in test.Entites)
        {
            myTreeView.Nodes.Add(entite.Nom);
        }
     }
     catch(Exception x)
     {
        Tools.ErrorBox(x);
     }
}

在加载操作之后,用户在TreeView中选择一个节点(我们将使用CoeurDePole作为示例),并在图片上提示选择黑框中的内容。 当用户在Excel上选择数据并单击Create按钮时,应使用相应的层次结构更新树。

    //IN THE FORM CLASS
    private void BT_create_Click(object sender, EventArgs e)
    {
        if (myTreeView.SelectedNode != null)
        {
            Excel.Range selection = xlApp.Selection;
            Tools.AddNodes(selection, myTreeView);
        }
        else
        {
            MessageBox.Show("Sélectionnez une entité dans laquelle ajouter les données", "Erreur");
        }           
    }

    //IN THE STATIC TOOLS CLASS
    public static void AddNodes(Excel.Range selectedCells, 
                                TreeView treeView)
    {

        List<Color> colors = GetColors(selectedCells);

        try
        {
            /* 
            * This creates simple nodes within the selected node
            * foreach (Excel.Range cell in selection.Cells)
            * {
            *     treeView.SelectedNode.Nodes.Add(((Excel.Range)cell).Value2.ToString());
            * }
            */
        }
        catch
        {
            MessageBox.Show("Aucunes cellules sélectionnées!", "Erreur");
        }
    }

    public static List<Color> GetColors(Excel.Range selection)
    {
        List<Color> colors = new List<Color>();
        Color color;

        foreach (Excel.Range selectionCell in selection.Cells)
        {
            color = ColorTranslator.FromOle(Convert.ToInt32(selectionCell.Interior.Color));

            if (colors.Contains(color) == false)
            {
                colors.Add(color);
            }
        }

        return colors;
    }

我还创建了与Entity,Sector ...对应的简单类,每个类都包含来自较低级别层次结构的对象列表。 (例如,类实体包含一个扇区列表)。

提前感谢您提供的任何帮助,我不需要C#答案,但非常感谢一些算法帮助。 :)

艾略特

0 个答案:

没有答案