Запретить ListView, чтобы иметь ноль выбранных элементов - PullRequest
14 голосов
/ 15 июля 2010

Мой проект .NET / WinForms.

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

В списке есть множественный выбор = true и скрытый выбор = false.

Ответы [ 6 ]

25 голосов
/ 15 июля 2010

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

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);
    }
}
2 голосов
/ 20 октября 2013

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

private void ListViewAny_SelectedIndexChanged(object sender, EventArgs e)
{
    if ((sender as ListView).FocusedItem != null)
    {
        (sender as ListView).FocusedItem.Selected = true;
    }
}
2 голосов
/ 15 июля 2010

Как уже говорили другие, вы должны посмотреть на событие 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;

}
1 голос
/ 17 апреля 2015
    private void LV_MouseUp(object sender, MouseEventArgs e)
    {
        if (LV.FocusedItem != null)
        {
            if (LV.SelectedItems.Count == 0)
                LV.FocusedItem.Selected = true;
        }
    }

(без мультиселекции)

0 голосов
/ 15 июля 2010

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

0 голосов
/ 15 июля 2010

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

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