【问题标题】:Store hidden value (id) in ListView在 ListView 中存储隐藏值(id)
【发布时间】:2016-06-11 22:37:10
【问题描述】:

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

问题是,存储 id 值的“正确”方式是什么,当我单击代表对象的项目时检索它?

为此,我使用了隐藏列(列宽 = 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
}

【问题讨论】:

  • “正确的方法”是使用 DataGridView 以便所有内容都不会转换为字符串(或使用标签装箱为对象),日期将保持日期,整数将保持整数等等跨度>

标签: c# listview hidden


【解决方案1】:

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

我们的人定义。

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

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

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:将整个 person 对象分配给 ListViewItem Tag 属性。

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
}

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

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

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

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()];
}

【讨论】:

  • 这正是我所需要的。 PD:布恩尼克 :)
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
相关资源
最近更新 更多