列表框自定义选定的背景颜色 - InvalidArgument

时间:2014-02-02 22:29:28

标签: c# winforms listbox

执行.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 = ...行,但我不明白为什么它会抛出此异常。

3 个答案:

答案 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