Winforms - Как предотвратить выбор элемента списка - PullRequest
6 голосов
/ 20 ноября 2011

В WinForms у меня иногда есть цикл, работающий над списком выбора элементов.

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

Я посмотрел на MyListbox.enabled = false, но он выделяет все элементы.Не хочу этого.

Как запретить выделение элементов в списке?

Ответы [ 4 ]

7 голосов
/ 23 октября 2012

Я тоже хотел список со списком только для чтения и, наконец, после долгих поисков нашел его по http://ajeethtechnotes.blogspot.com/2009/02/readonly-listbox.html:

public class ReadOnlyListBox : ListBox
{
    private bool _readOnly = false;
    public bool ReadOnly
    {
        get { return _readOnly; }
        set { _readOnly = value; }
    }

    protected override void DefWndProc(ref Message m)
    {
        // If ReadOnly is set to true, then block any messages 
        // to the selection area from the mouse or keyboard. 
        // Let all other messages pass through to the 
        // Windows default implementation of DefWndProc.
        if (!_readOnly || ((m.Msg <= 0x0200 || m.Msg >= 0x020E)
        && (m.Msg <= 0x0100 || m.Msg >= 0x0109)
        && m.Msg != 0x2111
        && m.Msg != 0x87))
        {
            base.DefWndProc(ref m);
        }
    }
}
5 голосов
/ 20 ноября 2011

Переключите свойство Listbox.SelectionMode на SelectionMode.None

Редактировать Как я вижу, установка SelectionMode.None отменяет выбор всех ранее выбранных элементов и выдает исключение, если SetSelected вызывается в списке.

Я думаю, что желаемое поведение невозможно (без необходимости выделять элементы серым цветом с помощью Enabled=false).

1 голос
/ 15 мая 2014

Создайте обработчик событий, который удаляет фокус из списка, и подпишите обработчик на событие GotFocus списка.Таким образом, пользователь никогда не сможет ничего выбрать в списке.Следующая строка кода делает это с помощью встроенного анонимного метода:

txtBox.GotFocus += (object anonSender, EventArgs anonE) => { txtBox.Parent.Focus(); };

* Редактировать : объяснение кода

1 голос
/ 20 ноября 2011

Вам может повезти, если вы подклассите ListBox и переопределите метод OnMouseClick:

public class CustomListBox : ListBox
{
    public bool SelectionDisabled = false;

    protected override void OnMouseClick(MouseEventArgs e)
    {
        if (SelectionDisabled)
        {
            // do nothing.
        }
        else
        {
            //enable normal behavior
            base.OnMouseClick(e);
        }
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...