一文掌握C# ListView控件的用法和示例代码

 更新时间:2024年02月01日 15:58:37   作者:求知青年  
ListView控件提供了丰富的属性和事件,可以用于实现各种各样的表格视图,包括带有单元格编辑、排序和分组等功能,本文介绍了一些常见的 ListView 控件的用法和示例代码,感兴趣的朋友一起看看吧

ListView 是一种多列的列表视图控件,可以用于展示多个数据项及其相关信息。ListView 控件提供了丰富的属性和事件,可以用于实现各种各样的表格视图,包括带有单元格编辑、排序和分组等功能。

下面我们通过几个示例来演示如何使用 ListView 控件。

示例一:基本使用

在这个示例中,我们将创建一个基本的 ListView 控件,并在其中添加三列数据 —— 姓名、电话和地址。我们将使用 Items 属性向 ListView 控件中添加数据,每位客户信息将占用 ListView 中的一行,每个属性将在一行中的不同列中显示。以下是示例代码:

private void Form1_Load(object sender, EventArgs e)
{
    // 创建三列,分别代表姓名、电话和地址
    var colName = new ColumnHeader();
    colName.Text = "姓名";
    colName.Width = 100;
    var colPhone = new ColumnHeader();
    colPhone.Text = "电话";
    colPhone.Width = 150;
    var colAddress = new ColumnHeader();
    colAddress.Text = "地址";
    colAddress.Width = 200;
    // 添加列到 ListView 控件中
    listView1.Columns.Add(colName);
    listView1.Columns.Add(colPhone);
    listView1.Columns.Add(colAddress);
    // 添加客户信息到 ListView 控件中
    ListViewItem item1 = new ListViewItem("张三");
    item1.SubItems.Add("123456789");
    item1.SubItems.Add("北京市海淀区");
    ListViewItem item2 = new ListViewItem("李四");
    item2.SubItems.Add("234567890");
    item2.SubItems.Add("上海市浦东新区");
    ListViewItem item3 = new ListViewItem("王五");
    item3.SubItems.Add("345678901");
    item3.SubItems.Add("广州市天河区");
    listView1.Items.Add(item1);
    listView1.Items.Add(item2);
    listView1.Items.Add(item3);
}

在这个代码中,我们首先创建了三个 ColumnHeader 对象,分别表示列表视图中的三列 —— 姓名、电话和地址。我们使用 Text 属性来设置每列的标题,使用 Width 属性来设置每列的宽度,然后添加这三列到 ListView 控件中。在添加每列时,我们将其添加到 Columns 集合中,从而在列表视图中创建新列。

接下来,我们使用 ListViewItem 对象和 SubItems 属性来填充每一行的数据。在这个示例中,我们手动创建了三个对象,每个对象分别代表一个客户的姓名、电话和地址。我们将每个对象添加到 Items 集合中,从而在列表视图中创建新的行。我们使用 Add 方法添加每个 ListViewItem 对象到 Items 集合中,从而在列表视图中创建新行。我们使用 SubItems 属性来添加每个行中的列属性,这可以帮助我们显示多列数据。

示例二:动态添加和删除行

在这个示例中,我们将动态地添加和删除行。我们创建了两个按钮,一个用于添加行,一个用于删除选中的行。我们将添加两个事件处理程序,来响应用户单击这两个按钮的操作。以下是示例代码:

private void btnAdd_Click(object sender, EventArgs e)
{
    // 显示一个对话框,引导用户输入新的客户信息(姓名、电话、地址)
    using (var dlg = new AddCustomerDialog())
    {
        var result = dlg.ShowDialog();
        if (result == DialogResult.OK)
        {
            // 当用户单击“确定”按钮时,添加一行数据到 ListView 控件中
            var item = new ListViewItem(dlg.Customer.Name);
            item.SubItems.Add(dlg.Customer.Phone);
            item.SubItems.Add(dlg.Customer.Address);
            listView1.Items.Add(item);
        }
    }
}
private void btnDelete_Click(object sender, EventArgs e)
{
    // 删除选中的行
    foreach (ListViewItem item in listView1.SelectedItems)
    {
        listView1.Items.Remove(item);
    }
}

在这个代码中,我们首先创建了两个事件处理程序,一个用于添加行,一个用于删除选中的行。在添加行的事件处理程序中,我们使用 AddCustomerDialog 模式对话框,引导用户输入新的客户信息。当用户单击“确定”按钮时,我们获取模式对话框中输入的客户信息,创建一个新的 ListViewItem 的 ListViewItem 对象并将其添加到 ListView 控件的项集合中,从而在列表视图中创建新行。注意,我们在添加新行之前,需要先检查用户单击了模式对话框的“确定”按钮,确保用户输入了有效的客户信息。在删除选中行的事件处理程序中,我们简单地遍历 SelectedItems 集合,对于每个选定的 ListViewItem 对象,使用 Remove 方法将其从 ListView 控件的项集合中移除。删除行的过程中,我们没有检查是否选择了任何行,但需要注意,如果未选择任何行,则 SelectedItems 集合将为空,而删除行的代码将什么也不做。

示例三:自定义列

在这个示例中,我们将向 ListView 控件中添加一个具有自定义列的数据。我们将创建一个新的 ListView 子类,覆盖 OnCreateControl 方法以向控件中添加自定义列。在自定义列的列标题区域中,我们将添加一个新的按钮控件,用于在列标题被单击时触发事件。以下是示例代码:

public class CustomListView : ListView
{
    private ColumnHeader customColumnHeader = null;
    protected override void OnCreateControl()
    {
        base.OnCreateControl();
        AddCustomColumn();
    }
    private void AddCustomColumn()
    {
        // 创建自定义列表头
        customColumnHeader = new ColumnHeader();
        customColumnHeader.Text = "操作";
        customColumnHeader.Width = 100;
        this.Columns.Add(customColumnHeader);
        // 添加按钮到自定义列表头中
        var btn = new Button();
        btn.Text = "新建客户";
        btn.AutoSize = true;
        btn.Click += (sender, e) =>
        {
            // TODO: 在这里添加新客户的代码
        };
        customColumnHeader.TextAlign = HorizontalAlignment.Center;
        customColumnHeader.Control = btn;
    }
}

在这个代码中,我们创建了一个名为 CustomListView 的新类,并继承了 ListView。我们覆盖了 OnCreateControl 方法,在控件第一次创建时添加了一个自定义列。我们创建了一个 ColumnHeader 对象来表示自定义列的列头,将自定义列添加到控件的 Columns 集合中。我们在 ColumnHeader 控件的 Control 属性中添加了按钮控件,该按钮控件将出现在列头中。在点击按钮时,我们可能通过添加代码来处理与新客户相关的操作。

值得注意的是,为了确保按钮仅占列头中的一部分,我们通过 AutoSize 属性来将控件的大小调整为其包含的内容同样的大小,从而将按钮置于列头的最前面。我们通过 TextAlign 属性和 HorizontalAlignment.Center 值来使按钮在整个列头中居中。

这个示例只是展示了如何向 ListView 控件中添加具有自定义列的数据,而按钮的具体事件处理程序需要根据具体的需求来自行定义。

当然有,这里再介绍一下 ListView 控件的集成视图模式和虚拟模式。

集成视图模式

集成视图模式允许将数据通过关联到 ListView 控件来显示。在这个模式下,我们可以指定一个数据源,该数据源必须实现 IList 接口。在这个模式下,当我们向 Items 集合中添加数据时,实际上是将数据项添加到数据源中。以下是使用集成视图模式实现的示例代码:

private void Form1_Load(object sender, EventArgs e)
{
    // 创建数据源
    var customers = new List<Customer>();
    customers.Add(new Customer() { Name = "张三", Phone = "123456789", Address = "北京市海淀区" });
    customers.Add(new Customer() { Name = "李四", Phone = "234567890", Address = "上海市浦东新区" });
    customers.Add(new Customer() { Name = "王五", Phone = "345678901", Address = "广州市天河区" });
    // 关联数据源和 ListView 控件
    listView1.View = View.Details;
    listView1.VirtualListSize = customers.Count;
    listView1.RetrieveVirtualItem += (s, args) =>
    {
        var customer = customers[args.ItemIndex];
        args.Item = new ListViewItem(customer.Name);
        args.Item.SubItems.Add(customer.Phone);
        args.Item.SubItems.Add(customer.Address);
    };
}

在这个代码中,我们创建了一个 List<Customer> 对象,并添加了几个客户信息。然后,我们将 View 属性设置为 Details,并将 VirtualListSize 属性设置为数据源的大小。我们使用 RetrieveVirtualItem 事件来提供数据。在这个事件中,我们使用 ListViewItem 和 SubItems 属性来向 ListView 控件中填充每行的数据。使用虚拟列表改进了数据量较大时的渲染速度。

虚拟模式

当我们需要显示大量数据时,使用虚拟模式可以显著提高 ListView 控件的性能。在虚拟模式下,ListView 控件只在需要显示时才从数据源中检索数据。以下是使用虚拟模式实现的示例代码:

private void Form1_Load(object sender, EventArgs e)
{
    // 创建数据源
    var customers = new List<Customer>();
    for (int i = 1; i <= 100000; i++)
    {
        customers.Add(new Customer() { Name = $"客户{i}", Phone = $"Phone {i}", Address = $"Address {i}" });
    }
    // 设置列表视图的样式和虚拟模式
    listView1.View = View.Details;
    listView1.VirtualMode = true;
    listView1.VirtualListSize = customers.Count;
    // 为列添加数据
    listView1.Columns.Add("姓名");
    listView1.Columns.Add("电话");
    listView1.Columns.Add("地址");
    listView1.RetrieveVirtualItem += (s, args) =>
    {
        var customer = customers[args.ItemIndex];
        var item = new ListViewItem(customer.Name);
        item.SubItems.Add(customer.Phone);
        item.SubItems.Add(customer.Address);
        args.Item = item;
    };
}

在这个代码中,我们创建了一个包含 100,000 条客户信息的数据源,并将 VirtualMode 属性设置为 true。然后,我们将 View 属性设置为 Details,并为每列添加的标题。在 RetrieveVirtualItem 事件中在 RetrieveVirtualItem 事件中,我们首先获取 itemIndex 对应的数据项,然后将其添加到 ListViewItem 对象中并通过 args.Item 返回该项,从而使它在控件中显示。注意,由于在虚拟模式下,只有控件需要显示的项才会从数据源中检索,因此该事件在控件滚动时会被多次调用,以获取相应项的数据。

需要注意的是,使用虚拟模式时,如果要添加行、删除行或者更新行等操作,我们需要在数据源中进行相应的修改,而不是直接在 Items 集合中进行相应的操作。

使用虚拟模式时,控件只会从数据源中检索需要显示的数据,而不会将整个数据源加载到内存中。因此,在大量数据的情况下,虚拟模式可以有效节省内存和提高控件性能。

以上是一些常见的 ListView 控件的用法和示例代码。当然,ListView 控件的功能远不止于此,还提供了许多其他的属性和事件,如单元格编辑、排序、分组、满屏显示等,您可以根据自己的需求自由选择和使用。

到此这篇关于一文掌握C# ListView 的用法的文章就介绍到这了,更多相关C# ListView 用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#多线程学习之(二)操纵一个线程的方法

    C#多线程学习之(二)操纵一个线程的方法

    这篇文章主要介绍了C#多线程学习之操纵一个线程的方法,实例分析了C#中线程的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • c#的dllimport使用方法详解

    c#的dllimport使用方法详解

    DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息
    2014-01-01
  • C#传值方式实现不同程序窗体间通信实例

    C#传值方式实现不同程序窗体间通信实例

    Form2构造函数中接收一个string类型参数,即Form1中选中行的文本,将Form2的TextBox控件的Text设置为该string,即完成了Form1向Form2的传值
    2013-12-12
  • C#使用IronPython调用Python

    C#使用IronPython调用Python

    这篇文章主要给大家介绍了关于C#使用IronPython调用Python的相关资料, c#利用IronPython调用python的过程中总会遇到种种问题,这里给大家总结下,需要的朋友可以参考下
    2023-07-07
  • 通过C#实现自动售货机接口

    通过C#实现自动售货机接口

    这篇文章主要介绍了通过C#实现自动售货机接口,需要的朋友可以参考下
    2015-07-07
  • C# 设计模式系列教程-策略模式

    C# 设计模式系列教程-策略模式

    策略模式是一种定义一系列算法的方法,从概念上来看,所有算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
    2016-06-06
  • C#使用自定义算法对数组进行反转操作的方法

    C#使用自定义算法对数组进行反转操作的方法

    这篇文章主要介绍了C#使用自定义算法对数组进行反转操作的方法,涉及C#针对数组操作的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C# WebApi Get请求方式传递实体参数的方法示例

    C# WebApi Get请求方式传递实体参数的方法示例

    这篇文章主要给大家介绍了关于C# WebApi Get请求方式传递实体参数的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • C#隐式运行CMD命令(隐藏命令窗口)

    C#隐式运行CMD命令(隐藏命令窗口)

    这篇文章主要介绍了C#隐式运行CMD命令(隐藏命令窗口),本文实现在winform窗口中运行CMD命令,需要的朋友可以参考下
    2015-06-06
  • C# 鼠标穿透窗体功能的实现方法

    C# 鼠标穿透窗体功能的实现方法

    通过以下代码,在窗体启动后调用方法SetPenetrate() 即可实现窗体的穿透功能,有需要的朋友可以参考一下
    2013-10-10

最新评论