求一算法 (关于 TreeView 的)

没花鹿 2012-11-22 11:15:21

如上图:

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

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

...全文
169 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
闪耀的瞬间 2012-11-23
  • 打赏
  • 举报
回复
不是这么写的吧。。你这样是做出来了吗? 要判断完成状态后再来改变图片吧 你都没有判断,怎么就给出了图片的路径。。不懂。 能够给全一点你的代码吗?
没花鹿 2012-11-23
  • 打赏
  • 举报
回复
引用 11 楼 zhuyu19911016520 的回复:
这只是图片的路径,我项目中的路径,我复制出来的时候没有去掉。
pictureBoxX.Image = : Image.FromFile(string.Format("{0}\\image\\未做.gif", Application.StartupPath)); Image.FromFile(string.Format("{0}\\image\\完工.gif", Application.StartupPath));
没花鹿 2012-11-23
  • 打赏
  • 举报
回复


        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;
        }
代码很烂,真不好意思贴出来~-`!
没花鹿 2012-11-23
  • 打赏
  • 举报
回复
兴许你要的是递归代码?我的业务和你的不一定一样,给你个我的框架吧:


        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
没花鹿 2012-11-23
  • 打赏
  • 举报
回复

看看上图,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));

不知我俩说的是否是同一主题,请赐教。
没花鹿 2012-11-22
  • 打赏
  • 举报
回复
引用 6 楼 zhuyu19911016520 的回复:
肯定有个值让你标识是否完成任务, 如果完成你就切换图片地址就是 if(true) {node.ImageUrl = this.SkinFolder + @"images\Org\Dept2.gif";}//(√) else {未完成的图片(X)}
@"images\\Org\\Dept2.gif"
__天涯寻梦 2012-11-22
  • 打赏
  • 举报
回复
父节点用个数值存储未完成的子节点数量,某一个子节点完成后,就将父节点的该数值减一,再判断如果为零就更新图片,并将再往上一层的父节点的数值减一并判断,直到根节点。
四惠大战僵尸 2012-11-22
  • 打赏
  • 举报
回复
改变一个子结点状态后,在增加一步,遍历这个结点的兄弟结点,如果都完成了,再更改父结点的状态,写成递归,不管有多少级结点都行。
没花鹿 2012-11-22
  • 打赏
  • 举报
回复
12:30结帖,现在散分。。。
闪耀的瞬间 2012-11-22
  • 打赏
  • 举报
回复
肯定有个值让你标识是否完成任务, 如果完成你就切换图片地址就是 if(true) {node.ImageUrl = this.SkinFolder + @"images\Org\Dept2.gif";}//(√) else {未完成的图片(X)}
没花鹿 2012-11-22
  • 打赏
  • 举报
回复
我倒想出一笨方法,每个节点都通过数据库找到子节点的ID集合,然后再3楼方法,还有更好的吗?
没花鹿 2012-11-22
  • 打赏
  • 举报
回复
引用 3 楼 huang_u 的回复:
设置变量 遍历当前完成任务节点上级节点下的所有子节点的字节点,如果全部完成 则上级节点标识完成 循环调用
给个代码好吗?
huang_u 2012-11-22
  • 打赏
  • 举报
回复
设置变量 遍历当前完成任务节点上级节点下的所有子节点的字节点,如果全部完成 则上级节点标识完成 循环调用
没花鹿 2012-11-22
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
本帖最后由 bdmh 于 2012-11-22 11:19:59 编辑 你必须有个标识来表示是否完成,所以加一个bool型变量即可,甚至你可以用node节点的tag属性值来判断
???
bdmh 2012-11-22
  • 打赏
  • 举报
回复
你必须有个标识来表示是否完成,所以加一个bool型变量即可,甚至你可以用node节点的tag属性值来判断
闪耀的瞬间 2012-11-22
  • 打赏
  • 举报
回复
这只是图片的路径,我项目中的路径,我复制出来的时候没有去掉。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧