百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

63.C# ListView控件

liuian 2024-12-10 18:06 20 浏览

摘要


Windows 窗体 ListView 控件显示带图标的项列表。 你可以使用列表视图创建类似 Windows 资源管理器右窗格的用户界面。 该控件有四种视图模式:LargeIcon、SmallIcon、List 和 Details。

正文


属性


CheckBoxes

获取或设置一个值,该值指示控件中各项的旁边是否显示复选框。

CheckedIndices

获取控件中当前选中项的索引。

CheckedItems

获取控件中当前选中的项。

Columns

获取控件中显示的所有列标题的集合。

FullRowSelect

获取或设置一个值,该值指示单击某项是否选择其所有子项。

GridLines

获取或设置一个值,该值指示:在包含控件中项及其子项的行和列之间是否显示网格线。

GroupImageList

当前设置 GroupIcon 映像列表。

Groups

获取分配给控件的 ListViewGroup 对象的集合。

Items

获取包含控件中所有项的集合。

LabelEdit

获取或设置一个值,该值指示用户是否可以编辑控件中项的标签。

LabelWrap

获取或设置一个值,该值指示当项作为图标在控件中显示时,项标签是否换行。

SelectedItems

获取在控件中选定的项。

ShowGroups

获取或设置一个值,该值指示是否以分组方式显示项。

ShowItemToolTips

获取或设置一个值,该值指示是否为 ListViewItem 中包含的 ListView 对象显示工具提示。

SmallImageList

获取或设置 ImageList,当项在控件中显示为小图标时使用。

Sorting

获取或设置控件中项的排序顺序。

StateImageList

获取或设置与控件中应用程序定义的状态相关的 ImageList。

SmallImageList

获取或设置 ImageList,当项在控件中显示为小图标时使用。

Sorting

获取或设置控件中项的排序顺序。

StateImageList

获取或设置与控件中应用程序定义的状态相关的 ImageList。

LargeIcon 模式在项文本旁边显示大图标;如果控件足够大,项将出现在多列中。

SmallIcon 模式是相同的,只是它显示的是小图标。

List 模式显示小图标,但始终位于单列中。

Details 模式在多列中显示项。

常用Detials设置

lstDetail.View = View.Details;//设置视图

添加列

//添加列
lstDetail.Columns.Add("设备号", 120, HorizontalAlignment.Left);
lstDetail.Columns.Add("设备名称", 150, HorizontalAlignment.Left);
lstDetail.Columns.Add("当前状态", 150, HorizontalAlignment.Left);
lstDetail.Columns.Add("运行时长", 200, HorizontalAlignment.Left);

添加行

//添加行
var item = new ListViewItem();
item.Text = "A0001";//设备号
item.SubItems.Add("S7-1200"); //设备名称
item.SubItems.Add("RUN"); //当前状态
item.SubItems.Add("500"); //运行时长

//在批量载入时,尽量使用BeginUpdate,EndUpdate,减少刷新
lstDetail.BeginUpdate();
lstDetail.Items.Add(item);
lstDetail.Items[lstDetail.Items.Count - 1].EnsureVisible();//滚动到最后
lstDetail.EndUpdate();

给Detail添加图标

ImageList控件(存储图像控件)用于存储图像资源,然后在控件上显示出来,这样就简化了对图像的管理。ImageList 控件的主要属性是 Images,它包含关联控件将要使用的图片。每个单独的图像可通过其索引值或其键值来访问。

添加图片

lstDetail.SmallImageList = simgs;//给listview 绑定小图标列表
item.ImageIndex = 0;//指定对应的图标,用索引

给列表增加勾选框

lstDetail.CheckBoxes = true;
lstDetail.FullRowSelect = true;//整行选中
//添加行
lstDetail.BeginUpdate();
for (int i = 0; i < 100; i++)
{
    var item = new ListViewItem();
    item.Text = "A000"+i.ToString();//设备号
    item.SubItems.Add("S7-1200"); //设备名称
    item.SubItems.Add("RUN"); //当前状态
    item.SubItems.Add(new Random().Next(0,1000).ToString()); //运行时长
    item.ImageIndex = 0;//指定对应的图标,用索引
    lstDetail.Items.Add(item);
}
lstDetail.EndUpdate();
private void btnGetSelected_Click(object sender, EventArgs e)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < lstDetail.Items.Count; i++)
    {
        if (lstDetail.Items[i].Checked)
        {
            sb.AppendLine(lstDetail.Items[i].Text);
        }
    }
    MessageBox.Show(sb.ToString());
}

StringBuilder sb = new StringBuilder();
foreach (ListViewItem item in lstDetail.CheckedItems)
{
    sb.AppendLine(item.Text);    
}
MessageBox.Show(sb.ToString());

列头排序

public class ListViewItemComparer : IComparer
{
    /// <summary>
    /// 指定按照哪个列排序
    /// </summary>
    private int ColumnToSort;
    /// <summary>
    /// 指定排序的方式
    /// </summary>
    private System.Windows.Forms.SortOrder OrderOfSort;
    /// <summary>
    /// 声明CaseInsensitiveComparer类对象
    /// </summary>
    private System.Collections.CaseInsensitiveComparer ObjectCompare;
    /// <summary>
    /// 构造函数
    /// </summary>
    public ListViewItemComparer()
    {
        // 默认按第一列排序
        ColumnToSort = 0;
        // 排序方式为不排序
        OrderOfSort = System.Windows.Forms.SortOrder.None;
        // 初始化CaseInsensitiveComparer类对象
        ObjectCompare = new System.Collections.CaseInsensitiveComparer();
    }
    /// <summary>
    /// 重写IComparer接口.
    /// </summary>
    /// <param name="x">要比较的第一个对象</param>
    /// <param name="y">要比较的第二个对象</param>
    /// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
    public int Compare(object x, object y)
    {
        int compareResult;
        System.Windows.Forms.ListViewItem listviewX, listviewY;
        // 将比较对象转换为ListViewItem对象
        listviewX = (System.Windows.Forms.ListViewItem)x;
        listviewY = (System.Windows.Forms.ListViewItem)y;
        string xText = listviewX.SubItems[ColumnToSort].Text;
        string yText = listviewY.SubItems[ColumnToSort].Text;
        int xInt, yInt;

        if (int.TryParse(xText, out xInt) && int.TryParse(yText, out yInt)) //是否全为数字
        {
            //比较数字
            compareResult = CompareInt(xInt, yInt);
        }
        else
        {
            //比较对象
            compareResult = ObjectCompare.Compare(xText, yText);
        }
        // 根据上面的比较结果返回正确的比较结果
        if (OrderOfSort == System.Windows.Forms.SortOrder.Ascending)
        {
            // 因为是正序排序,所以直接返回结果
            return compareResult;
        }
        else if (OrderOfSort == System.Windows.Forms.SortOrder.Descending)
        {
            // 如果是反序排序,所以要取负值再返回
            return (-compareResult);
        }
        else
        {
            // 如果相等返回0
            return 0;
        }
    }
    /// <summary>
    /// 比较两个数字的大小
    /// </summary>
    /// <param name="ipx">要比较的第一个对象</param>
    /// <param name="ipy">要比较的第二个对象</param>
    /// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
    private int CompareInt(int x, int y)
    {
        if (x > y)
        {
            return 1;
        }
        else if (x < y)
        {
            return -1;
        }
        else
        {
            return 0;
        }
    }
    /// <summary>
    /// <summary>
    /// 获取或设置按照哪一列排序.
    /// </summary>
    public int SortColumn
    {
        set
        {
            ColumnToSort = value;
        }
        get
        {
            return ColumnToSort;
        }
    }
    /// <summary>
    /// 获取或设置排序方式.
    /// </summary>
    public System.Windows.Forms.SortOrder Order
    {
        set
        {
            OrderOfSort = value;
        }
        get
        {
            return OrderOfSort;
        }
    }
 }
private void lstDetail_ColumnClick(object sender, ColumnClickEventArgs e)
{
    if(e.Column== comparer.SortColumn)
    {
        if (comparer.Order == SortOrder.Ascending)
        {
            comparer.Order = SortOrder.Descending;
        }
        else
        {
            comparer.Order = SortOrder.Ascending;
        }
    }
    else
    {
        comparer.SortColumn = e.Column;
        comparer.Order = SortOrder.Ascending;
    }
    lstDetail.Sort();
}
ListViewItemComparer comparer=new ListViewItemComparer();
public FrmMain()
{
    InitializeComponent();
    lstDetail.ListViewItemSorter = comparer;
}

相关推荐

Docker 47 个常见故障的原因和解决方法

【作者】曹如熙,具有超过十年的互联网运维及五年以上团队管理经验,多年容器云的运维,尤其在Docker和kubernetes领域非常精通。Docker是一种相对使用较简单的容器,我们可以通过以下几种方式...

电脑30个快问快答,解决常见电脑问题

1.强行关机/停电对电脑有影响吗?答:可能损坏硬盘(机械硬盘风险高)、未保存数据丢失,偶尔一次影响小,但频繁操作会缩短硬件寿命。2.C盘满影响速度吗?答:会!系统运行需C盘空间缓存临时数据,空间不...

使用Tcpdump包抓取分析数据包的详细用法

TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。tcpdump就是一种...

电脑启动不了(BootDevice Not Found Hard Disk-3F0)解决方案

HP品牌机,开机启动不了,黑屏,开机取下主板电池恢复BIOS后,开机显示找不到启动盘。一、按F2键进入BIOS,出现硬盘内存检测界面的话,直接退出。就会出现这个界面,光标键向下,选择BIOSSetu...

电脑开机黑屏别慌!快码住!起底维修老师傅不能说的秘密

按下开机键却只收获黑屏大礼包?那些神秘的英文提示、刺耳的蜂鸣声,其实是电脑在给你发送求救信号!从按下电源到进入桌面的12秒里,你的电脑经历了史诗级的硬件自检与系统加载,今天我们就破译这段“摩斯电码”。...

电脑启动故障为何总要先看BIOS?新手必读的关键知识解析

最近在帮朋友们解答电脑无法正常开机的问题时,发现大家经常收到一句高频建议:“先检查BIOS”。对不少普通用户而言,BIOS依然是个神秘的存在。那么,BIOS到底是什么?电脑出现哪些故障会与它相关呢?本...

Windows 11 KB5053598更新:安全补丁还是系统噩梦?

2025年3月11日,微软发布了Windows1124H2的强制性更新KB5053598,作为“周二补丁日”(PatchTuesday)的一部分。然而,这款本应提升系统安全性的更新却引发了广泛的...

飞牛OS入门安装遇到问题,如何解决?

之前小编尝试了用旧电脑装飞牛OS安装之前特意查了一些硬件要求飞牛OS目前支持主流的x86架构硬件主机需能连网线飞牛OS暂时不支持只有无线网卡的安装貌似很多小伙伴在一开始安装就卡住了那今天咱们汇总分...

几种常见的电脑开机黑屏显示白色英文字母解决方法

当电脑开机出现黑屏并显示白色英文字母时,通常表示系统启动过程中遇到了错误。以下是几种常见原因及对应的解决方法,按照排查顺序整理:一、检查外接设备与硬件连接可能原因:外接U盘、移动硬盘等未拔出,或内部硬...

电脑启动出现问题,为什么都要先检查BIOS?

【ZOL中关村在线原创技巧应用】最近在回答问题的时候,总会发现很多朋友都在问“电脑无法正常开机怎么办?”这样类似的问题,而许多DIY大佬的回复总会出现一条高频建议“先检查BIOS”。但对于许多普通用户...

教你怎么用JavaScript检测当前浏览器是无头浏览器

什么是无头浏览器(headlessbrowser)?无头浏览器是指可以在图形界面情况下运行的浏览器。我可以通过编程来控制无头浏览器自动执行各种任务,比如做测试,给网页截屏等。为什么叫“无头”浏览器?...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

运维的报表之路,用 node.js 轻松发送 grafana 报表

在运维过程中,无论是监控还是报表,都会有一些通过邮件发送图表的需求,由于开源的zabbix,grafana和kibana等并不完全具有“想发送哪儿就发送哪儿”的图片生成功能,在grafana...

C#基于浏览器内核的高级爬虫(c#爬取网页内容)

基于C#.NET+PhantomJS+Sellenium的高级网络爬虫程序。可执行Javascript代码、触发各类事件、操纵页面Dom结构、甚至可以移除不喜欢的CSS样式。很多网站都用Ajax动态加...

如何优化一个秒杀项目?(秒杀实现思路)

问题1:使用jmeter性能压测,定位瓶颈代码步骤流程:线程组--->Http请求--->查看结果树--->聚合报告tips:host的文件--->优先调用映射,减少DNS的时...