Winforms 如何更改哪个项目是“;概述”;在列表框中,而不更改选择?

Winforms 如何更改哪个项目是“;概述”;在列表框中,而不更改选择?,winforms,listbox,multi-select,Winforms,Listbox,Multi Select,如何更改列表框中“列出”的项目?请参见以下屏幕截图以了解详情: 背景:我想要一个正常工作的标准多选列表框。不幸的是,Windows窗体列表框(带有SelectionMode.MultiExtended)功能不全。缺少的功能是,它不允许您使用Ctrl+箭头键和Ctrl+空格键选择不相交的项目集。(在Windows资源管理器中试用它,看看它应该如何工作。)我正在尝试对ListBox进行子类化,并添加缺少的功能。为此,我打算响应OnKeyDownprotected方法中的Ctrl+箭头键,但为了这样

如何更改列表框中“列出”的项目?请参见以下屏幕截图以了解详情:


背景:我想要一个正常工作的标准多选列表框。不幸的是,Windows窗体列表框(带有
SelectionMode.MultiExtended
)功能不全。缺少的功能是,它不允许您使用Ctrl+箭头键和Ctrl+空格键选择不相交的项目集。(在Windows资源管理器中试用它,看看它应该如何工作。)我正在尝试对ListBox进行子类化,并添加缺少的功能。为此,我打算响应
OnKeyDown
protected方法中的Ctrl+箭头键,但为了这样做,我需要能够在不更改所选项目集的情况下移动大纲。如何执行此操作?

您可以通过将消息发送到列表框来执行此操作:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern uint SendMessage(IntPtr hWnd, uint msg, uint wParam, uint lParam);

public const uint LB_SETCARETINDEX = 0x019E;
public const uint LB_GETCARETINDEX = 0x019F;

[...]

public int OutlineIndex
{
    get
    {
        return (int) WinAPI.SendMessage(Handle, WinAPI.LB_GETCARETINDEX, 0, 0);
    }
    set
    {
        if (value < 0 || value >= Items.Count)
            throw new ArgumentException("OutlineIndex cannot be negative or greater than the size of the collection.", "value");
        WinAPI.SendMessage(Handle, WinAPI.LB_SETCARETINDEX, (uint) value, 0);

    }
}
[DllImport(“user32.dll”,CharSet=CharSet.Auto)]
公共静态外部单元发送消息(IntPtr hWnd、uint msg、uint wParam、uint lParam);
公共警察LB_SETCARETINDEX=0x019E;
公共警察LB_GETCARETINDEX=0x019F;
[...]
公共int大纲索引
{
得到
{
返回(int)WinAPI.SendMessage(句柄,WinAPI.LB_GETCARETINDEX,0,0);
}
设置
{
如果(值<0 | |值>=项目数)
抛出新ArgumentException(“OutlineIndex不能为负或大于集合的大小。”,“值”);
WinAPI.SendMessage(句柄,WinAPI.LB_SETCARETINDEX,(uint)值,0);
}
}

@Timwi谢谢-完成后,我还有一些代码需要填写:)