禁止ListView使所选项目为零
我的项目是.NET / WinForms。
我有一个列表视图,总是填充项目。 我希望它总是有选择。 但是,如果我单击列表视图项下面的空白区域,它将失去选择。
该列表有多个selection = true和hide selection = false。
您需要阻止本机控件看到鼠标单击,以便它不会取消选择项目。 在项目中添加一个新类并粘贴下面显示的代码。 编译。 将其从工具箱顶部拖放到表单上,替换现有表单。
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; }
如果您不需要多选,则以下内容有效。 它的优点是无需跟踪上次选择的项目。
private void ListViewAny_SelectedIndexChanged(object sender, EventArgs e) { if ((sender as ListView).FocusedItem != null) { (sender as ListView).FocusedItem.Selected = true; } }
private void LV_MouseUp(object sender, MouseEventArgs e) { if (LV.FocusedItem != null) { if (LV.SelectedItems.Count == 0) LV.FocusedItem.Selected = true; } }
(没有多选)
您需要处理ListView的SelectedIndexChanged
事件,并且如果在此事件发生后没有选择任何项目,则以编程方式重新选择上一个已知选择。
ListView
有一个SelectedIndexChanged
事件。 听取这个,然后查询listView.SelectedItems.Count
属性 – 如果它为零,则选择第一个/最后一个选定项。
上述就是C#学习教程:禁止ListView使所选项目为零分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1005756.html