protected virtual void OnDrawSubItem(DrawSubItemEventArgs e)
        {
            object value = this.GetItemAt(e.Index, e.SubIndex);

            if (DrawMode == DrawMode.Normal && Items.Count > 0)
            {
                if ((value as Image) != null)
                {
                    e.Graphics.DrawImageUnscaled((Image)value, e.Bounds);
                }
                else if ((value as Bitmap) != null)
                {
                    IntPtr hBmp = ((Bitmap)value).GetHbitmap();
                    e.Graphics.DrawImageUnscaled(Image.FromHbitmap(hBmp), e.Bounds);
                    WinAPI.DeleteObject(hBmp);
                }
                else if ((value as byte[]) != null)
                {
                    try
                    {
                        e.Graphics.DrawImageUnscaled(Image.FromStream(new MemoryStream((byte[])value)), e.Bounds);
                    }
                    catch (Exception ex)
                    {
                        defaultDraw(value, e);
                    }
                }
                else
                {
                    defaultDraw(value, e);
                }
            }
            else if (DrawSubItem.GetInvocationList() != null)
            {
                DrawSubItem.DynamicInvoke(new object[] { this, e });
            }
        }
 //Protected Methods
 protected virtual void defaultDraw(object value, DrawSubItemEventArgs e)
 {
     e.Graphics.DrawString(value.ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds);
 }