在 ListView 中存储隐藏值(id)

Store hidden value (id) in ListView

我有一个 ListView,我在其中显示对象(人)及其相关属性的列表,这些属性是:姓名(字符串)、年龄(整数)。 但是这个对象也有一个 id 属性,用来区分它们。

问题是,存储 id 值 的'correct' 方法是什么,以便在我单击表示对象的项目时检索它?

为此,我使用了一个隐藏列(列宽 = 0),但我认为这不是一个好方法。

foreach (var person in col.listPersons )
{
    ListViewItem lIt = new ListViewItem(person.id); //Column with width = 0
    lIt.SubItems.Add(person.name);
    lIt.SubItems.Add(person.age);
    lPer.Items.Add(lIt) //Add the item to ListView
}

添加额外数据属性的一种简单方法是使用 Tag 属性。您可以分配一个具有多个属性的 class 对象或一个简单的标量值,例如您的 ID。标签用途广泛,在许多控件上很常见 属性。

我们的人的定义。

public class Person
{
    public long id { get; set; }
    public string name { get; set; }
    public int age { get; set; }
}

示例 1:将 id 分配给 ListViewItem 标记 属性。

foreach (var person in col.listPersons)
{
    ListViewItem lIt = new ListViewItem();
    lIt.Tag = person.id;
    lIt.SubItems.Add(person.name);
    lIt.SubItems.Add(person.age.ToString());
    lPer.Items.Add(lIt); // Add the item to ListView
}

然后您可以轻松地再次取回 id 值:

ListViewItem lit = sender as ListViewItem;
person.id = (long)lit.Tag;

示例 2:将整个人对象分配给 ListViewItem 标签 属性。

foreach (var person in col.listPersons)
{
    ListViewItem lIt = new ListViewItem();
    lIt.Tag = person;
    lIt.SubItems.Add(person.name);
    lIt.SubItems.Add(person.age.ToString());
    lPer.Items.Add(lIt); // Add the item to ListView
}

同样简单,再次取回人物对象:

ListViewItem lit = sender as ListViewItem;
person = (Person)lit.Tag;

示例 3:另一种常见的方法是使用 ListViewItem.Name 属性。该名称被视为 ListView 中的键。然后,您可以使用此键值传递给 ListView.Items.IndexOfKey() 或 ListView.Items["key"],以便在 ListView 中搜索特定项目。名称是一个字符串,因此不如标签灵活,但这可能更适合您的用例。

foreach (var person in col.listPersons)
{
    ListViewItem lIt = new ListViewItem();
    lIt.Name = person.id; // Treat the Name as a Key
    lIt.SubItems.Add(person.name);
    lIt.SubItems.Add(person.age);
    lPer.Items.Add(lIt); // Add the item to ListView

    // Retrieve the person back from the ListViewItemCollection by index.
    var personIndex = lPer.Items.IndexOfKey(person.id.ToString());
    var lItA = lPer.Items[personIndex];

    // Retrieve the person back from the ListViewItemCollection by key.
    var lItB = lPer.Items[person.id.ToString()];
}