Существует ли способ сделать некоторые объекты в ListBox readonly/disabled, таким образом, они не могут быть выбраны? Или там какие-либо подобные средства управления к ListBox для обеспечения этой функциональности?
ListBox не имеет поддержки для этого. Можно что-то прикрутить, можно отменить выбор выделенного элемента. Вот глупый пример, который предотвращает выделение элементов с четными номерами:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {
for (int ix = listBox1.SelectedIndices.Count - 1; ix >= 0; ix--) {
if (listBox1.SelectedIndices[ix] % 2 != 0)
listBox1.SelectedIndices.Remove(listBox1.SelectedIndices[ix]);
}
}
Но мерцание довольно заметно, и оно портит клавиатурную навигацию. Вы можете получить лучшие результаты, используя CheckedListBox, вы можете предотвратить установку пользователем флажка для элемента:
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
if (e.Index % 2 != 0) e.NewValue = CheckState.Unchecked;
}
Но теперь вы не можете переопределить рисунок, чтобы пользователю было очевидно, что элемент не выбирается. Здесь нет отличных решений, гораздо проще просто не отображать в поле элементы, которые не должны быть выбираемыми.