2013-12-12 60 views
-5

我正在隨機獲取下面的異常。工具欄菜單是動態創建的。System.ArgumentOutOfRangeException Toolstrip菜單

System.ArgumentOutOfRangeException - Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 
at System.Collections.ArrayList.get_Item(Int32 index) 
at System.Windows.Forms.Layout.ArrangedElementCollection.get_Item(Int32 index) 
at System.Windows.Forms.Layout.FlowLayout.xLayoutRow(ContainerProxy containerProxy, ElementProxy elementProxy, Int32 startIndex, Int32 endIndex, Rectangle rowBounds, Int32& breakIndex, Boolean measureOnly) 
at System.Windows.Forms.Layout.FlowLayout.xLayout(IArrangedElement container, Rectangle displayRect, Boolean measureOnly) 
at System.Windows.Forms.Layout.FlowLayout.GetPreferredSize(IArrangedElement container, Size proposedConstraints) 
at System.Windows.Forms.ToolStripDropDownMenu.ToolStripDropDownLayoutEngine.GetPreferredSize(IArrangedElement container, Size proposedConstraints) 
at System.Windows.Forms.ToolStrip.GetPreferredSizeCore(Size proposedSize) 
at System.Windows.Forms.Control.GetPreferredSize(Size proposedSize) 
at System.Windows.Forms.ToolStripDropDown.GetSuggestedSize() 
at System.Windows.Forms.ToolStripDropDown.AdjustSize() 
at System.Windows.Forms.ToolStripDropDownMenu.OnLayout(LayoutEventArgs e) 
at System.Windows.Forms.Control.PerformLayout(LayoutEventArgs args) 
at System.Windows.Forms.Control.System.Windows.Forms.Layout.IArrangedElement.PerformLayout(IArrangedElement affectedElement, String affectedProperty) 
at System.Windows.Forms.ToolStripItem.InvalidateItemLayout(String affectedProperty, Boolean invalidatePainting) 
at System.Windows.Forms.ToolStripDropDownItem.OnRightToLeftChanged(EventArgs e) 
at System.Windows.Forms.ToolStripItem.OnOwnerChanged(EventArgs e) 
at System.Windows.Forms.ToolStripMenuItem.OnOwnerChanged(EventArgs e) 
at System.Windows.Forms.ToolStripItem.SetOwner(ToolStrip newOwner) 
at System.Windows.Forms.ToolStripItemCollection.SetOwner(ToolStripItem item) 
at System.Windows.Forms.ToolStripItemCollection.Add(ToolStripItem value) 

以下方法發生異常。它發生在一個項目被添加到mnuRoot。在所選項目的右鍵單擊時調用此方法。

private static void BuildMenu(ToolStripMenuItem root, XMLSerItem mnuItem, ToolStrip mnuRoot, Dictionary<string, Image> dctIcons, CustomMenuClickHandler dlgEventHandler, ToolStripMenuItem mnuAddAfter, bool bHideDisabled) 
     { 
      if(root == null) 
      { 
       // Try to find an existing menu item 
       ToolStripItem mnuMerge = FindMenuItem(mnuRoot.Items, mnuItem); 
       if(mnuMerge == null) 
       { 
        lock(mnuRoot.Items) 
        { 
          if (mnuAddAfter == null) 
          {    
           mnuRoot.Items.Add(item); 
          } 
          else 
          { 
           mnuRoot.Items.Insert(mnuRoot.Items.IndexOf(mnuAddAfter), item); 
          } 

        } 
       } 
       else 
       { 
        // Use a reference to the found item 
        item = mnuMerge; 
       } 
      } 
      else 
      { 
       // Try to find an existing menu item 
       ToolStripItem mnuMerge = FindMenuItem(root.DropDownItems, mnuItem); 
       if(mnuMerge == null) 
       { 
        lock(root.DropDownItems) 
        { 
         // Add the menu item to the root item 
         root.DropDownItems.Add(item); 
        } 
       } 
       else 
       { 

        item = mnuMerge; 
       } 
      }   
     } 
} 
+4

給我們更多的細節。上下文請?當你遇到這個錯誤時,你會做什麼? –

+2

所以這是非常難以解決的朋友。沒有上下文中的代碼,錯誤對我們來說並不意味着什麼。那有意義嗎? –

+0

請向我們顯示您的代碼。否則,我們不能幫助。 – kviiri

回答

0

。雖然這個問題是downvoted很好的理由,它是唯一打我得到了,而google搜索「xLayoutRow ArgumentOutOfRangeException「,所以我仍然會在這裏分享我的經驗。

我遇到的堆棧跟蹤在這篇文章頂部有例外:

System.ArgumentOutOfRangeException - Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 
at System.Collections.ArrayList.get_Item(Int32 index) 
at System.Windows.Forms.Layout.ArrangedElementCollection.get_Item(Int32 index) 
at System.Windows.Forms.Layout.FlowLayout.xLayoutRow(ContainerProxy containerProxy, ElementProxy elementProxy, Int32 startIndex, Int32 endIndex, Rectangle rowBounds, Int32& breakIndex, Boolean measureOnly) 
at System.Windows.Forms.Layout.FlowLayout.xLayout(IArrangedElement container, Rectangle displayRect, Boolean measureOnly) 
at System.Windows.Forms.Layout.FlowLayout.GetPreferredSize(IArrangedElement container, Size proposedConstraints) 

在我的情況的原因是,總結:

  • 型MyControl的用戶控件包含FlowLayoutPanel
  • 實例的MyControla被實例化並加入到收集Controls的容器控制的bb.Controls.Add(a)
  • Add操作,通過事件觸發其他事件,在b.Controls所有控制被設置,包括a
  • 來自b.Controls.Add(a)的尚未完成的例外。

處置過程的控制,同時將它添加到Controls集合不是我的本意,並找到原因讓我立即解決問題。似乎發生的事情是,FlowLayoutPanel試圖做它的佈局,但它和它的控制被刪除,並在飛行中處置,這可以理解爲它失敗。

也許這有助於OP或遇到此異常的其他人。

+0

這裏我有一個contextmenu用戶控件。我是否需要更改佈局類型來解決此問題? – Rajiv

0

參數的異常文本超出範圍狀態下:

指數超出範圍。必須是非負數且小於集合的大小。

你這個要求的例外發生在這一行:

mnuRoot.Items.Insert(mnuRoot.Items.IndexOf(mnuAddAfter), item); 

從我們瞭解到,異常在Item訪問一個ArrayList的拋出的堆棧跟蹤。這意味着我們在Insert方法中提供的第一個參數必須是負數或大於Arraylist的大小。讓我們首先分析一下,如果我們的指數值很大。

該指數是從mnuRoot擁有的物品集合中獲得的,也是的同一集合中的Insert。由於代碼引用的是相同的集合,所以值很大是非常不明智的。唯一可能出錯的情況是,如果多個線程更新爲Arraylist,並通過判斷lock聲明來嘗試阻止該語句。

將負數留作選項。看起來如果對mnuAddAfter的引用不在mnuRoot.Items的集合中。由於您已經在檢查null,我認爲這是可能發生的情況。

基於所提供的codesnippet我假設你要添加itemmnuRoot.Items收集不惜一切代價

如果搜索空值的IndexOf實施ArrayList的不破,如果它不」 t找到一個在列表中返回-1。使用這些知識,以下實現將防止參數超出範圍異常。

var index = mnuRoot.Items.IndexOf(mnuAddAfter); // if mnuAddAfter is null -1 is returned 
if (index == -1) 
{    
    mnuRoot.Items.Add(item); 
} 
else 
{ 
    mnuRoot.Items.Insert(index, item); 
} 

1. nitpickers:在ToolStripItemCollection保證沒有空值插入其收藏