Как отключить флажок в флажке? - PullRequest
15 голосов
/ 06 декабря 2010

У меня есть некоторые элементы в поле со списком проверенных, я хочу отключить флажок для первого элемента в нем.
т.е. я хочу отключить первый элемент в CheckedListBox, потому что я хочу визуально сообщить пользователю эту опциюнедоступен.

Ответы [ 11 ]

13 голосов
/ 05 августа 2013

Объединение 2-х из приведенных выше частичных ответов отлично сработало для меня. Добавьте свои товары в список с помощью:

myCheckedListBox.Items.Add(myItem, myState);

Где myState - CheckState.Indeterminate для элементов, которые должны быть отключены. Затем добавьте обработчик событий, чтобы эти элементы не изменялись:

myCheckedListBox.ItemCheck += (s, e) => { if (e.CurrentValue == CheckState.Indeterminate) e.NewValue = CheckState.Indeterminate; };

Это не позволяет вам использовать «Indeterminate» в этом списке для его обычного назначения, но оно действительно выглядит очень похоже на то, что можно ожидать от отключенного элемента, и обеспечивает правильное поведение!

9 голосов
/ 06 декабря 2010

Отключение элементов не является хорошей идеей, пользователь не получит хороших отзывов, поскольку установка флажка не будет иметь никакого эффекта.Вы не можете использовать пользовательский рисунок, чтобы сделать его очевидным.Лучше всего просто пропустить элемент.

Однако вы можете легко победить пользователя с помощью события ItemCheck:

    private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
        if (e.Index == 0) e.NewValue = e.CurrentValue;
    }
8 голосов
/ 12 июля 2015

Хотя этот пост довольно старый, последний добавленный ответ был отправлен в апреле этого года,
и я надеюсь, что это кому-нибудь поможет.
Я был после чего-то похожего: флажок со списком, который ведет себя как множество инсталляторов, которые предлагают список опций, где требуются некоторые функции и при этом оба параметра и отключены.
Благодаря этому сообщению ( Могу ли я использовать обработчик событий DrawItem с CheckedListBox? ) Мне удалось это сделать, создав подклассы элемента управления CheckedListBox.
Как указывает OP в связанной записи, в элементе управления CheckedListBox событие OnDrawItem никогда не запускается, поэтому подклассы необходимы.
Это очень просто, но это работает. Вот как это выглядит (контрольный блок выше для сравнения):

checked list box

ПРИМЕЧАНИЕ : отключенный элемент действительно отключен: нажатие на него не имеет никакого эффекта (насколько я могу судить). И это код:

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);

Надеюсь, это кому-нибудь поможет.

7 голосов
/ 27 ноября 2012

Чтобы отключить какой-либо конкретный элемент, используйте следующее:

checkedListBox1.SetItemCheckState(0, CheckState.Indeterminate);

SetItemCheckState берет индекс предмета и CheckState Enum Неопределенный используется для отображения затененного вида

5 голосов
/ 30 января 2014

Я знаю, что это было давно, но я нашел это в своем поиске списка и подумал, что добавлю его в обсуждение.

Если у вас есть список и вы хотите отключить все флажки, чтобы их нельзя было щелкнуть, но не отключить элемент управления, чтобы пользователь все еще мог прокручивать и т. Д., Вы можете сделать это:

listbox.SelectionMode = SelectionMode.None
3 голосов
/ 06 декабря 2010

CheckedListBox не будет работать таким образом. CheckedListBox.Items представляет собой набор строк, поэтому их нельзя «отключить» как таковые.

Вот некоторые обсуждения возможных решений, которые могут вам помочь: здесь здесь .

1 голос
/ 30 апреля 2012

Решение состоит в том, чтобы использовать событие ItemChecking:

_myCheckedListBox.ItemChecking += (s, e) => e.Cancel = true;

Это отменит все проверки для каждого элемента, но вы всегда можете сделать более изысканное решение, кроме тестирования текущего .SelectedItem

0 голосов
/ 13 октября 2017

Это работает для меня:

checkedListBox1.SelectionMode = SelectionMode.None;

Что означает, что элементы не могут быть выбраны

Нет: элементы не могут быть выбраны.

Для получения дополнительной информации вы можете проверить это здесь: Перечисление SelectionMode .

0 голосов
/ 05 апреля 2015

Я думаю, что альтернативным решением является использование Telerik компонентов.

A RadListControl может предоставить вам эту опцию:

enter image description here

0 голосов
/ 05 апреля 2015

Попробуйте ниже код:

Private Sub CheckedListBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles CheckedListBox1.MouseUp
        If (Condition) Then
         Me.CheckedListBox1.SelectedIndex = -1
        End If
End Sub
...