Хотя этот пост довольно старый, последний добавленный ответ был отправлен в апреле этого года,
и я надеюсь, что это кому-нибудь поможет.
Я был после чего-то похожего: флажок со списком, который ведет себя как
множество инсталляторов, которые предлагают список опций, где требуются некоторые функции и
при этом оба параметра и отключены.
Благодаря этому сообщению ( Могу ли я использовать обработчик событий DrawItem с CheckedListBox? )
Мне удалось это сделать, создав подклассы элемента управления CheckedListBox.
Как указывает OP в связанной записи, в элементе управления CheckedListBox событие OnDrawItem никогда не запускается,
поэтому подклассы необходимы.
Это очень просто, но это работает.
Вот как это выглядит (контрольный блок выше для сравнения):
ПРИМЕЧАНИЕ : отключенный элемент действительно отключен: нажатие на него не имеет никакого эффекта
(насколько я могу судить).
И это код:
public class CheckedListBoxDisabledItems : CheckedListBox {
private List<string> _checkedAndDisabledItems = new List<string>();
private List<int> _checkedAndDisabledIndexes = new List<int>();
public void CheckAndDisable(string item) {
_checkedAndDisabledItems.Add(item);
this.Refresh();
}
public void CheckAndDisable(int index) {
_checkedAndDisabledIndexes.Add(index);
this.Refresh();
}
protected override void OnDrawItem(DrawItemEventArgs e) {
string s = Items[e.Index].ToString();
if (_checkedAndDisabledItems.Contains(s) || _checkedAndDisabledIndexes.Contains(e.Index)) {
System.Windows.Forms.VisualStyles.CheckBoxState state = System.Windows.Forms.VisualStyles.CheckBoxState.CheckedDisabled;
Size glyphSize = CheckBoxRenderer.GetGlyphSize(e.Graphics, state);
CheckBoxRenderer.DrawCheckBox(
e.Graphics,
new Point(e.Bounds.X + 1, e.Bounds.Y + 1), // add one pixel to align the check gliph properly
new Rectangle(
new Point(e.Bounds.X + glyphSize.Width + 3, e.Bounds.Y), // add three pixels to align text properly
new Size(e.Bounds.Width - glyphSize.Width, e.Bounds.Height)),
s,
this.Font,
TextFormatFlags.Left, // text is centered by default
false,
state);
}
else {
base.OnDrawItem(e);
}
}
public void ClearDisabledItems() {
_checkedAndDisabledIndexes.Clear();
_checkedAndDisabledItems.Clear();
this.Refresh();
}
}
Используйте это так:
checkedListBox.Items.Add("Larry");
checkedListBox.Items.Add("Curly");
checkedListBox.Items.Add("Moe");
// these lines are equivalent
checkedListBox.CheckAndDisable("Larry");
checkedListBox.CheckAndDisable(0);
Надеюсь, это кому-нибудь поможет.