PDA

View Full Version : حرفه ای: بدست آوردن زیر منوهای یک منو



رامین مرادی
دوشنبه 04 دی 1396, 14:20 عصر
وقت بخیر دوستان
من با کد زیر منوهای یک فرم رو چک میکنم و عملیات مد نظرم رو انجام میدم. حالا ممکنه هر منویی زیر منویی هم داشته باشه . اونارو چجوری میشه بدست آورد؟؟:متفکر:



foreach (var item in radMenu1.Items)
{
if (_CheckPermission.CheckAccess(item.Tag.ToString()) )
{
item.Visibility = Telerik.WinControls.ElementVisibility.Visible;

}
else
{
item.Visibility = Telerik.WinControls.ElementVisibility.Collapsed;
}

}

mr.sirwan
دوشنبه 04 دی 1396, 15:08 عصر
من تا حالا از radmenu استفاده نکردم، دقیق نمیدونم زیرمنو هاش رو چجوری پیاده سازی میکنه اما در حالت کلی شما از ساختار بازگشتی استفاده کنین، یک متد تعریف کنین که یک ورودی از نوع item میگیره، و داخلش چک کنین مثلا item.items.count مخالف صفره؟ اگر مخالف صفر بود داخل خود متد، دوباره متد رو فراخوانی کنین با ورودی Item.items[0] اما اگر صفر بود، عملیات مورد نظر رو انجام بدین، بعد از نوشتن این متد، بیاین داخل همون foreach اصلی، متد رو به ازای هر ایتم فراخوانی کنین

sg.programmer
دوشنبه 04 دی 1396, 17:11 عصر
سلام
از این استفاده کن - بصورت کامل قرار میدم

//افزودن آیتمهای منو به تری ویو
foreach (ToolStripMenuItem menuItem in ms.Items)
{
treeView1.Nodes.Add(menuItem.Text);
int currentNode = Convert.ToInt32(treeView1.Nodes.Count - 1);
if (menuItem is ToolStripMenuItem)
{
foreach (ToolStripItem dropDown in menuItem.DropDownItems)
{
if (!(dropDown is ToolStripSeparator) && (dropDown is ToolStripItem))
{
int currentChildNode = Convert.ToInt32(treeView1.Nodes[currentNode].Nodes.Count);
treeView1.Nodes[currentNode].Nodes.Add(dropDown.ToString());
if (dropDown is ToolStripMenuItem)
{
ToolStripItemCollection subCollction = ((ToolStripMenuItem)dropDown).DropDownItems;
foreach (ToolStripItem subDropDown in subCollction)
{
if (!(subDropDown is ToolStripSeparator) && (subDropDown is ToolStripItem))
{
treeView1.Nodes[currentNode].Nodes[currentChildNode].Nodes.Add(subDropDown.ToString());
}
}
}

}
}
}
}

danialafshari
سه شنبه 05 دی 1396, 01:53 صبح
با سلام
توی تلریک رو نمیدونم ولی استاندارد به این شکله:

private IEnumerable<ToolStripMenuItem> GetItems(ToolStripMenuItem item)
{
foreach (ToolStripMenuItem dropDownItem in item.DropDownItems)
{
if (dropDownItem.HasDropDownItems)
{
foreach (ToolStripMenuItem subItem in GetItems(dropDownItem))
yield return subItem;
}
yield return dropDownItem;
}
}


List<ToolStripMenuItem> allItems = new List<ToolStripMenuItem>();
private void btnLoad_Click(object sender, EventArgs e)
{

foreach (ToolStripMenuItem toolItem in menuStrip1.Items)
{
allItems.Add(toolItem);
//add sub items
allItems.AddRange(GetItems(toolItem));
}
}

می تونید از allItems استفاده کنید
تنها مشکلش اینه که نباید در منو Separator (خط جدا کننده) داشته باشه
موفق باشید

رامین مرادی
سه شنبه 05 دی 1396, 09:15 صبح
ممنون دوست عزیز جالبه که نه خاصیت DropDownItems داره نه خاصیت items
درصورتی که لینکی هم در مورد این موضوع پیدا کردید ممنون میشم راهنماییم کنید. روش بازگشتی خیلی خوبه به نظرم. اینجوری زیر منو ها هم راحت پیدا میشه.

رامین مرادی
سه شنبه 05 دی 1396, 09:30 صبح
از همه دوستان تشکر میکنم.
حل شد کافی بود به جای var از RadMenuItem استفاده میکردم.

محمد آشتیانی
سه شنبه 05 دی 1396, 09:43 صبح
تنها مشکلش اینه که نباید در منو Separator (خط جدا کننده) داشته باشه

سلام
اینجوری ارور نمیده



private IEnumerable<ToolStripMenuItem> GetItems(ToolStripMenuItem item)
{
foreach (ToolStripMenuItem dropDownItem in item.DropDownItems.OfType<ToolStripMenuItem>())
{
if (dropDownItem.HasDropDownItems)
{
foreach (ToolStripMenuItem subItem in GetItems(dropDownItem).OfType<ToolStripMenuItem>())
yield return subItem;
}


yield return dropDownItem;
}
}