C# 如何将对象的引用附加到ListView项?

C# 如何将对象的引用附加到ListView项?,c#,winforms,listview,C#,Winforms,Listview,我目前正在构建一个Windows窗体应用程序,以列出SQL数据库中的所有客户端。查询完所有客户机后,我将它们显示在列表视图中,允许用户单击其中一个客户机以获取更多信息。如何将对“客户端”对象的引用附加到listview中的项,以便在单击时恢复此特定对象 我曾尝试使用listView的索引,唯一的问题是我有一个过滤函数(搜索),在使用时会扰乱客户端的顺序 public class Client { public string _name; public in

我目前正在构建一个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;
            }
    }
公共类客户端
{
公共字符串\u名称;
公共国际标识;
公共客户端(字符串名称,int-id)
{
_名称=名称;
_id=id;
}
}
公共表格1()
{
公众客户[10]名;
对于(int i=0;i<10;i++)
{
Client[i]=新客户端(i.ToString(),i);
}
初始化组件();
foreach(客户端中的客户端)
{
ListViewItem项目=新的ListViewItem(客户端名称);
item.Tag=客户端;
ClientListView.Items.Add(项目);
}
}
私有void客户端列表视图\u SelectedIndexChanged(对象、事件参数)
{
if(clientListView.SelectedItems.Count==1)
{
var item=clientListView.SelectedItems[0];
客户端=(客户端)item.Tag;
}
}
此解决方案仅在选择项时创建新的客户端对象,是否无法指向客户端数组中包含的原始对象?可能通过引用传递,但它似乎不起作用,可能标记不是一个好的解决方案…

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

Client client = new Client();
btn = new Button();
btn.Tag = client;
然后,在另一种方法中,您可以使用标记

Client oldClient = btn.Tag as Client;
当然,您可以使用
(Client)btn.Tag
,但对我来说
btn.Tag作为客户端
更易于使用,也更容易在其他人的代码上看到


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

ListViewItem
有一个
标记
属性,它是对象。代码和文本不匹配。要么您不理解代码的功能,要么您复制了错误的代码?您认为
Client-Client=(Client)item.Tag
正在做,为什么它不是您想要的(“指向客户端数组中包含的原始对象”)?如果您正在处理数据库中的数据,那么一个
DatagrtView
和几行实现数据绑定的代码将比ListView要简单得多,而且所有内容都不会转换为文本。谢谢@nvoigt,我认为使用Client=(Client)item.Tag;将创建一个新对象,但似乎不是。