1

ASPX:

<asp:Menu id ="menuBar" runat="server" Orientation="Horizontal" 
       IncludeStyleBlock="false">
        <item>
         <asp:MenuItem Text="Home"></asp:MenuItem>
         <asp:MenuItem Text="Folio">
           <asp:MenuItem Text="Nature" NavigateUrl="#" value="1"></asp:MenuItem>
           <asp:MenuItem Text="People" NavigateUrl="#" value="2"></asp:MenuItem>
         </asp:MenuItem>
         <asp:MenuItem Text="Contact">
         <asp:MenuItem Text="admin" NavigateUrl="#" value="3"></asp:MenuItem>
         </asp:MenuItem>
        </items>
</asp:Menu>

C#:

protected void page_load(object sender, eventargs e)
{
  List<tblDetal> lstDetail = objDal.GetData();
  foreach(MenuItem parent in menuBar.Items)
  {
    if(parent.ChildItems.Count > 0)
     {
       foreach(MenuItem child in parent.ChildItems)
        {
          bool showItem = false;
          foreach(var item in lstDetail)
           {
             if(convert.toint32(child.value)==item.FormId)
              {
                showItem = true;
                break;
              }
           }
          if(showItem==false)
           parent.ChildItems.Remove(child);
        }
     }
  }
}

これは、いくつかの基準に基づいてメニューから項目を削除するための私の簡単なコードでした。コンパイラが「削除」行を読み取った後、foreach ループに戻り、「コレクションが変更されました。列挙操作が実行されない可能性があります」という例外をスローします。

私はそれを理解していますが、これを修正する方法がわかりません。削除するアイテムが 1 つだけであれば、それは簡単だったでしょう。

4

1 に答える 1

1

アイテムを変更しようとして、リストからアイテムを削除しようとしています。使用中のコレクションを変更することはできません。あなたがする必要があるのは、それを一時的なリストに入れ、反復後にショーアイテムのブール値に違反する子を削除することです。

protected void Page_Load(object sender, EventArgs e)
{
   List<tblDetal> lstDetail = objDal.GetData();

   //New Code
   List<MenuItem> listOfChildrenToDelete;

   foreach(MenuItem parent in menuBar.Items)
   {
       if(parent.ChildItems.Count > 0)
       {
           //Instantiate new temporary List
           listOfChildrenToDelete = new List<MenuItem>();

           foreach(MenuItem child in parent.ChildItems)
           {
                bool showItem = false;
                foreach(var item in lstDetail)
                {
                    if(Convert.ToInt32(child.value) == item.FormId)
                    {
                       showItem = true;
                       break;
                    }
                }
                if(showItem==false)
                {
                    //Add to new temporary list
                    listOfChildrenToDelete.Add(child);
                }
            }
            //Added Code
           foreach(MenuItem childToDelete in listOfChildrenToDelete)
           {
                //Delete after you are no longer looking at that collection.
                parent.ChildItems.Remove(childToDelete);
           }
        }
    }
}

これは理にかなっていますか?

于 2013-12-18T13:46:22.910 に答える