在 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()];
}
我有一个 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()];
}