首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求一算法 (关于 TreeView 的),该怎么处理

2012-12-14 
求一算法 (关于 TreeView 的)如上图:1。如果某一节点完成了其任务后,则:该节点自身的图片就由红X变成绿对勾

求一算法 (关于 TreeView 的)

如上图:

1。如果某一节点完成了其任务后,则:
该节点自身的图片就由红X变成绿对勾
2。如果所有的子节点都完成了其各自的任务,则:
其父节点的图片也由红X自动变成绿对勾

感觉用链表可以解决之,但貌似又增加了1倍(节点对象)的内存开销,还有更好的方案吗?


[最优解释]
本帖最后由 bdmh 于 2012-11-22 11:19:59 编辑 你必须有个标识来表示是否完成,所以加一个bool型变量即可,甚至你可以用node节点的tag属性值来判断
[其他解释]
设置变量
遍历当前完成任务节点上级节点下的所有子节点的字节点,如果全部完成
则上级节点标识完成

循环调用

[其他解释]
肯定有个值让你标识是否完成任务,
如果完成你就切换图片地址就是
if(true)
{node.ImageUrl = this.SkinFolder + @"images\Org\Dept2.gif";}//(√)
else
{未完成的图片(X)}
[其他解释]
改变一个子结点状态后,在增加一步,遍历这个结点的兄弟结点,如果都完成了,再更改父结点的状态,写成递归,不管有多少级结点都行。
[其他解释]
父节点用个数值存储未完成的子节点数量,某一个子节点完成后,就将父节点的该数值减一,再判断如果为零就更新图片,并将再往上一层的父节点的数值减一并判断,直到根节点。
[其他解释]

引用:
本帖最后由 bdmh 于 2012-11-22 11:19:59 编辑
            你必须有个标识来表示是否完成,所以加一个bool型变量即可,甚至你可以用node节点的tag属性值来判断
???
[其他解释]
引用:
设置变量
遍历当前完成任务节点上级节点下的所有子节点的字节点,如果全部完成
则上级节点标识完成

循环调用
给个代码好吗?
[其他解释]
我倒想出一笨方法,每个节点都通过数据库找到子节点的ID集合,然后再3楼方法,还有更好的吗?
[其他解释]
12:30结帖,现在散分。。。
[其他解释]
引用:
肯定有个值让你标识是否完成任务,
如果完成你就切换图片地址就是
if(true)
{node.ImageUrl = this.SkinFolder + @"images\Org\Dept2.gif";}//(√)
else
{未完成的图片(X)}
@"images\\Org\\Dept2.gif"
[其他解释]
这只是图片的路径,我项目中的路径,我复制出来的时候没有去掉。
[其他解释]
引用:
这只是图片的路径,我项目中的路径,我复制出来的时候没有去掉。

pictureBoxX.Image = :
Image.FromFile(string.Format("{0}\\image\\未做.gif", Application.StartupPath));
Image.FromFile(string.Format("{0}\\image\\完工.gif", Application.StartupPath));
[其他解释]
不是这么写的吧。。你这样是做出来了吗?
要判断完成状态后再来改变图片吧
你都没有判断,怎么就给出了图片的路径。。不懂。
能够给全一点你的代码吗?
[其他解释]

看看上图,Appllication.StartupPath是到exe的路径,没包括到gif所在的image,所以,要到下一级的文件夹里找文件,就要:
xxx.Image = Image.FromFile(string.Format("{0}\\image\\未做.gif", Application.StartupPath));
方法了,你试一下。

当任务完成后,该图片就得换成:
xxx.Image = Image.FromFile(string.Format("{0}\\image\\完工.gif", Application.StartupPath)); 

不知我俩说的是否是同一主题,请赐教。
[其他解释]
兴许你要的是递归代码?我的业务和你的不一定一样,给你个我的框架吧:


        private void checkTreeNode(int selectValue)//完成2项工作:1.按钮的操作;2:父节点的操作


        {
            bool ok = false;

            for (int i = 0; i < 15 && arrPictureBox[i].Visible == true; i++)
            {
                if (arrPictureBox[i].Tag.ToString() != "ok")
                {
                    ok = false;
                    break;
                }
                else
                    ok = true; 
            }
            if (ok == true)
            {
                buttonSubmit.Enabled = true;
                dataGridView单个.Enabled = false;
                buttonDate.Enabled = false;
            }


            string[] strID = arrLabel[selectValue].Tag.ToString().Split(',');
            Point dw = new Point();
            dw.X = int.Parse(strID[0]);
            dw.Y = int.Parse(strID[1]);
            checkParentNodeOK(dw);
        }


注:我是用数组来模拟实现treeView的,dw是“单位”,dw.X某一级的,dw.Y单位的id
[其他解释]


        private void checkParentNodeOK(Point dw)
        {
            Point _dw = ClassCommon.get上级RV(dw);

            Point[] subDW = new Point[ClassCommon.getCount(_dw)];
            ClassCommon.setSubDW(_dw, subDW);

            for (int j = 0; j < subDW.Length; j++)
            {
                Point pt = new Point();
                pt.X = subDW[j].X;


                pt.Y = subDW[j].Y;

                for (int i = 0; i < 15 && arrLabel[i].Visible == true; i++)
                {
                    Point p = new Point();
                    string[] s = arrLabel[i].Tag.ToString().Split(',');
                    p.X = int.Parse(s[0]);
                    p.Y = int.Parse(s[1]);

                    if (pt == p)
                    {
                        if (arrPictureBox[i].Tag.ToString() == "ok")
                        {
                            subDW[j].Y = 0;
                        }
                    }
                }
            }

            bool ok = true;
            for (int i = 0; i < subDW.Length; i++)
            {
                if (subDW[i].Y != 0)
                {
                    ok = false;
                    break;
                }
            }
            if (ok == true) arrPictureBox[getIndex(_dw)].Image = Image.FromFile(string.Format("{0}\\image\\完工.gif",Application.StartupPath));

        }

        private int getIndex(Point dw)
        {
            int k = 0;


            for (int i = 0; i < 15 && arrLabel[i].Visible == true; i++)
            {
                string[] s = arrLabel[i].Tag.ToString().Split(',');
                if (dw.X == int.Parse(s[0]) && dw.Y == int.Parse(s[1]))
                {
                    k = i;
                    break;
                }
            }
            return k;
        }
代码很烂,真不好意思贴出来~-`!

热点排行