Не разрешите ListView иметь нулевые выбранные пункты

Мой проект является.NET/WinForms.

У меня есть представление списка, которое всегда заполнено объектами. Я хотел бы, чтобы это всегда имело выбор. Однако, если я нажимаю на пустую область ниже объектов представления списка, она освобождает выбор.

Список имеет множественный выбор = верный, и скройте выбор = ложь.

14
задан Alex 15 July 2010 в 11:22
поделиться

4 ответа

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

using System;
using System.Drawing;
using System.Windows.Forms;

class MyListView : ListView {
    protected override void WndProc(ref Message m) {
        // Swallow mouse messages that are not in the client area
        if (m.Msg >= 0x201 && m.Msg <= 0x209) {
            Point pos = new Point(m.LParam.ToInt32());
            var hit = this.HitTest(pos);
            switch (hit.Location) {
                case ListViewHitTestLocations.AboveClientArea :
                case ListViewHitTestLocations.BelowClientArea :
                case ListViewHitTestLocations.LeftOfClientArea :
                case ListViewHitTestLocations.RightOfClientArea :
                case ListViewHitTestLocations.None :
                    return;
            }
        }
        base.WndProc(ref m);
    }
}
26
ответ дан 1 December 2019 в 08:15
поделиться

Как уже было сказано другими, событие SelectedIndexChanged - это то, на что вам следует обратить внимание, однако вы должны использовать его совместно с событием ItemSelectionChanged. Вот некоторый код, который я только что придумал:

// Holds the last selected index
private int _previousIndex = -1;

// Restores the previous selection if there are no selections
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listView1.SelectedIndices.Count == 0)
    {
        if (_previousIndex >= 0)
        {
            listView1.SelectedIndices.Add(_previousIndex);
        }
    }
}

// Records the last selected index
private void listView1_ItemSelectionChanged(object sender, 
               ListViewItemSelectionChangedEventArgs e)
{
    if (e.IsSelected)
    {
        _previousIndex = e.ItemIndex;
    }
}

В целях чистого повторного использования кода, вероятно, стоит поместить этот код в новый UserControl и иметь свойство, определяющее, разрешить ли потерю последнего выбора:

public class CustomListView : ListView
{

    protected CustomListView()
    {
        this.SelectedIndexChanged += new EventHandler(CustomListView_SelectedIndexChanged);
        this.ItemSelectionChanged += new ListViewItemSelectionChangedEventHandler(CustomListView_ItemSelectionChanged);
    }

    void CustomListView_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (this.MaintainLastSelection && this.SelectedIndices.Count == 0)
        {
            if (_previousIndex >= 0)
            {
                this.SelectedIndices.Add(_previousIndex);
            }
        }
    }

    void CustomListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
    {
        if (e.IsSelected)
        {
            _previousIndex = e.ItemIndex;
        }
    }

    private int _previousIndex = -1;

    public bool MaintainLastSelection
    {
        get { return _maintainLastSelection; }
        set { _maintainLastSelection = value; }
    }
    private bool _maintainLastSelection;

}
2
ответ дан 1 December 2019 в 08:15
поделиться

Вам необходимо обработать SelectedIndexChanged для ListView, и в случае, если после этого события не выбран ни один элемент, программно повторно выберите последний известный выбор.

0
ответ дан 1 December 2019 в 08:15
поделиться

ListView имеет событие SelectedIndexChanged . Прослушайте это, а затем запросите свойство listView.SelectedItems.Count - если оно равно нулю, выберите первый / последний выбранный элемент.

0
ответ дан 1 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: