下面代码主要用来寻找指定标题的菜单项,问题是即使匹配了结果,也要继续循环下去!用goto?
private void GetMenuItemById(ToolStripItemCollection p_itemCollection,string p_id)
{
foreach (ToolStripMenuItem item in p_itemCollection)
{
if (item.Text == p_id)
{
result = item;
break;//不能简单通过它跳出循环
} if (item.HasDropDownItems && !bFind)
{
GetMenuItemById(item.DropDownItems, p_id);
}
}
}这种情况你们是怎么解决呀?
private void GetMenuItemById(ToolStripItemCollection p_itemCollection,string p_id)
{
foreach (ToolStripMenuItem item in p_itemCollection)
{
if (item.Text == p_id)
{
result = item;
break;//不能简单通过它跳出循环
} if (item.HasDropDownItems && !bFind)
{
GetMenuItemById(item.DropDownItems, p_id);
}
}
}这种情况你们是怎么解决呀?
解决方案 »
- 求大家提供个mvc2或者mvc3的教程。
- C# MySqlDataReader reader.Reade()读出的字符是"???",怎么解决?
- winform系统本地本机使用
- 关于自己做的记事本,求高人赐教
- 关于动态调用控件的问题....
- 初学.net,问个小问题,解决了就给分.:)
- 大家国庆节快乐!问个关于保存xml数据类型的问题。谢谢解答!
- C#中怎样访问Microsoft word2000文件?
- 特菜问题,如何随Form的改变,内部控件自动调整大小?
- Visual Studio.Net Final 版终于出来了!!!
- 关于gdi+ pen 的样式的问题!!!!
- 关于txt导入sql server( winform)
如果要继续循环,可以用循环,或者在if外层再加一层where()加以限制。
continue;进入下一轮循环,return 也能,goto也行,不过一般要少用,大家都不怎么使用
看你有个bFind标志,是不是可以这样: private void GetMenuItemById(ToolStripItemCollection p_itemCollection,string p_id)
{
foreach (ToolStripMenuItem item in p_itemCollection)
{
if(bFind)
break; //如果已经找到了,直接退出循环,也就是退出这个函数,这将导致一系列的退栈操作,直到退出这个函数
if (item.Text == p_id)
{
result = item;
bFind = true; //找到了,设置标志
break;//不能简单通过它跳出循环
} if (item.HasDropDownItems && !bFind)
{
GetMenuItemById(item.DropDownItems, p_id);
}
}
}
{
foreach (ToolStripMenuItem item in p_itemCollection)
{
if(bFind)
break; //如果已经找到了,直接退出循环,也就是退出这个函数,这将导致一系列的退栈操作,直到退出这个函数
if (item.Text == p_id)
{
result = item;
bFind = true; //找到了,设置标志
break;//不能简单通过它跳出循环
} if (item.HasDropDownItems && !bFind)
{
bFind = GetMenuItemById(item.DropDownItems, p_id);
}
}
}
{
bool isout=false;
foreach (ToolStripMenuItem item in p_itemCollection)
{
if (item.Text == p_id)
{
result = item;
isout=true;
break;//不能简单通过它跳出循环
} if (item.HasDropDownItems && !bFind)
{
GetMenuItemById(item.DropDownItems, p_id);
}
}
if (isout) return result;
}
foreach (int intNum in intNums)
{
if (intNum == 3)
{
break;
}
Console.WriteLine(intNum);
}
Console.ReadKey();
{
foreach (ToolStripMenuItem item in p_itemCollection)
{
if (item.Text == p_id)
{
result = item;
break;//不能简单通过它跳出循环
}
if (GetMenuItemById(item.DropDownItems, p_id))
break;
}
}不用什么标志的
private bool GetMenuItemById(ToolStripItemCollection p_itemCollection, string p_id)
{
foreach (ToolStripMenuItem item in p_itemCollection)
{
if (item.Text == p_id)
{
result = item;
return true;//不能简单通过它跳出循环
}
if (GetMenuItemById(item.DropDownItems, p_id))
return true;
}
return false;
}
for(;;)
for(;;)
break;
跳不出
如果把break改成return;就结束整个函数而返回.
使用goto Label 就可以去到在同一个scope下的任意一个Label:
private void GetMenuItemById(ToolStripItemCollection p_itemCollection,string p_id)
{
foreach (ToolStripMenuItem item in p_itemCollection)
{
if (item.Text == p_id)
{
result = item;
continue;//不能简单通过它跳出循环
} if (item.HasDropDownItems && !bFind)
{
GetMenuItemById(item.DropDownItems, p_id);
}
}
}
`continue跳出本次循环继续执行下一次循环```` return直接跳出,结束所以的语句`` ``goto也行,需要加标签 ```` 只是算法太多容易混淆 ````` 至于楼主到底需要什么就自己选吧 ```````
private bool ComparStaffAccessAuth(TreeNodeCollection tc)
{
bool cflag = true;
foreach (TreeNodeEx node in tc)
{
if (node.Nodes.Count > 0)
{
ComparStaffAccessAuth(node.Nodes); }
else
{
if (node.Text == "门1[1]" || node.Text == "门2[2]")
{
for (int i = 0; i < DTStaffVisitAuth.Rows.Count; i++)
{
if (DepStafftreeView.SelectedNode.Text == DTStaffVisitAuth.Rows[i]["StaffName"].ToString())
{
if (DTStaffVisitAuth.Rows[i]["Channel"].ToString() == node.ID && node.Checked ==false)
{
cflag = false; return cflag;
}
}
}
if (node.Checked == true)
{
cflag = false;
for (int j = 0; j < DTStaffVisitAuth.Rows.Count; j++)
{
if (DepStafftreeView.SelectedNode.Text == DTStaffVisitAuth.Rows[j]["StaffName"].ToString() && DTStaffVisitAuth.Rows[j]["Channel"].ToString() == node.ID)
{
cflag = true;
return cflag; }
}
}
}
}
}
return cflag;
}
这段代码,循环到最后的结果永远都是true,怎么让return的结果与条件中的return结果一致