C# 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();
    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 对象,并添加了几个客户信息。然后,我们将 View 属性设置为 Details,并将 VirtualListSize 属性设置为数据源的大小。我们使用 RetrieveVirtualItem 事件来提供数据。在这个事件中,我们使用 ListViewItem 和 SubItems 属性来向 ListView 控件中填充每行的数据。使用虚拟列表改进了数据量较大时的渲染速度。

虚拟模式

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

private void Form1_Load(object sender, EventArgs e)
{
    // 创建数据源
    var customers = new List();
    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 控件的功能远不止于此,还提供了许多其他的属性和事件,如单元格编辑、排序、分组、满屏显示等,您可以根据自己的需求自由选择和使用。

你可能感兴趣的:(.net,c#,开发语言,visualstudio,.net)