WinForms ListBox с элементами, доступными только для чтения / отключенными - PullRequest
5 голосов
/ 13 марта 2010

Есть ли способ сделать некоторые элементы в ListBox доступными только для чтения / отключения, чтобы их нельзя было выбрать? Или есть какие-либо элементы управления, подобные ListBox, для обеспечения этой функциональности?

Ответы [ 5 ]

4 голосов
/ 13 марта 2010

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

Но теперь вы не можете переопределить рисование, чтобы для пользователя было очевидно, что элемент не 'т по выбору.Здесь нет хороших решений, гораздо проще просто не отображать элементы в поле, которые нельзя выбирать.

1 голос
/ 08 июля 2016

ListBox не имеет свойства ReadOnly (или аналогичного), но вы можете создать пользовательский элемент управления ListBox. Вот решение, которое мне очень помогло:

https://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); 
        } 
    } 
} 
1 голос
/ 09 декабря 2015

@ Решение Ганса, из-за которого идентификатор элемента выбирается на короткое время, а затем выбор исчезает. Мне это не нравится - это может сбить с толку конечного пользователя.

Я предпочитаю скрывать некоторые кнопки редактирования для элемента, который должен быть отключен:

        if (lbSystemUsers.Items.Count > 0 && lbSystemUsers.SelectedIndices.Count > 0)
            if (((RemoteSystemUserListEntity)lbSystemUsers.SelectedItem).Value == appLogin)
            {
                bSystemUsersDelete.Visible = false;
                bSystemUsersEdit.Visible = false;                    
            }
            else
            {
                bSystemUsersDelete.Visible = true;
                bSystemUsersEdit.Visible = true;
            }

Вот список, в котором перечислены пользователи и запрещающие редактировать пользователя, который фактически вошел в панель редактирования.

0 голосов
/ 04 июня 2019

Чтобы получить поведение только для чтения, у меня есть MyCBLLocked, логическое значение, связанное с элементом управления списком флажков MyCBL, и для события CheckItem, которое я делаю:

private void MyCBL_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (MyCBLLocked)
        e.NewValue = e.CurrentValue;
    }

Так что вместо

MyCBL.Enabled = false;

Я использую

MyCBLLocked = true;

и пользователь может прокручивать множество вариантов, но не портить изменения.

0 голосов
/ 03 мая 2017

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

listBox.Enabled = false;
listBox.BackColor = Color.LightGray;

Это изменит цвет фона списка на Светло-серый. Так что это не встроенный «родной способ» сделать это, но, по крайней мере, дает пользователю некоторую обратную связь, что он не должен / не может редактировать это поле.

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