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
控件的功能远不止于此,还提供了许多其他的属性和事件,如单元格编辑、排序、分组、满屏显示等,您可以根据自己的需求自由选择和使用。