执行.net应用程序时,我收到一个未处理的异常:
InvalidArgument=Value of '-1' is not valid for 'index'.
Parameter name: index
代码本身用于在列表框中更改所选项目的背景颜色(winforms):
private void listbox_DrawItem(object sender, DrawItemEventArgs e)
{
Brush bg = new SolidBrush(Color.FromArgb(100, 100, 100));
e.DrawBackground();
Graphics g = e.Graphics;
Brush brush = ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? bg : new SolidBrush(e.BackColor);
g.FillRectangle(brush, e.Bounds);
e.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, StringFormat.GenericDefault);
e.DrawFocusRectangle();
}
异常表明它是Brush brush = ...
行,但我不明白为什么它会抛出此异常。
答案 0 :(得分:1)
在使用e.Index
之前检查它的值
if(e.Index >= 0)
{
e.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, StringFormat.GenericDefault);
}
答案 1 :(得分:1)
如果您收到此异常,那么您可能需要考虑在代码块之前采取防御措施,方法是添加一项检查以查看索引是否大于0。
if (!e.Index < 0)
{
e.DrawBackground();
Graphics g = e.Graphics;
Brush brush = ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? bg : new SolidBrush(e.BackColor);
g.FillRectangle(brush, e.Bounds);
e.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, StringFormat.GenericDefault);
e.DrawFocusRectangle();
}
通过执行此操作,您将仅在使用有效参数从源引发事件时执行代码。
答案 2 :(得分:0)
实际上,我认为它表明了这一行:
... (ListBox)sender).Items[e.Index] ...
似乎是尝试在-1
中获取ListBox
元素。
要确认,请在该行上放置一个断点,看看是否e.Index == -1
。