求一算法 (关于 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)}
[其他解释]
改变一个子结点状态后,在增加一步,遍历这个结点的兄弟结点,如果都完成了,再更改父结点的状态,写成递归,不管有多少级结点都行。
[其他解释]
父节点用个数值存储未完成的子节点数量,某一个子节点完成后,就将父节点的该数值减一,再判断如果为零就更新图片,并将再往上一层的父节点的数值减一并判断,直到根节点。
[其他解释]
[其他解释]
给个代码好吗?
[其他解释]
我倒想出一笨方法,每个节点都通过数据库找到子节点的ID集合,然后再3楼方法,还有更好的吗?
[其他解释]
12:30结帖,现在散分。。。
[其他解释]
@"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;
}
代码很烂,真不好意思贴出来~-`!