Мой проект является.NET/WinForms.
У меня есть представление списка, которое всегда заполнено объектами. Я хотел бы, чтобы это всегда имело выбор. Однако, если я нажимаю на пустую область ниже объектов представления списка, она освобождает выбор.
Список имеет множественный выбор = верный, и скройте выбор = ложь.
Вам необходимо запретить встроенному элементу управления видеть щелчок мыши, чтобы он не отменял выбор элемента. Добавьте новый класс в свой проект и вставьте код, показанный ниже. Скомпилировать. Перетащите его из верхней части панели инструментов на свою форму, заменив существующую.
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);
}
}
Как уже было сказано другими, событие 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;
}
Вам необходимо обработать SelectedIndexChanged
для ListView, и в случае, если после этого события не выбран ни один элемент, программно повторно выберите последний известный выбор.
ListView
имеет событие SelectedIndexChanged
. Прослушайте это, а затем запросите свойство listView.SelectedItems.Count
- если оно равно нулю, выберите первый / последний выбранный элемент.