首页 > 解决方案 > 如何将对象的引用附加到 ListView 项?

问题描述

我目前正在构建一个 Windows 窗体应用程序来列出 SQL 数据库中的所有客户端。查询完所有客户后,我将它们显示在 ListView 中,允许用户单击其中一个客户以获取更多信息。如何将我的“客户”对象的引用附加到列表视图中的项目,以便在单击时恢复此特定对象?

我尝试使用 listView 的索引,唯一的问题是我有一个过滤功能(搜索),使用时会混淆客户端的顺序。

public class Client
    {
        public string _name;
        public int _id;

        public Client(string name, int id)
        {
            _name = name;
            _id = id;
        }
    }

public Form1()
    {
        public Client[10] clients;
        for (int i = 0; i < 10; i++)
        {
            Client[i] = new Client(i.ToString(), i);
        }

        InitializeComponent();

        foreach (Client client in clients)
        {
            ListViewItem item = new ListViewItem(client._name);
            item.Tag = client;
            ClientListView.Items.Add(item);
        }
    }

private void ClientListView_SelectedIndexChanged(object s, EventArgs e)
    {
            if (clientListView.SelectedItems.Count == 1)
            {
                var item = clientListView.SelectedItems[0];
                Client client = (Client)item.Tag;
            }
    }

此解决方案仅在选择项目时创建一个新的 Client 对象,有没有办法指向包含在 clients 数组中的原始对象?也许通过引用传递,但它似乎不起作用,也许标签不是一个好的解决方案......

标签: c#winformslistview

解决方案


每个 winforms 控件 (System.Windows.Forms.Control) 都有一个 Tag 变量,它是一个对象 (System.Object)。这意味着您可以对标签进行任何引用。例如:

Client client = new Client();
btn = new Button();
btn.Tag = client;

然后,在另一种方法中,您可以使用标签。

Client oldClient = btn.Tag as Client;

当然你可以使用(Client)btn.Tag,但对我btn.Tag as Client来说更容易使用,并且可以查看其他人的代码。

PS:它不会在代码开始时创建一个与客户端相同数据的新客户端。它保存的是引用(对象在应用程序内存中的位置),而不是数据。


推荐阅读