I am getting the below exception randomly. The toolstrip menu is created dynamically.
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)
The exception is happening in the following method . It happens when an item is added to the mnuRoot. This method is invoked on the on the right click of selected items.
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;
}
}
}
}
Although this question is downvoted for good reasons, it's the only hit I got while googling for "xLayoutRow ArgumentOutOfRangeException", so I'll still share my experiences here.
I encountered an exception with the top part of the stack trace in this post:
In my case the cause was, summarized:
FlowLayoutPanel
.a
ofMyControl
is instantiated and added to theControls
collection of a container controlb
:b.Controls.Add(a)
Add
operation, through events triggering other events, all controls inb.Controls
are disposed, includinga
.b.Controls.Add(a)
which was still unfinished.Of course disposing the control while adding it to the controls collection was not my intention and finding the cause allowed me to solve the problem immediately. What seemed to happen was that the
FlowLayoutPanel
tries to do its layout, but it and its controls are being removed and disposed in-flight, which understandably makes it fail.Maybe this helps the OP or someone else who encounters this exception.